本文分享自华为云社区《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工具进行修改。
点击关注,第一时间了解华为云新鲜技术~
评论区