关于集群的高可用性复制
注意:GitHub Enterprise Server 版本 3.9.1 及更高版本提供高可用性复制。****
可以通过配置 GitHub Enterprise Server 的群集部署来防止数据中心或云区域发生中断,从而实现高可用性。 在高可用性配置中,一组相同的副本节点与活动群集中的节点同步。 如果硬件或软件故障影响具有活动群集的数据中心,您可以手动故障转移到副本节点,继续处理用户请求,以尽可能减少中断的影响。
在高可用性配置中,托管数据服务的节点会定期与副本群集同步。 被动节点在等待状态下运行,不适用于应用程序或处理用户请求。
我们建议配置高可用性,作为 GitHub Enterprise Server 全面群集的一部分。 我们还建议进行定期备份。 有关详细信息,请参阅“在实例上配置备份”。
先决条件
硬件和软件
对于活动群集中的每个现有节点,都需要预配第二个具有相同硬件资源的虚拟机。 例如,如果你的群集有 13 个节点,并且每个节点有 12 个 vCP、96 GB 的 RAM 和 750 GB 的附加存储,则必须预配 13 个新虚拟机,每个虚拟机具有 12 个 vCPU、96 GB 的 RAM 和 750 GB 的附加存储。
在每个新虚拟机上,安装活动群集的节点上运行的相同版本 GitHub Enterprise Server。 您不需要上传许可证或执行任何其他配置。 有关详细信息,请参阅“设置 GitHub Enterprise Server 实例”。
注意: 你打算用于高可用性副本的节点应该是独立的 GitHub Enterprise Server 实例。 不要将被动副本初始化为第二个群集。
网络
您必须为预配的每个新节点分配一个静态 IP 地址,并且必须配置负载均衡器以接受连接,并将其引导到群集前端层中的节点。
主节点和副本节点之间的延迟不得超过 70 毫秒。 我们不建议在两个节点之间配置防火墙。 有关副本群集中节点之间网络连接的详细信息,请参阅“群集网络配置”。
为群集创建高可用性副本
若要为群集创建高可用性副本,必须完成以下任务。 还可以查看示例配置。
1.将主动节点分配到主数据中心
在为副本节点定义辅助数据中心之前,请确保将主动节点分配给主数据中心。
-
SSH 到集群中的任何节点。 有关详细信息,请参阅“访问管理 shell (SSH)”。
-
在文本编辑器中,打开位于
/data/user/common/cluster.conf
的群集配置文件。 例如,您可以使用 Vim。 在编辑文件之前创建cluster.conf
文件的备份。Shell sudo vim /data/user/common/cluster.conf
sudo vim /data/user/common/cluster.conf
-
记下群集主数据中心的名称。 群集配置文件顶部的
[cluster]
部分使用primary-datacenter
键值对定义主数据中心的名称。[cluster] mysql-master = HOSTNAME redis-master = HOSTNAME primary-datacenter = primary
- (可选)通过编辑
primary-datacenter
的值,将主数据中心的名称更改为更具描述性或更准确的值。
- (可选)通过编辑
-
群集配置文件在
[cluster "HOSTNAME"]
标题下列出每个节点。 在每个节点标题下,添加新的键值对,以将节点分配给数据中心。 使用上述第 3 步中primary-datacenter
所用的值。 例如,如果要使用默认名称 (default
),请将以下键值对添加到每个节点的部分。datacenter = primary
完成后,群集配置文件中每个节点的部分应如下所示。 键值对的顺序无关紧要。
[cluster "HOSTNAME"] datacenter = default hostname = HOSTNAME ipv4 = IP-ADDRESS ... ...
注意: 如果在步骤 3 中更改了主数据中心的名称,请在每个节点的部分找到
consul-datacenter
键值对,然后将值更改为重命名的主数据中心。 例如,如果已将主数据中心命名为primary
,请为每个节点使用以下键值对。consul-datacenter = primary
-
应用新配置。 此命令可能需要一些时间才能完成,因此我们建议在终端多路复用器(例如
screen
或tmux
)中运行该命令。ghe-cluster-config-apply
-
配置运行完成后,GitHub Enterprise Server 将显示以下消息。
Finished cluster configuration
在 GitHub Enterprise Server 返回提示符,您已完成将节点分配给群集的主数据中心。
2.将副本节点添加到群集配置文件
若要配置高可用性,必须为群集中的每个主动节点定义相应的副本节点。 若要创建定义主动节点和副本节点的新群集配置,需要完成以下任务。
- 创建主动群集配置文件的副本。
- 编辑副本以定义与主动节点对应的副本节点,添加预配的新虚拟机的 IP 地址。
- 将群集配置的修改副本合并回主动配置。
- 应用新配置以开始复制。
有关示例配置,请参阅“查看示例配置”。
-
对于群集中的每个节点,预配规范相同的匹配虚拟机,运行相同版本的 GitHub Enterprise Server。 记下每个新群集节点的 IPv4 地址和主机名。 有关详细信息,请参阅“先决条件”。
注意: 如果在故障转移后重新配置高可用性,可以改用主数据中心的旧节点。
-
SSH 到集群中的任何节点。 有关详细信息,请参阅“访问管理 shell (SSH)”。
-
备份现有群集配置。
cp /data/user/common/cluster.conf ~/$(date +%Y-%m-%d)-cluster.conf.backup
-
在临时位置创建现有群集配置文件的副本,例如
/home/admin/cluster-replica.conf
。grep -Ev "(?:|ipv|uuid)" /data/user/common/cluster.conf > ~/cluster-replica.conf
-
从上一步中复制的临时群集配置文件删除
[cluster]
部分。git config -f ~/cluster-replica.conf --remove-section cluster
-
确定在其中预配了副本节点的辅助数据中心的名称,然后使用新的数据中心名称更新临时群集配置文件。 将
SECONDARY
替换为所选名称。sed -i 's/datacenter = default/datacenter = SECONDARY/g' ~/cluster-replica.conf
-
确定副本节点主机名的模式。
警告:副本节点的主机名必须是唯一的,并且与对应主动节点的主机名不同。
-
在文本编辑器中打开步骤 3 中的临时群集配置文件。 例如,您可以使用 Vim。
sudo vim ~/cluster-replica.conf
-
在临时群集配置文件中的每个部分,更新节点的配置。 群集配置文件在
[cluster "HOSTNAME"]
标题下列出每个节点。- 根据上面步骤 7 中选择的模式,将部分标题中引用的主机名和部分中
hostname
的值更改为副本节点的主机名。 - 新增一个名为
ipv4
的密钥,并将值设置为副本节点的静态 IPv4 地址。 - 添加新的键值对
replica = enabled
。
[cluster "NEW REPLICA NODE HOSTNAME"] ... hostname = NEW REPLICA NODE HOSTNAME ipv4 = NEW REPLICA NODE IPV4 ADDRESS replica = enabled ... ...
- 根据上面步骤 7 中选择的模式,将部分标题中引用的主机名和部分中
-
将步骤 4 中创建的临时群集配置文件的内容附加到活动的配置文件。
cat ~/cluster-replica.conf >> /data/user/common/cluster.conf
-
在辅助数据中心中指定主 MySQL 和 Redis 节点。 将
REPLICA MYSQL PRIMARY HOSTNAME
和REPLICA REDIS PRIMARY HOSTNAME
替换为预配的副本节点的主机名,以匹配现有的 MySQL 和 Redis 主节点。git config -f /data/user/common/cluster.conf cluster.mysql-master-replica REPLICA-MYSQL-PRIMARY-HOSTNAME git config -f /data/user/common/cluster.conf cluster.redis-master-replica REPLICA-REDIS-PRIMARY-HOSTNAME
警告:在继续之前请检查群集配置文件。
- 在顶级
[cluster]
部分中,确保mysql-master-replica
和redis-master-replica
的值是辅助数据中心中副本节点的正确主机名,这些副本节点将在故障转移后用作 MySQL 和 Redis 主节点。 - 在名为
[cluster "ACTIVE NODE HOSTNAME"]
的主动节点的每个部分中,仔细检查以下键值对。datacenter
应与顶级[cluster]
部分中primary-datacenter
的值匹配。consul-datacenter
应与datacenter
的值匹配,该值应与顶级[cluster]
部分中primary-datacenter
的值相同。
- 确保每个主动节点的配置与一个包含相同角色的副本节点的配置具有一个相对应的部分。 在副本节点的每个部分中,仔细检查每个键值对。
datacenter
应与其他所有副本节点匹配。consul-datacenter
应与其他所有副本节点匹配。hostname
应与部分标题中的主机名匹配。ipv4
应与节点的唯一静态 IPv4 地址匹配。replica
应配置为enabled
。
- 利用机会删除已经不再使用的离线节点的部分。
要查看示例配置,请参阅“查看示例配置”。
- 在顶级
-
初始化新群集配置。 此命令可能需要一些时间才能完成,因此我们建议在终端多路复用器(例如
screen
或tmux
)中运行该命令。ghe-cluster-config-init
-
初始化完成后,GitHub Enterprise Server 将显示以下消息。
Finished cluster initialization
-
应用新配置。 此命令可能需要一些时间才能完成,因此我们建议在终端多路复用器(例如
screen
或tmux
)中运行该命令。ghe-cluster-config-apply
-
配置运行完成后,请验证群集复制是否已正确设置并正常运行。
ghe-cluster-repl-status
-
配置运行完成后,GitHub Enterprise Server 将显示以下消息。
Finished cluster configuration
-
配置负载均衡器,故障转移到副本节点后,该均衡器将接受来自用户的连接。 有关详细信息,请参阅“群集网络配置”。
您已完成为群集中的节点配置高可用性副本。 每个主动节点开始将配置和数据复制到其对应的副本节点,并且您可以在发生故障时将流量直接引导至辅助数据中心的负载均衡器。 有关故障转移的详细信息,请参阅“发起到副本群集的故障转移”。
3.查看示例配置
顶级 [cluster]
配置应如下例所示。
[cluster]
mysql-master = HOSTNAME-OF-ACTIVE-MYSQL-MASTER
redis-master = HOSTNAME-OF-ACTIVE-REDIS-MASTER
primary-datacenter = PRIMARY-DATACENTER-NAME
mysql-master-replica = HOSTNAME-OF-REPLICA-MYSQL-MASTER
redis-master-replica = HOSTNAME-OF-REPLICA-REDIS-MASTER
mysql-auto-failover = false
...
群集存储层中主动节点的配置应如下所示。
...
[cluster "UNIQUE ACTIVE NODE HOSTNAME"]
datacenter = default
hostname = UNIQUE-ACTIVE-NODE-HOSTNAME
ipv4 = IPV4-ADDRESS
consul-datacenter = default
consul-server = true
git-server = true
pages-server = true
mysql-server = true
elasticsearch-server = true
redis-server = true
memcache-server = true
metrics-server = true
storage-server = true
uuid = UUID SET AUTOMATICALLY
...
存储层中对应的副本节点的配置应如下所示。
- 与相应主动节点的重要区别以粗体显示。
- GitHub Enterprise Server 将自动为
uuid
分配值,因此不应为要初始化的副本节点定义值。 *-server
密钥定义的服务器角色与相应的主动节点匹配。
...
[cluster "UNIQUE REPLICA NODE HOSTNAME"]
replica = enabled
ipv4 = IPV4 ADDRESS OF NEW VM WITH IDENTICAL RESOURCES
datacenter = SECONDARY DATACENTER NAME
hostname = UNIQUE REPLICA NODE HOSTNAME
consul-datacenter = SECONDARY DATACENTER NAME
consul-server = true
git-server = true
pages-server = true
mysql-server = true
elasticsearch-server = true
redis-server = true
memcache-server = true
metrics-server = true
storage-server = true
uuid = DO NOT DEFINE
...
监控主动与副本群集节点之间的复制
群集中主动节点与副本节点之间的初始复制需要时间。 时间量取决于要复制的数据量和 GitHub Enterprise Server 的活动水平。
您可以通过 GitHub Enterprise Server 系统管理 shell 使用命令行工具监控群集中任何节点的进度。 有关管理 shell 的详细信息,请参阅“访问管理 shell (SSH)”。
若要监视所有服务的复制,请使用以下命令。
ghe-cluster-repl-status
你可以使用 ghe-cluster-status
查看群集的整体运行状况。 有关详细信息,请参阅“命令行实用程序”。
故障转移后重新配置高可用性复制
从群集的产动节点故障转移到群集的副本节点后,可以通过两种方式重新配置高可用性。 选择的方法将取决于故障转移的原因以及原始主动节点的状态。
- 为辅助数据中心中的每个新主动节点预配和配置一组新的副本节点。
- 使用原始主动节点作为新的副本节点。
重新配置高可用性的过程与高可用性的初始配置相同。 有关详细信息,请参阅“为群集创建高可用性副本”。
如果使用原始活动节点,在重新配置高可用性后,需要在节点上取消设置维护模式。 有关详细信息,请参阅“启用和排定维护模式”。
禁用群集的高可用性复制
可以使用 ghe-cluster-repl-teardown
实用工具停止复制到 GitHub Enterprise Server.
-
SSH 到集群中的任何节点。 有关详细信息,请参阅“访问管理 shell (SSH)”。
-
在文本编辑器中,打开位于
/data/user/common/cluster.conf
的群集配置文件。 例如,您可以使用 Vim。 在编辑文件之前创建cluster.conf
文件的备份。Shell sudo vim /data/user/common/cluster.conf
sudo vim /data/user/common/cluster.conf
-
在顶级
[cluster]
部分中,删除redis-master-replica
和mysql-master-replica
键值对。 -
删除副本节点的每个部分。 对于副本节点,
replica
配置为enabled
。 -
应用新配置。 此命令可能需要一些时间才能完成,因此我们建议在终端多路复用器(例如
screen
或tmux
)中运行该命令。ghe-cluster-config-apply
-
配置运行完成后,GitHub Enterprise Server 将显示以下消息。
Finished cluster configuration