
干数据库高可用和容灾这块的兄弟看到“DMDSC DataWatch 组合方案架构图”这标题基本就知道这是讲国产数据库里那套“集群高可用 数据守护”的组合打法。DMDSC就是数据库多机共享集群让多个实例通过共享存储同时读写同一份数据解决单点故障和性能瓶颈DataWatch则是配套的数据守护组件负责把主库日志同步到备库并在主库整体不可用时自动接管。这两者组合起来画一张架构图在核心系统的高可用和容灾设计里非常常见也是我这些年做项目时反复要跟团队对齐的基础图。这篇文章我会从架构设计、核心部件拆解、落地配置流程、故障切换机制、真实环境里的坑这几个维度把这张图彻底讲透。无论你是刚接触数据库集群的DBA还是要做容灾方案选型的技术负责人按照这篇的思路去理解、去落地基本不会走偏。1. 组合方案的整体定位与设计思路1.1 单独用DMDSC会留下哪些隐患先说清楚DMDSC能干什么。它是一种共享存储架构多个数据库节点连到同一套存储设备上每个节点都有自己独立的内存和后台进程节点之间通过网络交换锁信息和缓存一致性信息。对应用来说连接任何一个节点都能读到同一份数据某个节点宕机后其他节点可以立刻接手不需要人工干预。听起来很完美但这里有个天然的单点共享存储本身。不管是存储阵列、光纤交换机还是机房整体断电只要存储层面出了问题哪怕你集群里十个节点全都活着整个集群照样不可用。我见过某单位把DMDSC集群吹得天花乱坠结果存储控制器坏了两个整库瘫痪最后只能靠备份恢复折腾了一整天。所以做架构设计的人第一反应一定是共享存储挂了怎么办另外DMDSC解决的是节点级高可用和一定程度的性能扩展但它管不到“机房级”故障。比如整个机房因为空调或者网络问题不可用那所有节点都连不上业务直接中断。这不是DMDSC不行而是它本身的设计边界就在那里。任何方案都有边界关键是你得知道它在哪。1.2 DataWatch补上的是哪一块拼图DataWatch是数据守护组件本质上是基于数据库日志的复制与自动切换机制。主库产生的实时日志或归档日志会被传送到备库备库通过重放日志来保持数据同步。它的工作通常需要三个角色配合数据库守护进程、守护进程配置、监视器。守护进程是跑在数据库节点旁边的一个独立进程负责监控本节点数据库的运行状态、网络状态并参与主备切换的决策。监视器则是部署在独立主机上的管理端负责汇总所有守护进程上报的状态数据并向守护进程下发切换指令。一台监视器不够一般会部署两台形成一个小集群避免监视器自己挂了导致切换无人触发。DataWatch本身解决的就是“整个数据库实例不可用”的故障场景。比如主库节点全部瘫痪、存储彻底损坏、机房网络中断这时候靠DMDSC已经救不回来了但备库作为一份独立于共享存储的数据副本可以立刻提升为主库。注意备库的数据存储跟主集群的共享存储是完全物理隔离的这才是容灾的真正意义。1.3 组合在一起后能形成什么能力把DMDSC和DataWatch组合起来就形成了一个“主集群 备集群”的双集群容灾结构。主集群内部用DMDSC保证节点级高可用应用连接任何一个节点都能读写备集群也可以是一台单点备库通过DataWatch与主集群保持准实时同步。当主集群所在环境整体故障时监视器确认主集群已经不可达就会把备库提升为新的主库并且自动把虚拟IP或服务名切换到新主库上应用几乎不用改连接串。从业务视角看这台设备的好处是分层的第一层某个数据库节点崩溃应用无感知连接自动漂移到其他节点第二层整个主集群灭失DataWatch自动或半自动完成接管业务中断时间可以控制在分钟级甚至秒级数据丢失量取决于你选的同步模式。这个“分层容错”的思路就是组合架构设计的灵魂。很多单位做两地三中心方案本地用DMDSC集群做主集群同城或异地再用一个备集群通过DataWatch同步就是看中了它兼顾性能和容灾的特点。但要注意组合方案不代表零丢失同步模式的选择直接决定RPO架构评审时必须让业务方签确认别到时候甩锅给数据库。2. 架构图中的核心部件与技术细节2.1 主集群侧网络、实例、存储三个平面看架构图别只盯着大方框和小圆圈要把主集群拆成三个平面去理解。网络平面包括业务网络和心跳网络。业务网络负责应用连接带宽和防火墙策略要提前规划心跳网络是节点之间交换锁信息和一致性信息的专用通道延迟要求极高必须走独立的物理网段别跟业务流量混在一起。我见过有项目图省事把心跳和业务都放在同一个交换机下结果一个流量高峰就让心跳超时节点互相误判整个集群都被踢掉过。实例平面就是那三个数据库节点每个节点上有独立的数据库服务进程它们运行的是同一个数据库通过共享存储访问同一份数据文件。节点之间必须有唯一的实例标识端口也不能冲突。这里的核心难点是缓存一致性管理一个节点修改了数据页其他节点怎么拿到最新版本DMDSC靠的是内部通信机制来同步锁和缓冲区版本这也是为什么心跳网络那么重要。存储平面是整个DMDSC的地基一般用磁盘阵列或者分布式存储池。存储需要支持被所有节点同时挂载并且权限要一致。这里有个容易踩的坑两个节点的系统用户ID不一致导致对同一块共享磁盘的访问权限不一样后启动的节点直接起不来。所以部署前一定要统一各节点的基础配置。2.2 备集群与DataWatch的角色分布架构图右侧通常是备集群或单点备库。备库的硬件配置可以比主集群低一些因为它平时不处理写请求但数据容量和日志缓存能力不能太弱否则同步会跟不上。DataWatch组件在图上一般分散成三种角色。数据库守护进程跑在每个数据库节点上负责监控节点状态、数据库状态、网络状态并向监视器上报。守护进程之间也有通信比如主库守护进程会确认备库守护进程的实时状态这个信息是切换决策的重要依据。监视器则是独立的它不跟数据库实例直接通信而是通过守护进程间接掌握全局状态。这里有个容易混淆的点备库可以不加入DMDSC集群比如备库就是一台独立数据库实例一样可以被DataWatch管理。所以在架构图上你会看到备库的那一侧没有共享存储也没有多个节点只有一个单实例数据库和一套守护进程。虽然看起来简单但它在容灾中承担着最终兜底的角色。2.3 主备同步的数据流转路径主库产生的redo日志会先写入主库的联机日志文件然后通过MAL通信模块实时传送到备库对应的通信模块。备库收到日志后在自己的redo日志和物理数据页上重演保持与主库的一致。注意这个日志是不可以跨级传递的主集群内部的DMDSC节点之间共享同一个数据库因此主集群对外是一个逻辑主库只有一台节点对外提供写服务其他节点作为读扩展或故障热备。同步模式的选择直接影响RPO和性能。实时同步模式下主库提交事务时会等待备库确认能保证不丢数据但会增加一笔网络往返延迟对跨机房专线的带宽和稳定性要求很高。归档同步模式则是主库异步发送日志性能影响很小但主库故障时可能来不及传走最近一段日志造成数据丢失。架构图上一般用虚线或实线箭头表示日志流箭头方向永远是主库指向备库。切换发生后原备库成为新主库日志流向会整体反转这个细节在架构图里通常不会画出来但你要懂。2.4 故障切换的核心判断路径当主集群整体故障时切换到备库不是简单的一句“把备库启动起来”中间有一堆状态判断。监视器会不断向主备守护进程发起状态询问如果它连续若干次都没收到主库守护进程的响应就会进入切换流程。切换前系统会确认两件事第一主库是否真的失效了不能因为一次网络抖动就误判第二备库的日志是否已经应用到了最新的可一致状态还是说丢了一段未同步日志在实时同步模式下备库一般能确保日志连续切换时数据几乎无丢失。但在归档同步模式下系统会提示你还差多少个日志文件没同步这时候如果强行切换就会丢数据。架构图上监视器同时连接主备两侧守护进程的线条就是用来收集这些状态信息的。自动切换的触发逻辑一般可以配置比如连续失败几次、超时多少秒才判定故障。我建议不要一上来就选“全自动”第一次部署先用半自动即监视器提示、DBA确认等运行业务稳定了再逐步放开到自动切换。理由很简单全自动切换涉及网络抖动误判、保护切换风暴等风险没有充分的演练和监控告警出事时更乱。3. 基于架构图落地部署的实操要点3.1 规划阶段要提前锁死的几件事不要看着架构图就急着装软件。我遇到过太多项目因为IP规划不合理后面改配置改到怀疑人生。先定清楚几件事。第一主集群有几个节点备集群是独立集群还是单节点建议生产环境主集群至少两个节点备集群最少也要有一台独立的备库。第二主备之间走专线还是普通局域网如果是跨机房同步专线的带宽和延迟必须达到实时同步的要求否则就别选实时同步模式。第三同步模式选实时还是归档这直接影响业务写入延迟和数据安全规划时就要让业务方拍板。第四切换触发由监视器自动完成还是由DBA手动确认后执行这个决策要写进运维规范。把这些内容写进设计文档然后在测试环境按1:1复现架构图。我见过有人直接在生产环境搞配置演练结果把主库搞挂了教训惨痛。测试环境规模可以缩小但网络拓扑、同步模式、切换逻辑必须跟生产一致才有参考价值。3.2 配置DMDSC集群时的关键操作顺序以一套两个节点的主集群为例。每台服务器都要安装数据库软件确认共享存储已经挂载并且能被两个节点同时识别。然后按节点独立配置文件比如数据库初始化参数文件、MAL通信配置文件。注意实例名的唯一性和MAL端口的分配不能跟业务端口冲突。启动顺序很有讲究。第一步先启动第一个节点让它完成初始化并确认共享存储上的数据文件已经生成。第二步再启动第二个节点观察它是否能正常找到共享存储中的数据库信息。如果你顺序搞反第二个节点可能直接报错提示找不到指定的数据文件或集群信息。启动过程中要打开日志跟踪看到节点间通信建立成功的提示再往下走。不要一次启动所有节点后再回头查日志那样容易把状态搞混。我自己的习惯是每启动一个节点就在另外一个终端执行查询命令确认当前集群已有节点数状态正常后再启动下一个。3.3 配置DataWatch守护和监视器的步骤主集群起来后再搭备库。备库的数据库文件可以从主集群的物理备份还原出来保证数据起点一致。这里要注意备库的数据文件路径最好跟主库一致否则后续日志应用容易报错。接下来配置守护相关文件包括MAL系统配置、守护进程配置、监视器配置。关键参数有守护组名主备库必须一致数据库角色主库设置为主库类型备库设置为备用类型MAL节点的IP、端口和通信超时时间。配置完以后启动顺序也有讲究先启动主库的守护进程再启动备库的守护进程最后启动监视器。顺序反了会导致备库守护进程连接主库失败或者监视器看不到任何节点。监视器配置里要指定观察的守护组名、连接数据库需要的账号、切换策略自动还是手动以及故障确认时间窗口。这里的确认时间窗口不要设得太短比如三秒就判定故障很容易让一次短暂网络闪断触发切换。建议根据专线的历史延迟数据来设置通常十秒到三十秒比较稳妥。3.4 部署完成后的验证与切换演练配置完成不代表收工必须做切换演练。最基本的演练至少包含三种场景。场景一关闭主集群中的一个节点观察应用是否自动连到另一个节点业务中断时间是多少。场景二模拟整个主集群失联比如直接拔掉主集群的网络观察监视器是否自动提升备库虚拟IP是否漂移成功。场景三恢复原来的主集群观察数据能否重新同步并且按预案决定是否需要回切。每次演练都要记录时间点算出RTO恢复时间目标和RPO数据恢复点目标跟预期值对比。如果RTO远高于设定值就要检查是不是监视器判定时间太长还是应用连接池刷新太慢。演练不是为了走流程而是为了暴露问题。第一次演练不成功太正常了关键是找到原因把故障场景固化到运维手册里。4. 真实环境中的常见问题与排查经验4.1 启动顺序导致的诡异问题DMDSC集群对启动顺序比较敏感。如果先把后续节点启动起来或者共享存储的权限没对齐后节点会直接报错根本找不到数据库系统。DataWatch也有类似现象如果先启动备库守护进程再启动主库守护进程备库守护进程会一直处于连接超时状态后续的日志同步也无法建立。我的排查习惯是每启动一个组件就去看对应的运行日志确认出现“启动成功”或“连接成功”的字样后再继续。不要只盯着屏幕输出那一两行很多启动失败的原因藏在日志末尾。比如节点间通信超时通常会记录在哪条消息等待超时共享存储权限不足会明确提示系统调用错误。4.2 网络抖动引发的误判和自愈真实环境里网络抖动是最让人头疼的问题。主集群内部的心跳网络如果闪断节点之间会互相认为对方失联从而触发节点驱逐和集群重建严重时整个集群需要重启。主备之间的专线闪断则可能让监视器误以为主库失联自动发起切换直接把业务全切到备库结果主库很快就恢复了两家互相抢造成脑裂。解决思路是合理设置超时参数和故障确认次数。心跳网络要独立别和业务流量交织主备之间的切换判定要增加确认窗口比如连续十次失败、持续三十秒无响应才判定主库失联。宁可多等几秒也不要因为一次闪断引发全局切换那才是真正的事故。4.3 主备切换后应用连接不切换的问题这是我见过最普遍的坑。数据库层面已经切换成功备库提升了虚拟IP也漂移了但应用还是大量报错连不上。原因往往出在中间件的连接池上应用连接池里缓存了旧的数据库连接地址或者虚拟IP的ARP缓存没刷新导致应用一直在尝试连接已经失效的地址。解决办法是设计初期就要确定应用连接使用虚拟IP或服务名并让连接池开启自动重连机制。切换演练时不能只盯着数据库日志还要把应用自身的前端页面或接口调用纳入演练范围验证应用能自动恢复连接。很多项目就是栽在这一点上数据库高可用做得再漂亮应用接不上也白搭。4.4 问题排查速查表我把这些年在现场遇到的高频问题整理成了一个小表格方便遇到情况时快速对照。症状可能原因检查项后节点启动报找不到数据文件共享存储权限不一致或挂载目录错误检查所有节点的挂载目录、系统用户权限、存储设备是否被正确识别节点间通信超时心跳网络配置错误、防火墙拦截、VLAN隔离用ping和telnet测试节点间心跳IP和MAL端口是否双向通主备同步中断MAL配置错误、备库空间不足、归档日志被意外删除查看同步日志中的具体报错信息以及文件系统使用率切换后监视器状态不一致监视器缓存了旧状态切换事件被忽略重启监视器进程重新拉取守护状态应用连接不上新主库连接池缓存旧地址、VIP漂移失败、防火墙策略未更新检查VIP是否已绑定到新主库节点应用连接池配置是否自动重连这个表不全面但覆盖了最容易让人原地崩溃的几个场景。真到了现场先按表格顺序排查基本能定位到八九成的问题。我还想强调一个容易被忽视的点备份和容灾是两套体系千万别混在一起。DMDSC加上DataWatch这类组合方案解决的是故障切换和容灾接管但它替代不了备份。备份是数据安全的最后一道防线。就算你上了全套高可用方案日常备份策略该怎么做还得怎么做定期做恢复演练这个习惯比任何架构图都值钱。根据我个人在实际项目里的经验这套组合方案的落地难度往往不在技术本身而在于整个团队有没有把架构图里的每个环节吃透。先说一个我自己常用的做法把架构图贴在项目机房的墙上然后挨个确认每个IP、每个端口、每个进程、每条切换路径标注负责人和联系电话。这张图挂在墙上时间长了大家心里都有数真正出故障时才不会乱成一团。最后分享一个小技巧每次切换演练完把监视器日志和守护进程日志里的关键时间点都摘出来做一张“时间轴对照表”。下次演练时把两张表放在一起对比一旦某个环节比上次明显慢了你就能提前知道哪里可能有性能退化。高可用系统是需要定期保养的演练不仅要验证能不能切还要验证切得快不快。这套组合方案最终值不值得上线就看你在这个时间轴上的数字能不能让业务方点头。