关于 GitHub Enterprise Server 群集节点的替换
可以替换 GitHub Enterprise Server 群集中的功能节点,也可以替换意外发生故障的节点。
替换节点后,你的 GitHub Enterprise Server 实例 不会自动将作业分配到新节点。 可以强制让实例在各节点中实现作业均衡。 有关详细信息,请参阅“重新均衡群集工作负荷”。
Warning
为避免冲突,请勿重复使用群集中的节点曾使用过的主机名。
替换功能节点
可以替换群集中现有的功能节点。 例如,需要为虚拟机 (VM) 提供额外的 CPU、内存或存储资源时。
若要替换功能节点,请在新 VM 上安装 GitHub Enterprise Server 设备,配置 IP 地址,将新节点添加到群集配置文件,将群集初始化并应用配置,然后将替换掉的节点脱机。
Note
如果要替换主 MySQL 节点,请参阅“替换主 MySQL 节点”。
-
在替换节点上使用唯一主机名预配和安装 GitHub Enterprise Server。
-
使用管理 shell 或 DHCP,仅配置替换节点的 IP 地址。 不要配置任何其他设置。
-
若要添加新预配的替换节点,可在任何节点上修改
cluster.conf
文件以删除失败的节点并添加替换节点。 例如,修改后的cluster.conf
文件会将ghe-data-node-3
替换为新预配的节点ghe-replacement-data-node-3
:[cluster "ghe-replacement-data-node-3"] hostname = ghe-replacement-data-node-3 ipv4 = 192.168.0.7 # ipv6 = fd12:3456:789a:1::7 consul-datacenter = PRIMARY-DATACENTER git-server = true pages-server = true mysql-server = true elasticsearch-server = true redis-server = true memcache-server = true metrics-server = true storage-server = true
可以选择延迟新 MySQL 副本节点的数据库种子设定,从而能够更快地向流量开放设备。 有关详细信息,请参阅“延迟数据库种子设定”。
-
从含有经修改
cluster.conf
的节点的管理 shell 中,运行ghe-cluster-config-init
。 这将初始化集群中新增的节点。 -
从同一节点中运行
ghe-cluster-config-apply
。 这将验证配置文件、将其复制到集群中的每个节点以及根据修改的cluster.conf
文件配置每个节点。 -
若要将要替换的节点设为离线,请从群集的主 MySQL 节点运行以下命令。
ghe-remove-node NODE-HOSTNAME
此命令将从节点上运行的任何数据服务中撤出数据,在配置中将该节点标记为离线,并停止路由到该节点的流量。 有关详细信息,请参阅“命令行实用程序”。
在紧急情况下替换节点
可以替换群集中发生故障的节点。 例如,发生了可能会影响节点可用性的软件或硬件问题时。
Note
如果要替换主 MySQL 节点,请参阅“替换主 MySQL 节点”。
若要在紧急情况下替换节点,请将失败的节点设为离线,将替换节点添加到群集,然后运行命令以删除对已删除节点上数据服务的引用。
-
若要从群集中删除遇到问题的节点,请从群集的主 MySQL 节点运行以下命令。 将 NODE-HOSTNAME 替换为正在设为离线的节点的主机名。
ghe-remove-node --no-evacuate NODE-HOSTNAME
此命令将在配置中将节点标记为离线,并停止将流量路由到该节点。 现在可以在
no-evacuate
模式下运行此命令,因为在此过程的后面,你将运行命令来指示节点上的数据服务将任何副本复制到群集中的其他可用节点上。 有关详细信息,请参阅“命令行实用程序”。 -
将替换节点添加到群集。
- 在替换节点上使用唯一主机名预配和安装 GitHub Enterprise Server。
-
使用管理 shell 或 DHCP,仅配置替换节点的 IP 地址。 不要配置任何其他设置。
-
若要添加新预配的替换节点,可在任何节点上修改
cluster.conf
文件以添加替换节点。 例如,修改后的cluster.conf
文件会将添加新预配的节点ghe-replacement-data-node-3
:[cluster "ghe-replacement-data-node-3"] hostname = ghe-replacement-data-node-3 ipv4 = 192.168.0.7 # ipv6 = fd12:3456:789a:1::7 git-server = true pages-server = true mysql-server = true elasticsearch-server = true redis-server = true memcache-server = true metrics-server = true storage-server = true
-
从含有经修改
cluster.conf
的节点的管理 shell 中,运行ghe-cluster-config-init
。 这将初始化集群中新增的节点。
-
-
从同一节点中运行
ghe-cluster-config-apply
。 这将验证配置文件、将其复制到集群中的每个节点以及根据修改的cluster.conf
文件配置每个节点。 -
删除对已移除节点上数据服务的引用。
-
查找已移除的节点的 UUID。 若要查找 UUID,请运行以下命令,将
HOSTNAME
替换为节点的主机名。 你将在下一个步骤中使用此 UUID。ghe-config cluster.HOSTNAME.uuid
-
若要删除对数据服务的引用,请运行以下命令。 将
UUID
替换为节点的 UUID。这些命令将向每个服务指示该节点已被永久删除。 这些服务将在群集内的可用节点上重新创建节点内包含的任何副本。
Note
在跨副本重新平衡数据时,这些命令可能会导致服务器负载增加。
对于
git-server
服务(用于存储库数据):ghe-spokesctl server destroy git-server-UUID
对于
pages-server
服务(用于 GitHub Pages 站点生成):ghe-dpages remove pages-server-UUID
对于
storage-server
服务(用于 Git LFS 数据、虚拟形象图像、文件附件和发布存档):ghe-storage destroy-host storage-server-UUID --force
-
-
(可选)删除
cluster.conf
文件中已移除节点的项。 这样做可以使cluster.conf
文件井井有条,并在以后的运行中节省时间config-apply
。-
若要从文件中删除该条目,请运行以下命令,并将
HOSTNAME
替换为已移除节点的主机名。ghe-config --remove-section "cluster.HOSTNAME"
-
若要将配置复制到群集中的其他节点,请从修改
cluster.conf
的节点的管理 shell 运行ghe-cluster-config-apply
。
-
替换主 MySQL 节点
若要提供数据库服务,群集需要主 MySQL 节点和至少一个副本 MySQL 节点。 有关详细信息,请参阅“关于集群节点”。
如果想要为主 MySQL 节点的虚拟机提供更多资源,或者如果该节点故障,可以更换该节点。 若要最大程度地减少停机时间,请将新节点添加到群集,复制 MySQL 数据,然后升级该节点。 升级期间需要停机一段时间。
-
在替换节点上使用唯一主机名预配和安装 GitHub Enterprise Server。
-
使用管理 shell 或 DHCP,仅配置替换节点的 IP 地址。 不要配置任何其他设置。
-
若要连接到 你的 GitHub Enterprise Server 实例,请通过 SSH 连接到群集的任何节点。 在工作站中运行以下命令。 将 HOSTNAME 替换为节点的主机名。 有关详细信息,请参阅“访问管理 shell (SSH)”。
Shell ssh -p 122 admin@HOSTNAME
ssh -p 122 admin@HOSTNAME
-
在文本编辑器中,打开位于
/data/user/common/cluster.conf
的群集配置文件。 例如,您可以使用 Vim。 在编辑文件之前创建cluster.conf
文件的备份。Shell sudo vim /data/user/common/cluster.conf
sudo vim /data/user/common/cluster.conf
-
群集配置文件在
[cluster "HOSTNAME"]
标题下列出每个节点。 为节点添加新标题,并输入配置的键值对,将占位符替换为实际值。- 确保包含了
mysql-server = true
键值对。 - 以下部分是一个示例,且节点的配置可能有所不同。
... [cluster "HOSTNAME"] hostname = HOSTNAME ipv4 = IPV4-ADDRESS # ipv6 = IPV6-ADDRESS consul-datacenter = PRIMARY-DATACENTER datacenter = DATACENTER mysql-server = true redis-server = true ... ...
- 确保包含了
-
从含有经修改
cluster.conf
的节点的管理 shell 中,运行ghe-cluster-config-init
。 这将初始化集群中新增的节点。 -
从修改
cluster.conf
的节点的管理 shell 中,运行ghe-cluster-config-apply
。 新添加的节点将成为副本 MySQL 节点,配置的任何其他服务都将在那里运行。 -
等待 MySQL 复制完成。 若要从群集中的任何节点监视 MySQL 复制,请运行
ghe-cluster-status -v
。将节点添加到群集后不久,可能会在复制恢复时看到复制状态错误。 复制可能需要几个小时,具体取决于实例的负载、数据库数据量以及实例上次生成数据库种子的时间。
-
在计划性维护时段内,启用维护模式。 有关详细信息,请参阅“启用和排定维护模式”。
-
通过运行
ghe-cluster-status -v
,确保 MySQL 复制从群集中的任何节点完成。Warning
如果不等待 MySQL 复制完成,则实例上可能会丢失数据。
-
若要将当前 MySQL 主节点设置为只读模式,请在实例的节点运行以下命令。
Shell echo "SET GLOBAL super_read_only = 1;" | sudo mysql
echo "SET GLOBAL super_read_only = 1;" | sudo mysql
-
等待直至在主要和副本 MySQL 节点上设置的全局事务标识符 (GTID) 相同。 若要检查 GTID,请在任何实例的节点运行以下命令。
Shell ghe-cluster-each -r mysql -- 'echo "SELECT @@global.gtid_executed;" | sudo mysql'
ghe-cluster-each -r mysql -- 'echo "SELECT @@global.gtid_executed;" | sudo mysql'
-
当主节点和副本 MySQL 节点上的 GTID 匹配后,通过在文本编辑器中的
/data/user/common/cluster.conf
处打开群集配置文件来更新群集配置。- 在编辑文件之前创建
cluster.conf
文件的备份。 - 在顶级
[cluster]
部分,删除从mysql-master
键值对替换的节点主机名,然后改为分配新节点。 如果新节点也是主 Redis 节点,请调整redis-master
键值对。
[cluster] mysql-master = NEW-NODE-HOSTNAME redis-master = NEW-NODE-HOSTNAME primary-datacenter = primary ...
- 在编辑文件之前创建
-
从修改
cluster.conf
的节点的管理 shell 中,运行ghe-cluster-config-apply
。 这会重新配置群集,使新添加的节点成为主 MySQL 节点,而原始主 MySQL 节点变为副本 MySQL 节点。 -
通过运行
ghe-cluster-status -v
从群集中的任何节点检查 MySQL 复制的状态。 -
如果 MySQL 复制已完成,请从群集中的任何节点禁用维护模式。 有关详细信息,请参阅“启用和排定维护模式”。