429.md 9.5 KB
Newer Older
Lab机器人's avatar
readme  
Lab机器人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
# Working with the bundled Consul service

> 原文:[https://docs.gitlab.com/ee/administration/high_availability/consul.html](https://docs.gitlab.com/ee/administration/high_availability/consul.html)

*   [Prerequisites](#prerequisites)
*   [Configuring the Consul nodes](#configuring-the-consul-nodes)
    *   [Consul checkpoint](#consul-checkpoint)
*   [Operations](#operations)
    *   [Checking cluster membership](#checking-cluster-membership)
    *   [Restarting the server cluster](#restarting-the-server-cluster)
*   [Upgrades for bundled Consul](#upgrades-for-bundled-consul)
*   [Troubleshooting](#troubleshooting)
    *   [Consul server agents unable to communicate](#consul-server-agents-unable-to-communicate)
    *   [Consul agents do not start - Multiple private IPs](#consul-agents-do-not-start---multiple-private-ips)
    *   [Outage recovery](#outage-recovery)
        *   [Recreate from scratch](#recreate-from-scratch)
        *   [Recover a failed cluster](#recover-a-failed-cluster)

# Working with the bundled Consul service[](#working-with-the-bundled-consul-service-premium-only "Permalink")

作为其高可用性堆栈的一部分,GitLab Premium 包含可通过`/etc/gitlab/gitlab.rb`管理的捆绑版本的[Consul](https://www.consul.io/) . Consul 是服务网络解决方案. 对于[GitLab Architecture](../../development/architecture.html) ,支持 Consul 利用来配置:

1.  [Monitoring in Scaled and Highly Available environments](monitoring_node.html)
2.  [PostgreSQL High Availability with Omnibus](../postgresql/replication_and_failover.html)

Consul 群集由多个服务器代理以及在其他需要与 Consul 群集通信的节点上运行的客户端代理组成.

## Prerequisites[](#prerequisites "Permalink")

首先,请确保**在每个节点上** [下载/安装](https://about.gitlab.com/install/) Omnibus GitLab.

选择一种安装方法,然后确保完成以下步骤:

1.  安装和配置必要的依赖项.
2.  添加 GitLab 软件包存储库并安装软件包.

安装 GitLab 软件包时,请勿提供`EXTERNAL_URL`值.

## Configuring the Consul nodes[](#configuring-the-consul-nodes "Permalink")

在每个 Consul 节点上执行以下操作:

1.  在执行下一步之前,请确保为[`CONSUL_SERVER_NODES`](../postgresql/replication_and_failover.html#consul-information)收集[`CONSUL_SERVER_NODES`](../postgresql/replication_and_failover.html#consul-information) ,它们是 Consul 服务器节点的 IP 地址或 DNS 记录.

2.  编辑`/etc/gitlab/gitlab.rb`替换`/etc/gitlab/gitlab.rb` `# START user configuration`部分中记录的值:

    ```
    # Disable all components except Consul
    roles ['consul_role']

    # START user configuration
    # Replace placeholders:
    #
    # Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z
    # with the addresses gathered for CONSUL_SERVER_NODES
    consul['configuration'] = {
      server: true,
      retry_join: %w(Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z)
    }

    # Disable auto migrations
    gitlab_rails['auto_migrate'] = false
    #
    # END user configuration 
    ```

    > `consul_role`在 GitLab 10.3 中引入

3.  [重新配置 GitLab,](../restart_gitlab.html#omnibus-gitlab-reconfigure)以使更改生效.

### Consul checkpoint[](#consul-checkpoint "Permalink")

在继续之前,请确保 Consul 配置正确. 运行以下命令以验证所有服务器节点都在通信:

```
/opt/gitlab/embedded/bin/consul members 
```

输出应类似于:

```
Node                 Address               Status  Type    Build  Protocol  DC
CONSUL_NODE_ONE      XXX.XXX.XXX.YYY:8301  alive   server  0.9.2  2         gitlab_consul
CONSUL_NODE_TWO      XXX.XXX.XXX.YYY:8301  alive   server  0.9.2  2         gitlab_consul
CONSUL_NODE_THREE    XXX.XXX.XXX.YYY:8301  alive   server  0.9.2  2         gitlab_consul 
```

如果任何一个节点都不`alive`或三个节点中的任何一个都不`alive` ,请在继续操作之前检查" [疑难解答"部分](#troubleshooting) .

## Operations[](#operations "Permalink")

### Checking cluster membership[](#checking-cluster-membership "Permalink")

要查看哪些节点是集群的一部分,请在集群中的任何成员上运行以下命令

```
$ /opt/gitlab/embedded/bin/consul members
Node            Address               Status  Type    Build  Protocol  DC
consul-b        XX.XX.X.Y:8301        alive   server  0.9.0  2         gitlab_consul
consul-c        XX.XX.X.Y:8301        alive   server  0.9.0  2         gitlab_consul
consul-c        XX.XX.X.Y:8301        alive   server  0.9.0  2         gitlab_consul
db-a            XX.XX.X.Y:8301        alive   client  0.9.0  2         gitlab_consul
db-b            XX.XX.X.Y:8301        alive   client  0.9.0  2         gitlab_consul 
```

Ideally all nodes will have a `Status` of `alive`.

### Restarting the server cluster[](#restarting-the-server-cluster "Permalink")

**注意:**本部分仅适用于服务器代理. 在需要时重新启动客户端代理是安全的.

如果有必要重新启动服务器群集,则以受控方式进行此操作很重要,以保持仲裁. 如果仲裁丢失,则需要遵循 Consul [中断恢复](#outage-recovery)过程来恢复群集.

为了安全起见,建议您一次仅重新启动一个服务器代理,以确保群集保持完整.

对于较大的群集,可以一次重新启动多个代理. 请参阅[领事共识文档,](https://www.consul.io/docs/internals/consensus.html#deployment-table)以了解可以容忍多少次失败. 这是它可以承受的同时重启的次数.

## Upgrades for bundled Consul[](#upgrades-for-bundled-consul "Permalink")

运行 GitLab 捆绑的 Consul 的节点应为:

*   升级 Omnibus GitLab 软件包之前,健康集群的成员.
*   一次升级一个节点.

**注意:**从任何 Consul 节点运行`curl http://127.0.0.1:8500/v1/health/state/critical` ,将识别群集中的现有运行状况问题. 如果群集运行状况良好,该命令将返回一个空数组.

领事群集使用筏协议进行通信. 如果当前领导者下线,则需要进行领导者选举. 必须存在一个领导者节点,以促进整个集群之间的同步. 如果同时有太多节点脱机,则由于[共识破裂](https://www.consul.io/docs/internals/consensus.html) ,群集将失去仲裁且不会选举领导者.

如果群集在升级后无法恢复,请参考[故障排除部分](#troubleshooting) . [中断恢复](#outage-recovery)可能特别有意义.

**注意:** GitLab 仅使用 Consul 来存储易于重新生成的瞬态数据. 如果捆绑包的 Consul 除了 GitLab 本身以外没有被其他进程使用,那么[从头开始重建集群](#recreate-from-scratch)就可以了.

## Troubleshooting[](#troubleshooting "Permalink")

### Consul server agents unable to communicate[](#consul-server-agents-unable-to-communicate "Permalink")

默认情况下,服务器代理将尝试[绑定](https://www.consul.io/docs/agent/options.html#_bind)到" 0.0.0.0",但是它们将通告节点上的第一个私有 IP 地址,以供其他代理与其通信. 如果其他节点无法与此地址上的节点通信,则群集将处于故障状态.

如果遇到此问题,您将在`gitlab-ctl tail consul`输出中看到类似以下的消息:

```
2017-09-25_19:53:39.90821     2017/09/25 19:53:39 [WARN] raft: no known peers, aborting election
2017-09-25_19:53:41.74356     2017/09/25 19:53:41 [ERR] agent: failed to sync remote state: No cluster leader 
```

要解决此问题:

1.  在每个其他节点都可以到达的节点上选择一个地址.
2.  更新您的`/etc/gitlab/gitlab.rb`

    ```
    consul['configuration'] = {
      ...
      bind_addr: 'IP ADDRESS'
    } 
    ```

3.  Run `gitlab-ctl reconfigure`

如果仍然看到错误,则可能必须[删除 Consul 数据库并](#recreate-from-scratch)在受影响的节点上[重新初始化](#recreate-from-scratch) .

### Consul agents do not start - Multiple private IPs[](#consul-agents-do-not-start---multiple-private-ips "Permalink")

如果一个节点具有多个专用 IP,则代理会混淆要播发哪个专用地址,然后在启动时立即退出.

如果遇到此问题,您将在`gitlab-ctl tail consul`输出中看到类似以下的消息:

```
2017-11-09_17:41:45.52876 ==> Starting Consul agent...
2017-11-09_17:41:45.53057 ==> Error creating agent: Failed to get advertise address: Multiple private IPs found. Please configure one. 
```

要解决此问题:

1.  在该节点上选择一个地址,所有其他节点都可以通过该地址到达该节点.
2.  更新您的`/etc/gitlab/gitlab.rb`

    ```
    consul['configuration'] = {
      ...
      bind_addr: 'IP ADDRESS'
    } 
    ```

3.  Run `gitlab-ctl reconfigure`

### Outage recovery[](#outage-recovery "Permalink")

如果您在群集中丢失了足够的服务器代理以破坏仲裁,则该群集将被视为失败,并且如果没有手动干预,它将无法运行.

#### Recreate from scratch[](#recreate-from-scratch "Permalink")

默认情况下,GitLab 不会在 Consul 群集中存储任何无法重新创建的内容. 删除 Consul 数据库并重新初始化

```
gitlab-ctl stop consul
rm -rf /var/opt/gitlab/consul/data
gitlab-ctl start consul 
```

此后,群集应开始备份,并且服务器代理重新加入. 之后不久,客户代理也应重新加入.

#### Recover a failed cluster[](#recover-a-failed-cluster "Permalink")

如果您已利用 Consul 来存储其他数据,并想还原发生故障的群集,请按照[Consul 指南](https://learn.hashicorp.com/consul/day-2-operations/outage)来恢复发生故障的群集.