本文档主要介绍在同城双中心的部署方案下,如何应对不同级别的灾难。
当复制组中超过半数节点发生故障,该复制组将无法提供读写服务。针对该情况,用户需参考 节点故障场景进行灾难恢复。如果故障节点未超过半数,用户仅需修复故障节点并恢复节点数据即可。
当主中心发生故障,集群将失去半数以上的节点,导致无法对外提供读写服务。针对该情况,用户需参考 数据中心故障场景进行灾难恢复。
当灾备中心发生故障,主中心仍可提供读写服务。针对该情况,用户仅需修复故障中心并恢复节点数据即可。
当数据中心发生网络故障,集群仍可提供读写服务。针对该情况,用户仅需修复网络故障并恢复节点数据即可。
SequoiaDB 巨杉数据库提供 容灾切换合并工具,用于对节点故障场景和数据中心故障场景进行灾难恢复。下述以 SequoiaDB 安装目录 /opt/sequoiadb/
、集群鉴权用户名“sdbadmin”和用户密码“sdbadmin”为例,介绍不同场景的灾难恢复步骤。
下述以复制组 group1 不可用为例,介绍节点故障场景的具体恢复步骤。
选择一台未发生故障的主机 sdbserver
,切换至容灾工具目录
$ cd /opt/sequoiadb/tools/dr_ha
修改配置文件 cluster_opr.js
$ vim cluster_opr.js
修改内容如下:
if ( typeof(SEQPATH) != "string" || SEQPATH.length == 0 ) { SEQPATH = "/opt/sequoiadb/" ; } if ( typeof(SDBUSERNAME) != "string" ) { SDBUSERNAME = "sdbadmin" ; } if ( typeof(SDBPASSWD) != "string" ) { SDBPASSWD = "sdbadmin" ; } if ( typeof(SUB1HOSTS) == "undefined" ) { SUB1HOSTS = [ "sdbserver" ] ; } if ( typeof(COORDADDR) == "undefined" ) { COORDADDR = [ "sdbserver:11810" ] } if ( typeof(CURSUB) == "undefined" ) { CURSUB = 1 ; } if ( typeof(MINREPLICANUM) == "undefined" ) { MINREPLICANUM = 1 ; } if ( typeof(NEEDREELECT) == "undefined" ) { NEEDREELECT = false } if ( typeof(NEEDBROADCASTINITINFO) == "undefined" ) { NEEDBROADCASTINITINFO = true }
Note:
配置文件的参数说明可参考 容灾切换合并工具。
剔除故障节点,剔除后复制组将恢复读写服务
$ sh detachGroupNode.sh
修复故障节点
将修复后的节点重新加入复制组
$ sh attachGroupNode.sh
通过 SDB Shell 检查节点间数据是否一致
> db.snapshot(SDB_SNAP_HEALTH, {GroupName: "group1"}, {IsPrimary: null, CompleteLSN: null})
对比主备节点间字段 CompleteLSN 的值,如果保持一致则说明节点数据一致
{ "IsPrimary": true, "CompleteLSN": 228 } { "IsPrimary": false, "CompleteLSN": 228 } { "IsPrimary": false, "CompleteLSN": 228 }
Note:
如果主备节点间字段 CompleteLSN 的值不一致,用户需等待片刻,待节点数据同步后再次检查节点数据是否一致。
在当前复制组中重新选主
> var rg = db.getRG("group1") > rg.reelect({Seconds: 60})
当数据中心故障导致集群不可用,需要通过以下步骤进行恢复:
下述以主中心整体故障为例,介绍数据中心故障场景的具体恢复步骤。
划分子网
将正常机房划分为 SUB1,故障机房划分为 SUB2
子网 | 主机 |
---|---|
SUB1 | sdbserver3 |
SUB2 | sdbserver1、sdbserver2 |
集群分裂
集群分裂操作用于将灾备中心从集群中分裂,使其成为具备读写功能的独立集群。分裂完成后,将由灾备中心对外提供服务。
开启自动全量同步,避免节点重启失败
逐一修改所有故障节点的配置文件 sdb.conf
$ vim /opt/sequoiadb/conf/local/<端口号>/sdb.conf
修改内容如下:
... dataerrorop=1 ...
选择 SUB1 的主机,切换至容灾工具目录
$ cd /opt/sequoiadb/tools/dr_ha
修改配置文件 cluster_opr.js
$ vim cluster_opr.js
修改内容如下:
if ( typeof(SUB1HOSTS) == "undefined" ) { SUB1HOSTS = [ "sdbserver3" ] ; } if ( typeof(SUB2HOSTS) == "undefined" ) { SUB2HOSTS = [ "sdbserver1", "sdbserver2" ] ; } if ( typeof(COORDADDR) == "undefined" ) { COORDADDR = [ "sdbserver3:11810" ] } if ( typeof(CURSUB) == "undefined" ) { CURSUB = 1 ; } if ( typeof(ACTIVE) == "undefined" ) { ACTIVE = true ; }
执行分裂操作
$ sh split.sh
修复故障中心
选择 SUB2 的任意一台主机,切换至容灾工具目录
$ cd /opt/sequoiadb/tools/dr_ha
修改配置文件 cluster_opr.js
$ vim cluster_opr.js
修改内容如下:
if ( typeof(SUB1HOSTS) == "undefined" ) { SUB1HOSTS = [ "sdbserver3" ] ; } if ( typeof(SUB2HOSTS) == "undefined" ) { SUB2HOSTS = [ "sdbserver1", "sdbserver2" ] ; } if ( typeof(COORDADDR) == "undefined" ) { COORDADDR = [ "sdbserver1:11810" ] } if ( typeof(CURSUB) == "undefined" ) { CURSUB = 2 ; } if ( typeof(ACTIVE) == "undefined" ) { ACTIVE = false ; }
执行分裂操作
$ sh split.sh
集群合并
选择集群中的任意一台主机,执行合并操作
$ sh merge.sh
通过 SDB Shell 检查节点间数据是否一致
> db.snapshot(SDB_SNAP_HEALTH, {}, {NodeName: null, IsPrimary: null, CompleteLSN: null})
对比主备节点间字段 CompleteLSN 的值,如果保持一致则说明节点间数据一致
... { "NodeName": "sdbserver1:11820", "IsPrimary": true, "CompleteLSN": 80148 } { "NodeName": "sdbserver2:11820", "IsPrimary": false, "CompleteLSN": 80148 } { "NodeName": "sdbserver3:11820", "IsPrimary": false, "CompleteLSN": 80148 } ...
Note:
如果主备节点间字段 CompleteLSN 的值不一致,用户需等待片刻,待节点数据同步后再次检查节点数据是否一致。
关闭自动全量同步
> db.updateConf({dataerrorop: 2})
集群信息初始化
集群信息初始化操作用于将主节点分配至主中心,以恢复集群初始状态。执行该操作前,用户需转移或删除集群部署信息文件 datacenter_init.info
,该文件位于 SequoiaDB 安装目录。
根据数据中心划分子网,主中心为 SUB1,灾备中心为 SUB2
子网 | 主机 |
---|---|
SUB1 | sdbserver1、sdbserver2 |
SUB2 | sdbserver3 |
选择 SUB1 的任意一台主机,切换至容灾工具目录
$ cd /opt/sequoiadb/tools/dr_ha
修改配置文件 cluster_opr.js
$ vim cluster_opr.js
修改内容如下:
if ( typeof(SEQPATH) != "string" || SEQPATH.length == 0 ) { SEQPATH = "/opt/sequoiadb/" ; } if ( typeof(SDBUSERNAME) != "string" ) { SDBUSERNAME = "sdbadmin" ; } if ( typeof(SDBPASSWD) != "string" ) { SDBPASSWD = "sdbadmin" ; } if ( typeof(SUB1HOSTS) == "undefined" ) { SUB1HOSTS = [ "sdbserver1", "sdbserver2" ] ; } if ( typeof(SUB2HOSTS) == "undefined" ) { SUB2HOSTS = [ "sdbserver3" ] ; } if ( typeof(COORDADDR) == "undefined" ) { COORDADDR = [ "sdbserver1:11810" ] } if ( typeof(CURSUB) == "undefined" ) { CURSUB = 1 ; } if ( typeof(CUROPR) == "undefined" ) { CUROPR = "split" ; } if ( typeof(ACTIVE) == "undefined" ) { ACTIVE = true ; } if ( typeof(NEEDBROADCASTINITINFO) == "undefined" ) { NEEDBROADCASTINITINFO = false }
集群信息初始化
$ sh init.sh
选择 SUB2 的主机,切换至容灾工具目录
$ cd /opt/sequoiadb/tools/dr_ha
修改配置文件 cluster_opr.js
$ vim cluster_opr.js
修改内容如下:
if ( typeof(SEQPATH) != "string" || SEQPATH.length == 0 ) { SEQPATH = "/opt/sequoiadb/" ; } if ( typeof(SDBUSERNAME) != "string" ) { SDBUSERNAME = "sdbadmin" ; } if ( typeof(SDBPASSWD) != "string" ) { SDBPASSWD = "sdbadmin" ; } if ( typeof(SUB1HOSTS) == "undefined" ) { SUB1HOSTS = [ "sdbserver1", "sdbserver2" ] ; } if ( typeof(SUB2HOSTS) == "undefined" ) { SUB2HOSTS = [ "sdbserver3" ] ; } if ( typeof(COORDADDR) == "undefined" ) { COORDADDR = [ "sdbserver1:11810" ] } if ( typeof(CURSUB) == "undefined" ) { CURSUB = 2 ; } if ( typeof(CUROPR) == "undefined" ) { CUROPR = "split" ; } if ( typeof(ACTIVE) == "undefined" ) { ACTIVE = false ; } if ( typeof(NEEDBROADCASTINITINFO) == "undefined" ) { NEEDBROADCASTINITINFO = true }
集群信息初始化
$ sh init.sh
PHP网站源码石岩SEO按天扣费丹竹头网站制作南山企业网站建设双龙网站设计模板大鹏关键词按天扣费双龙品牌网站设计木棉湾网站搭建同乐百度竞价包年推广横岗网站推广工具布吉关键词按天计费大鹏网页设计横岗网站优化按天扣费坂田百姓网标王同乐企业网站设计荷坳百度关键词包年推广大运网络广告推广荷坳SEO按天计费吉祥至尊标王东莞SEO按天扣费南山SEO按效果付费同乐网站优化按天扣费荷坳网站改版民治外贸网站设计爱联seo网站优化福田网站设计东莞百度标王龙华百度标王龙岗设计公司网站布吉网站推广工具布吉SEO按效果付费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运