GaussDB(分布式) 实例故障处理
本文分享自华为云社区《GaussDB(分布式)实例故障处理》,作者:subverter。
一、说明
GaussDB Kernel 实例出现故障时,可以按照本节的办法进行实例快速修复。
1、执行 gs_om -t status --detail 查看集群状态,cluster_state 为 Normal,balanced 为 No,请重置实例状态。
2、执行 gs_om -t status --detail 查看集群状态,cluster_state 为 Degraded,表示有实例异常,但是集群依然可以正常对外提供服务。此时,虽然不影响业务运行,但是主备实例切换将加重某些节点上的工作负载,时间久了,可能带来这些对应节点上的资源耗尽,进而影响业务运行。因此集群处于 Degraded 状态时,建议尽快定位,使集群恢复至 Normal 状态。GaussDB Kernel 提供了如下办法,协助用户在操作系统和硬件正常时的实例快速修复。
3、CN 实例异常,优先通过删除 CN 和增加 CN 进行实例恢复。
4、各类实例异常的通用办法——修改 HOSTNAME、IP 和端口号。
二、重置实例状态
1、操作场景
集群在运行过程中,如果发生了主机或某些实例故障,集群管理模块会自动将备实例提升为主实例继续提供服务;或是由于数据库集群管理人员手工进行过主备切换操作后,使当前集群各主机上运行的主实例(GTM,DN)数不均等,造成集群负载不均衡,即集群“balanced”状态为"No"。这种情况下可以通过集群管理命令将集群中的数据库实例恢复为初始配置的主备状态。
存在实例异常时,需要先将实例修复后,才能进行重置。
2、处理方法
1.以操作系统用户 omm 登录数据库集群任一主机。
2.查询并确认集群运行状态及“balanced”状态。
“cluster_state”为“Normal”表示集群运行正常。“balanced”状态为“No”表示集群实例发生过主备切换。
3.使用如下命令查看集群状态确认是哪些节点上的实例发生过主备切换。
例如下面示例中,node2 节点上的主 dn2 发生过主备切换。该 DN 原始为主 DN(“state”中的字母“P”代表其初始为 Primary DN),当前切换成了备 DN(“state ”状态变成了“Standby Normal”)。
4.使用如下命令将集群中发生切换的实例恢复为初始配置的主备状态。
300 为切换的等待时间,单位为 s。切换后集群的“balanced”状态变为“Yes”。
3、示例
查询当前发生过切换的实例。
若实例未发生过主备切换,则查询结果中会显示“no need to switchover xxx”。否则,则有实例发生过主备切换。例如,上例中通过查询发现有一组主备 DN 都发生过切换。将发生切换的实例恢复为初始配置的主备状态。
4、错误排查
如果重置实例状态失败,请根据日志文件中的日志信息排查错误。
如果指定的超时时间到达后,仍然有某些实例没有完成状态切换,可以根据提示,执行 3 查看切换实例的当前状态,然后设置更长的时间再次执行或者通过 log 查看切换失败的原因。重置操作的默认超时时间为 300s。
三、处理 CN 异常
集群部署多个 CN 同时对外提供服务,CN 的角色是对等的,即执行 DML 语句时连接到任何一个 CN 都可以得到一致的结果。而 DDL 语句需要在所有 CN 上都执行完成,以保持数据库对象定义一致。如果其中一个 CN 发生故障,整个集群将无法执行 DDL 语句,直到故障 CN 被修复或剔除。
如果只有 CN 异常,使用 gs_replace 工具可以快速将故障 CN 替换为正常 CN。具体请参见修复故障实例。
如果因网络无法连接、硬件故障造成操作系统无法登录等,短时间内无法恢复 CN,又希望集群尽快恢复 DDL 执行能力,可以先手动删除故障 CN。待 DDL 业务完成后,再通过增加 CN 功能将 CN 加回。
GaussDB Kernel 也提供了 CN 自动剔除功能,此功能默认开启,开启和关闭方式请参见自动剔除故障 CN。通过设置 coordinator_heartbeat_timeout 为具体的时间值,则 CN 故障超过此时间值后 GaussDB Kernel 将自动剔除故障 CN。
多 AZ 多集群部署结构下:
AZ 的拓扑结构应当保持相同(由运维人员保证),应当对所有集群进行同样的增删 CN 操作,成功后集群再开始同步操作。
CN 部署结构变化,可能将引起 Roach 做全量同步,具体以 Roach 的约束为准
增删 CN 开始时,会自动停止 Roach 的自动同步操作,完成或者回滚后,需要用户手动恢复自动同步配置。
1、删除 CN
1.1 操作场景
在集群运行过程中,CN 发生故障后,整个集群将无法执行 DDL 操作。因此,如果 CN 发生故障且无法快速修复时,可以使用 gs_om 中的 managecn 把故障 CN 从数据库集群中删掉,从而使集群可以快速恢复正常工作。
1.2 注意事项
“cluster_state”为“Unavailable”时,将无法执行删除 CN 操作。
一次仅允许删除一个 CN。
如果因 CN 故障造成集群处于 Degraded 状态,此时如果执行删除 CN 操作,必须先删除因故障被剔除的 CN,之后才能删除其他 CN。
若已开启 CN 自动剔除功能,CM 会自动将故障 CN 剔除,即从 pgxc_node 中删掉,这样 DDL 可以正常执行。CN 被自动剔除后,不会再被拉起,必须删除 CN 或通过实例替换、节点替换、温备修复,才能进行扩容、升级等其他操作。
删除 CN 前不能锁定集群,不能执行其他运维及变更类操作。
删除完成后集群中至少剩余一个正常的 CN。
数据库安装用户有足够的权限将新 xml 文件分发到所有主机的相同目录下。
在执行删除 CN 操作时,建议不要进行数据增删改等 DML 操作以及 DDL 操作,以避免数据的丢失。
在删除 CN 操作时,执行删除命令的节点不能是要删除的 CN 节点。
单 CN 的集群不支持继续缩容操作。
3CN 以下的集群不建议进行缩容操作,避免缩容过程中或结束后因为 CN 故障导致集群功能不可用。
部署 kerberos 情况下,同时缩容 kerberos server 主备 ip 所在的 cn 会导致集群异常。
1.3 处理方法
1.以操作系统用户 omm 登录数据库集群任一主机。
如果所登录的主机因网络或操作系统等故障无法登录,请更换为登录另一集群主机。
2.修改集群 XML 配置文件 clusterconfig.xml。
请将要删除 CN 对应主机上的 cooNum 值从 1 改为 0。
3.使用 gs_om 工具脚本执行删除 CN 操作。
1.4 示例
删除集群内部节点上的 CN 实例。
集群运行过程中,某个含有 CN 的节点损坏短时间内无法修复(网络无法连接、硬件故障造成操作系统无法登录等),此时会造成其他 CN 无法执行业务,造成业务中断。此时,可以选择进行节点替换,但耗时较长,为了尽可能的快速恢复业务,可以执行对该节点上的 CN 删除。以故障节点为 SIA1000022048 为例:
如果执行完删除节点 SIA1000022048 的 CN 后,该节点又从故障中恢复,此时该节点上记录的集群信息为删除 CN 前的,造成该节点与真实的集群信息不相同,因此需要对该节点执行如下操作,以保障集群信息的统一。
2、增加 CN
2.1 操作场景
当集群中的 CN 数量无法承载业务运行压力时,可以通过 gs_om 的 managecn 功能给集群增加 CN。同时,如果 CN 因故障被删除后,可以使用增加 CN 功能将其加回。
2.2 前提条件
增加 CN 需要集群处于 Normal 状态。
在已有主机上增加 CN,需要提前创建 CN 的数据目录、日志目录。
在新增主机上增加 CN,需要在配置文件中新增新主机的 CM 路径并使用 gs_preinstall 工具准备好新主机的环境。
需要在一个状态正常的主机上执行操作。
2.3 注意事项
一次仅允许增加一个 CN。
增加 CN 前不能锁定集群,不能执行引起集群状态或结构变化的其他运维操作。
数据库安装用户有足够的权限将新 xml 文件分发到所有主机的相同目录下。
增加 CN 过程中集群可以执行业务,特别说明:由于过程中会短暂锁集群,锁集群后用户下发的包含显式启动事务的 DDL 语句会出现等待,集群解锁后会报错或等待时间超过 20 分钟会报错。如包含创建临时表操作,在集群解锁后会报错(Don’t support temp table when need reconnect pooler)。
增加、删除 CN 过程中系统将关闭“自动剔除故障 CN”功能,在完成后系统再次打开该功能。
2.4 处理方法
1.以操作系统用户 omm 登录数据库集群任一主机。
2.修改集群 XML 配置文件 clusterconfig.xml。
在已有主机上新增 CN,请将要增加 CN 对应主机上的 cooNum 值从 0 改为 1。
在新增主机上增加 CN,要求该主机上只能配有 CN,不能包含 DN、GTM、CM Server 及 ETCD。如下以增加集群外的主机 SIA1000056772 上的 CN 为例:
3.进入安装包解压出的 script 目录下,执行下面命令为增加 CN 准备好前置环境。
4.使用 gs_om 工具脚本进行增加 CN 操作。
5.(可选)如果增加 CN 前修改过 CN 的 GUC 参数:log_dir,listen_addresses,local_bind_address,port,pgxc_node_name,pooler_port,log_directory 和 audit_directory。增加 CN 成功后,新 CN 无法同步先前的修改。请使用 gs_guc 工具以 reload 方式修改重新修改 CN 上的这些 GUC 参数。
2.5 示例
增加集群内部节点上的 CN 实例。
前提条件:在 xml 中配置好需要增加的 CN 信息,执行前置命令。
增加集群外部服务器上的 CN,首先用新增外部机器 CN 的配置文件执行前置,然后以下面命令进行外部增加 CN 操作,以增加 SIA10000622109 为例。
3、自动剔除故障 CN
自动剔除故障 CN 功能默认开启。在单机部署场景下,自动剔除 CN 功能不生效,无需执行本节操作。
3.1 背景信息
集群可部署多个 CN 同时对外提供服务,CN 的角色是对等的,即执行 DML 语句时连接到任何一个 CN 都可以得到一致的结果。而 DDL 语句需要在所有 CN 上都执行完成,保持相关定义一致,如果其中一个 CN 发生故障,整个集群将无法执行 DDL 语句,直到故障 CN 被修复。
为了不影响用户业务的执行,GaussDB Kernel 提供了 CN 故障自动剔除功能,系统检测到 CN 故障后在限定时间内将 CN 自动剔除,用户的 DDL 语句就可以继续执行。
3.2 前提条件
无。
3.3 注意事项
自动剔除故障 CN 功能默认开启,默认设置 CN 剔除时间为 25 秒。用户可根据自己实际场景和需求确定是否开启功能,以及开启后的剔除时间。
集群中部署的 CN 少于 2 个不会自动剔除。多 CN 场景下,共 N 个 CN 时,最多剔除 N-1 个 CN。如果开启了自动修复 CN 功能(,已剔除 CN 的故障解除后,系统可以自动修复 CN,或者用户执行实例替换命令手动修复,参见手动修复剔除的 CN。
CN 故障被剔除后,CN 会处于 Deleted 状态, 集群处于 Degraded 状态,用户业务可以继续执行不受影响,但是物理集群的扩容、缩容、升级、增加 CN、change IP 操作将不能执行。
3.4 处理方法
开启自动剔除故障 CN 功能,即 CN 故障后,自动剔除故障的 CN。
关闭自动剔除故障 CN 功能,即 CN 故障后,不剔除故障的 CN。
其中 coordinator_heartbeat_timeout 为 CN 自动剔除的时间,单位是秒,默认值 25 秒,设置为 0 表示关闭 CN 自动剔除功能,设置为大于 0 的数字,表示开启此功能,用户可根据自己实际场景和需求确定剔除时间。
重新设置该参数后需要重启 cm_server 进程或发信号 kill -1 cm_server 进程号才能生效。
4、手动剔除故障 CN
CN 故障时,除了自动剔除还可以对 CN 进行手动剔除。在单机部署场景下,手动剔除 CN 功能不生效,无需执行本节操作。
4.1 注意事项
当 coordinator_heartbeat_timeout 参数设置为 0,自动剔除功能关闭时也可以执行手动剔除。
只有 CN 状态为 down 时,才能手动剔除该 CN。
手动剔除 CN 时,若发生 cm_server 主故障,有可能会出现剔除超时,超时后重新执行剔除。
4.2 处理方法
执行如下命令进行手动剔除故障 CN:
5、手动修复剔除的 CN
CN 故障被剔除后(状态显示为 Deleted),数据库支持自动修复方式和手动修复方式修复被剔除的 CN。本小节说明手动修复方式,即手动执行实例替换命令。在单机部署场景下,手动修复 CN 功能不生效,无需执行本节操作。
5.1 背景信息
CN 手动修复时会短暂阻塞 DDL,修复结束后 DDL 可以继续执行。
5.2 前提条件
当前 CN 故障解除后才能启动手动修复。
CN 手动修复需要在集群有正常的 CN 时才能成功。
如果触发手动修复,自动修复会被停止。
5.3 注意事项
下述两条命令需要关联一起执行,若只执行 gs_replace -t config -h 而未执行 gs_replace -t start -h 则可能影响集群功能,导致后续使用自动修复方式时功能不可用。
5.4 处理方法
执行如下命令,对需要替换实例的主机进行配置操作。配置操作会清理替换实例的空间,初始化替换实例,配置替换实例。
执行如下命令,对需要修复实例的主机进行启动操作。
hostname 是故障 CN 所在主机的主机名称。
6、修复故障实例
数据库集群是由多台主机组成的,当集群中主机上的某些实例发生故障后,为了使 GaussDB Kernel 快速地恢复正常,用户可以使用 gs_replace 工具将发生故障的实例替换为正常实例。
6.1 前提条件
集群处于启动状态,且处于没有加锁。
修复操作需要在一个正常主机上执行。
一组 DN 的主实例、备实例,其中只能有一个损坏。
集群内如下实例分别至少存在一个正常运行的:CM Server、CM Agent、GTM、CN。
如果集群中部署有 ETCD,则正常的 ETCD 个数必须大于 ETCD 总个数的一半。
如果集群中未部署 ETCD,某个 GTM 实例存在故障,则要求实例替换前另外一个 GTM 实例必须为最高可用模式,即该 GTM 实例正常。
由于在修复实例时,会检查并修复所有主机上故障的 CM Agent 实例,所以要求各主机必须互信正常,且安装目录下的二进制文件未被损坏。
强制修复多节点时,由于会停止需要修复节点内的所有 CN,所以如果集群的所有 CN 在指定修复的节点中,则不支持强制修复多节点。
强制修复多个节点时,由于会停止需要修复节点上的所有 DN 主、备实例,所以指定修复的节点的 DN 主、备均不能在同一个 DN 环内。
一主多备部署下,修复 DN 实例时,为保证数据正确,DN 环中必须有 CM 可监控的主存活。
6.2 注意事项
如果集群中含有故障的 CN 且其状态不为 Deleted,那么在修复过程中用户执行 DDL 会报错,DML 可以正常执行。其他场景执行业务不受影响,特别说明:由于修复 CN 的过程中会短暂锁集群,锁集群后用户下发的包含显式启动事务的 DDL 语句会出现等待,集群解锁后会报错或等待时间超过 20 分钟会报错。如包含创建临时表操作,在集群解锁后会报错(Don’t support temp table when need reconnect pooler)。
如果故障实例所在主机的安装目录下($GAUSSHOME/bin/)的二进制文件损坏或丢失,则不能通过替换实例进行修复。需要复制其他正常主机对应的二进制文件到该主机,或者将该主机卸载后,再通过替换主机修复。
在前一次修复结束后才能再次执行修复。因此请不要同时在多个主机上执行修复操作。
实例修复操作会修复故障节点下的全部故障实例。
在修复实例的 config 阶段,先将 CM Agent 组件修复好,这样才能获取到集群中所有实例的状态。如果主机上的某些实例被人为停止,在 CM Agent 组件修复好之后,这些原来正常的实例会被正常拉起,而不会被修复。如果在一定时间内拉起失败,这些实例将会被修复。
修复故障实例过程中系统将关闭“自动剔除故障 CN”功能,完成后系统再次打开该功能。因此建议在开始修复前确认故障的 CN 已经被自动剔除(即故障的 CN 状态为 Deleted),否则在修复过程中用户执行 DDL 会报错。
修复 CN 实例过程中,在 CN 状态未变为 Normal 前,不能连接该 CN 执行业务。
实例修复前用户手动在故障实例上配置的 guc 参数、pg_hba.conf 配置的白名单会丢失,需要重新设置。
6.3 处理方法
以替换主机 plat1、plat2 上的实例为例。
1.以操作系统用户 omm 登录数据库集群任一主机。操作系统用户 omm 登录的主机为非故障主机。
2.(可选)使用如下命令在需要替换实例的主机上清理可能存在的残留文件。此命令仅在上次修复故障实例执行失败的情况下需要执行。
该文件为替换故障实例、替换主机中产生的用于记录执行步骤的临时文件,如果在上次执行过程中出现宕机或网卡中断等,可能会导致该文件残留。在替换故障实例前检查该文件是否存在,且生成时间非本次替换故障实例的时间,则可判断为上次执行的残留文件,删除该文件后,继续执行替换故障实例。
3.使用如下命令对需要替换实例的主机进行配置操作。
配置操作会清理替换实例的空间,初始化替换实例,配置替换实例。
如果收到提示:“GAUSS_50201: The XXX does not exist.”,则请检查对应的实例数据目录是否存在。如果不存在,请重新创建目录后再次执行上述命令。
如果指定主机的表空间所在磁盘出现故障,从而导致表空间中的数据损坏,更换新磁盘后,需要指定–force 参数对该主机强制进行表空间数据的恢复。如果在 config 阶段指定–force 参数,则在 start 阶段也必须指定–force 参数。
4.使用如下命令对需要修复实例的主机进行启动操作。
启动操作会启动集群替换实例的主机。
5.使用如下命令重置实例状态。
switch 为维护操作:确保集群状态正常,所有业务结束,并使用 pgxc_get_senders_catchup_time()视图查询无主备追赶后,再进行 switch 操作。
重置过程会恢复集群初始状态,以保证各主机的负载都是均衡的。
6.执行如下命令查询集群状态。
7、修复 DN 增量 build 失败
7.1 背景信息
在集群 DN 增量 build 过程中,会先删除部分数据,如果原主损坏,那么主备均损坏。为了集群快速恢复正常,需要手动进行文件替换,然后恢复集群,使集群能够正常运行。
7.2 前提条件
只在增量 build 的场景下。
集群已安装,增量 build 前集群状态正常。
只有 DN 环中包含的主实例、备实例故障,从备实例正常。
集群内如下实例分别至少存在一个正常运行的:CM Server、CM Agent、GTM、CN。
由于在修复实例时,会检查并修复所有主机上故障的 CM Agent 实例,所以要求各主机必须互信正常,且安装目录下的二进制文件未被损坏。
7.3 注意事项
pg_rewind_bak 目录为增量 build 时备机的文件备份目录,不能被手动修改。
7.4 处理方法
1.以操作系统用户 omm 登录集群故障节点的主机。
2.停止所有 CN 和故障的 DN 主备从。
3.执行以下命令查看 CN 和故障 DN 所在节点信息。
例如在一个含 3 个 CN 和 12 个 DN 的主备从集群中
故障 DN :
执行以下命令停止所有 CN 和故障的 dn 主备从。
其中,nodenumber,CN 所在目录,DN 所在目录可由 1 获取。例如,
执行 restore 操作,需要登录到故障的机器上。
cm_ctl start 方式启动故障结点。
cm_ctl start -n 1 -D /data1/mpp/data1/slave09/ #先变成 Standby Need
repair(Disconnected),然后是 Standby Promoting,这时候起来从备
启动从备:
备机升主成功。
启动原主机:
原主机启动成功后降为备机。
启动 CN 结点,恢复业务:
检查结点状态是否恢复正常:
数据校验。
启动业务。
在数据验证完成后,启动业务。
四、修改 HOSTNAME、IP 和端口号
1、背景信息
在数据库集群使用过程中,由于网络部署调整、机房搬迁、网络故障等带来主机 IP 地址和端口号的变更。GaussDB Kernel 提供了 gs_om 的 changeip 操作可以在不换主机、不改变集群其他配置的前提下,快速实现集群 IP 地址、主机名或者端口号的变更。
2、前提条件
确认集群状态正常后,停止集群。
基于新 IP、主机名的用户互信已配置好。
数据库安装用户有足够的权限将新 xml 文件分发到所有主机的相同目录下。
3、注意事项
仅换 IP 地址、主机名或者端口号,不换主机。
以数据库安装用户执行脚本。
外部表 IP 不处理。
修改 IP 支持集群 backIP,sshIP,HaIP 以及实例侦听 IP 的修改。修改端口支持修改 GTM、CN、ETCD、CM Server 以及 DN 端口。
在修改集群 IP 过程中,出现异常情况(断电、宕机)时,通过“gs_om -t status”获取到的集群以及实例状态信息是不准确的。重新执行修改集群 IP 操作,正常结束后才能进行其它操作。
修改 IP 和端口号操作需要停止业务,执行过程中不支持数据库 DQL、DDL、DML、DCL 操作。
当未配置实例端口时,实例初始化的默认端口为 cm_server 主 5000 备 5500;GTM 主 6000 备 6500;CN 主 8000 备 8500;DN 主 40000 备 45000 从 50000;ETCD 主 2379 备 2380。
4、处理方法
1.以 root 用户身份登录数据库集群任一主机。
2.修改集群部署配置文件 clusterconfig.xml,把主机的 IP 和 hostname 或者端口号替换为新的。
3.进入安装包解压后的 script 文件夹。例如,安装包存放路
为/opt/software/GaussDB_Kernel。
4.准备集群环境。
omm 为运行集群的操作系统用户,dbgrp 为操作系统用户的群组名称,clusterconfig.xml 为集群配置文件,此示例中假设其存储在安装包存放路径下。
5.切换为 omm 用户。
6.执行如下命令进行修改集群 IP 操作。
如果执行修改集群 IP 过程中出现错误,系统调用自动回滚。如果自动回滚过程中,因为磁盘满等原因,导致回滚失败,则用户排除错误后,如需继续执行修改 IP 则调用本命令,如果要放弃修改 IP,则调用如下命令将集群恢复到修改 ip 之前的状态:
5、涉及修改参数列表
集群的 IP 和端口号都需要使用 gs_om 工具进行修改。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/ebe86edc14739cbc9c81a705f】。文章转载请联系作者。
评论