暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T paxos场景下failover失败后恢复DN

墨天轮 2019-09-23
500

paxos场景下failover失败后恢复DN

操作场景

此问题出现在DN使用paxos同步复制协议场景下。主DN故障且不能拉起时,会触发集群管理仲裁选主,选出适合升主的备DN,并给该备DN下发failover命令执行升主。如果故障场景下剩余的DN无法达成多数派协议(正常DN数小于DN总数/2+1),则不能使用failover命令将剩余的某一个正常备DN升主,例如,集群中的一组DN中包含一个主DN和两个备DN,主DN故障后,在仲裁选主后的备DN上自动下发failover命令执行升主失败,此时已有2个故障DN,根据raft一致性协议,仅剩一个正常DN时无法达成多数派,导致剩下备DN不能使用failover命令升主成功。出现此问题时,使用如下方案进行DN组恢复。

操作步骤

  • omm用户身份登录GaussDB 100所在的任一服务器。
  • 停止集群业务。
  • 停止集群的CM实例。

    gs_om -t stop -H hostname -I CM_name

    hostname是CM所在服务器的主机名,CM_name是CM的名称。

  • 查询故障DN所在DN组的主备关系。

    假设故障DN所在DN组名称是group_1。

    etcdctl --cert="$ETCD_CERT_CLIENT_FILE" --key="$ETCD_KEY_CLIENT_FILE" --cacert="$ETCD_CA_CLIENT_FILE" --endpoints="$ETCD_ADDRESS" get /clusters/groups/group_1

    查询结果如下:

    /clusters/groups/group_1 {"GroupName":"group_1","GroupType":"DN_ZENITH_HA","GroupId":1,"Attributes":{"GroupDBMaxLSNGap":"280000000"},"Instances":{"AZ1/LFG1000823704/DB1_1":{"FullName":"AZ1/LFG1000823704/DB1_1","ParentNode":"","Role":"primary"},"AZ2/LFG1000811736/DB1_3":{"FullName":"AZ2/LFG1000811736/DB1_3","ParentNode":"AZ1/LFG1000823704/DB1_1","Role":"standby"},"AZ3/LFG1000846578/DB1_2":{"FullName":"AZ3/LFG1000846578/DB1_2","ParentNode":"AZ1/LFG1000823704/DB1_1","Role":"standby"}}}

    在如上查询结果中,一个DN的信息如粗体所示,其中Role字段表示该DN角色是主或是备。

  • 分别以SYSDBA身份本地登录所有正常备DN,查询每个备DN的日志量。

    zsql / as sysdba -D dn_data_dir -q -c "select DBMS_RAFT.raft_query_info();"

    查询结果如下:

    DBMS_RAFT.RAFT_QUERY_INFO() ---------------------------------------------------------------- 8;9,7,8;;7;706;706;691;0; 1 rows fetched.

    根据第6个分号(;)前数字越大,该备DN的日志量越多。

  • 在集群任一服务器上,修改故障DN所在DN组的主备关系。

    将日志量最多的备DN设置为主DN,其余DN设置为备DN。

    修改DN组主备关系,是指修改DN信息的ParentNode字段值和Role字段值。

    在要设置为主DN的信息中,将ParentNode字段值设为空,Role字段值设置为primary。在要设置为备DN的信息中,将ParentNode字段值为AZ_name/hostname/主DN_name,即主DN信息中FullName字段值,其中,AZ_name和hostname分别是即将作为主DN所在AZ的名称和所在服务器的主机名;Role字段值设置为standby。

    etcdctl --cert="$ETCD_CERT_CLIENT_FILE" --key="$ETCD_KEY_CLIENT_FILE" --cacert="$ETCD_CA_CLIENT_FILE" --endpoints="$ETCD_ADDRESS" put /clusters/groups/group_1 "{\"GroupName\":\"group_1\",\"GroupType\":\"DN_ZENITH_HA\",\"GroupId\":1,\"Attributes\":{\"GroupDBMaxLSNGap\":\"280000000\"},\"Instances\":{\"AZ1/LFG1000823704/DB1_1\":{\"FullName\":\"AZ1/LFG1000823704/DB1_1\",\"ParentNode\":\"AZ2/LFG1000811736/DB1_3\",\"Role\":\"standby\"},\"AZ2/LFG1000811736/DB1_3\":{\"FullName\":\"AZ2/LFG1000811736/DB1_3\",\"ParentNode\":\"\",\"Role\":\"primary\"},\"AZ3/LFG1000846578/DB1_2\":{\"FullName\":\"AZ3/LFG1000846578/DB1_2\",\"ParentNode\":\"AZ2/LFG1000811736/DB1_3\",\"Role\":\"standby\"}}}"

  • 以SYSDBA身份本地登录要升主的备DN,执行failover命令。

    zsql / as sysdba -D dn_data_dir -c "ALTER DATABASE FAILOVER;"

  • 在集群任一服务器上,启动CM实例。

    gs_om -t start -H hostname -I CM_name

    hostname是CM所在服务器的主机名,CM_name是CM的名称。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论