掘金 后端 ( ) • 2021-06-17 11:13
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{line-height:1.5;margin-top:35px;margin-bottom:10px;padding-bottom:5px}.markdown-body h1{font-size:30px;margin-bottom:5px}.markdown-body h2{padding-bottom:12px;font-size:24px;border-bottom:1px solid #ececec}.markdown-body h3{font-size:18px;padding-bottom:0}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:15px}.markdown-body h6{margin-top:5px}.markdown-body p{line-height:inherit;margin-top:22px;margin-bottom:22px}.markdown-body img{max-width:100%}.markdown-body hr{border:none;border-top:1px solid #ddd;margin-top:32px;margin-bottom:32px}.markdown-body code{word-break:break-word;border-radius:2px;overflow-x:auto;background-color:#fff5f5;color:#ff502c;font-size:.87em;padding:.065em .4em}.markdown-body code,.markdown-body pre{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre{overflow:auto;position:relative;line-height:1.75}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;display:block;overflow-x:auto;color:#333;background:#f8f8f8}.markdown-body a{text-decoration:none;color:#0269c8;border-bottom:1px solid #d1e9ff}.markdown-body a:active,.markdown-body a:hover{color:#275b8c}.markdown-body table{display:inline-block!important;font-size:12px;width:auto;max-width:100%;overflow:auto;border:1px solid #f6f6f6}.markdown-body thead{background:#f6f6f6;color:#000;text-align:left}.markdown-body tr:nth-child(2n){background-color:#fcfcfc}.markdown-body td,.markdown-body th{padding:12px 7px;line-height:24px}.markdown-body td{min-width:120px}.markdown-body blockquote{color:#666;padding:1px 23px;margin:22px 0;border-left:4px solid #cbcbcb;background-color:#f8f8f8}.markdown-body blockquote:after{display:block;content:""}.markdown-body blockquote>p{margin:10px 0}.markdown-body ol,.markdown-body ul{padding-left:28px}.markdown-body ol li,.markdown-body ul li{margin-bottom:0;list-style:inherit}.markdown-body ol li .task-list-item,.markdown-body ul li .task-list-item{list-style:none}.markdown-body ol li .task-list-item ol,.markdown-body ol li .task-list-item ul,.markdown-body ul li .task-list-item ol,.markdown-body ul li .task-list-item ul{margin-top:0}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:3px}.markdown-body ol li{padding-left:6px}.markdown-body .contains-task-list{padding-left:0}.markdown-body .task-list-item{list-style:none}@media (max-width:720px){.markdown-body h1{font-size:24px}.markdown-body h2{font-size:20px}.markdown-body h3{font-size:18px}}

​​【本期推荐】几百万人同时下单,你抢到的概率为何越来越大?上亿的交易数据又是如何有序地流通,保证你既能抢到,也能及时收到货?

​​​​摘要:本文将介绍备机重建各种方法的实现机制,并结合应用场景分析,以及对新增参数的使用建议,以期获得最佳应用效果。

本文分享自华为云社区《先码再看,一文介绍备机重建各种方法的实现机制》,原文作者:Victor_NK 。

1、需求介绍

GaussDB(DWS)的实例在运行过程中难免发生故障,引起实例错误或无法启动,此时就需要进行备机重建工作。备机重建功能主要目的是修复实例单点故障,此外,还可用于集群安装的初始化、集群扩容的元数据同步、节点故障后的温备替换等等场景。本文将介绍备机重建各种方法的实现机制,并结合应用场景分析,以及对新增参数的使用建议,以期获得最佳应用效果。

2、设计方案

2.1 功能分类

备机重建按照实现方式不同分为:全量重建和增量重建。

备机重建需要在待修复主机上运行 gs_ctl build 工具。在备机重建过程中,均需要和主 DN 建立连接进行数据的交互访问。在 gs_ctl 工具的命令行参数中通过–b=mode 参数,可以指定重建 DN 备机的模式。目前 mode 支持的取值包括以下四种:

full:全量重建,通过获取主备之间全量镜像差异的方式重新同步 DN 主机的数据目录。

fullcleanup:全量重建,通过全量镜像的方式重新同步 DN 主机的数据目录。与 full 模式区别为:同步前需要清理 DN 备机的数据目录,保留配置文件。主机将自己的数据目录除了配置文件外,全部发给备机。

incremental:增量重建,通过解析 WAL 日志获取主备 DN 差异的数据进行增量修复备 DN。

auto(不指定-b):先增量重建,增量重建失败后进行全量重建。

实际生产环境中,具体使用哪种方式,就需要看需求与应用场景所定。

2.2 应用场景

备机重建按照功能场景不同分为:DN Build DN、CN build CN、CN Build DN。各 Build 的应用场景的特点如下:

选择何种修复方式最优,需要理解该模式的工作原理,并根据应用场景合理地设置相关参数。

3、实现过程

3.1fullcleanup mode:基于推送方式

fullcleanup mode 是一种推送模式,在该模式下,由主机来控制数据流程(我给啥你接啥),在不关心备机损坏程度和范围的情况下,需要主机将自己的数据目录配置文件外的全部数据传送给备机,重建后启动备机。

其主要工作过程如图 1 所示:

​fullcleanup mode build 的特点很明显,备机将得到彻底重建。但缺点也很明显:主机需要 Copy 实例上全部的数据和 XLOG 日志文件,占用较高的网络传输带宽,对运行中的业务有一定影响。备机没有对修复前数据进行原子化管理,过程中一旦失败将无法恢复到原备机。如果全量 Build 过程中由于偶发网络等原因故障失败,将前功尽弃,再次 Build 数据需要从头再来。

所以该方式是最保守的最后选项,是在其它重建方式均无效的时候的一种选择。

3.2full mode:基于文件校验获取差异的拉取方式

full mode 是一种拉取模式,在该模式下,由备机来控制数据流程(我需要啥拿啥),仅需要补齐主备之间的差异数据。但前提是备机需要知晓自己与主机差异。full mode 是直接从文件比较进行切入,主、备机可以同时多线程(并行、并发,提升性能)在各自本地上对数据目录文件进行遍历,获知文件有无、大小、文件校验计算等信息;通过这些信息,不断对计算结果 File Map List 进行合并筛选,获得最小的差异文件集合,减少数据/文件的拷贝数量。备机既可以仅备份备机的差异文件作为备份集(满足可靠性),又可以仅拉取主机的差异文件来更新(提升性能);备机可以采用多线程(并发,提升性能)同时从主机拉取文件。

其主要工作过程如图 2 所示:

​full mode build 的特点是充分利用备机已有的文件,减少数据同步的数量,可以方便地进行备份和恢复、和并行控制。但需要花费一定时间的本地 IO 和计算为代价。与 fullcleanup mode 相比较在无资源瓶颈条件下通常速度更快(可获得数倍的提升),可靠性上更安全,是全量 build 的首选。

3.3incremental mode:基于 Xlog 分析获取差异的拉取方式

incremental mode 是另外一种拉取方式。适用于主备双主等因日志造成的不一致场景。增量重建是一种以主 DN 文件和备 DN 的 WAL 日志为基准,按照多退少补的原则对备 DN 文件和文件块进行修复。与全量重建相比较,拷贝的粒度、数据量和 WAL 日志量都更少,代价更小。

其主要工作过程如图 3 所示:

incremental mode build 只适用于主备双主等因日志造成的不一致场景。备机数据文件损坏、数据目录丢失等故障通过增量重建的方式无法修复,此时可通过全量重建的方式重新修复备机。

4、思考总结

随着备机重建功能的性能提升和可靠性的增强,build 新增了部分参数,在使用时候值得了解和注意。

4.1-T THREAD-NUMBER

适用于拉取方式的 full 和 incremental 模式。其功能是在备机侧指定与主机连接个数,用于多线程并发进行计算和与文件拉取。

通常情况下默认值为 4 已可获得较好的性能,在资源允许的情况下,建议使用更高的线程数。但需注意的是增大线程数目可以提升 Build 的性能,缩短其重建时间,但相应的也增加了网络连接、CPU、和网络 IO 的消耗,在使用时候需要考虑资源状况,合适设置。

4.2-u

适用于支持原子化功能的 full 和 incremental 模式。其功能是 Build 过程中将不进行原子化恢复和备份,适合于空间不足或无需备份的需要场景中。

Incremental build 默认是原子化,过程中严格进行原子化恢复和备份,过程中出错可恢复,排除错误后,可再次调用重入。由于 Full Build 的涉及的数据文件量大,默认无原子化,但会尝试进行原子化恢复,忽略恢复结果成败,仅在备机拉取主机上的文件占其总量 20%内进行备份。在使用时最好明确指出需要或者不需要原子化功能。

4.3-B --backupdir=DIR

适用于支持原子化功能的 full 和 incremental 模式。其功能是 Build 过程中将从指定的路径下进行备份集的恢复和备份。适合于强高可靠需求场景,在 Build 成功之前可保持备份的原子化,避免原始备份丢失。

需要注意的是,用户指定备份集路径的磁盘剩余空间应大于 DN 实例数据目录大小。且备份路径下保持空白或者是本节点的数据集,无关数据将会造成备份集失效,重新生成的备份集会让原始数据副本有丢失的风险。除 pg_rewind_bak 路径外,用户指定备份集路径的应与备机实例工作路径隔离。

想了解 GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技~

点击关注,第一时间了解华为云新鲜技术~