尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Centos7 故障切换+双机热备(pacemaker+corosync+drbd)
一、需求与方案某项目准备两台服务器互为主备。主服务器承担系统核心业务运行、数据处理、节点调度、平台管理全功能备用服务器实时同步主服务器数据与业务状态支持故障自动/手动无缝切换切换后可完全接管主服务器所有业务无功能缺失。》 本文将采用drbd 来实现主备之间数据的实时同步结合pacemaker和corosync 来进行心跳检测、故障切换、处理脑裂即主挂了从切换为主后续主恢复后环境存在双主造成的数据不一致工具介绍drbddrbd的原理图如下 数据先写入文件系统再到缓存再到drbddrbd写入磁盘的同时将数据复制一份给从端drbd从端drbd再写入磁盘。通常采用的工作模式是同步数据安全性第一。工作模式1、实时同步两端写完才返回成功写入可以防止本地和远程数据丢失或者不一致2、异步复制本地写完后立刻返回成功写入数据发送buffer中可能丢失3、内存同步本地写成功并将数据发送到对方后立刻返回如果双机掉电数据可能丢失工具介绍pacemakercorosynccorosync的功能1、心跳检测每个节点定期发送心跳包通常是1秒1次如果某个节点连续多次都没有发包广播中的其他节点就会知晓它挂了自动进行切换2、消息广播Totem 协议集群中任何一个节点的状态变化都会通过 Totem 协议广播给所有节点Totem 保证消息有序、可靠地送达每个节点即使网络抖动也不会丢消息3、法定票数Quorum防止脑裂Split-Brain的核心机制简单理解集群中必须有超过一半的节点在线才能做决策pacemaker的功能1、集群信息库CIB - Cluster Information BaseXML格式的配置文件记录了有哪些节点、有哪些资源、资源之间的依赖关系、故障转移策略等所有节点上的 CIB 内容完全一致通过 Corosync 同步2、资源管理CRMd - Cluster Resource Manager这是 Pacemaker 的核心守护进程负责在每个节点上启动、停止、监控资源比如配置的 DRBD、文件系统、VIP、Java 服务都是它来管3、策略引擎PEngine - Policy Engine当集群状态发生变化时比如 master 挂了PEngine 会重新计算最优的资源分布方案然后生成一个执行计划Transition Graph交给 CRMd 执行4、隔离机制STONITH - Shoot The Other Node In The Head当某个节点疑似挂了但又不确定时通过电源管理IPMI、iDRAC 等强制把它断电防止脑裂导致两端同时写数据尤其是 DRBD 场景下这会导致数据灾难二、部署流程1、drbd 同步搭建根据业务场景 需要同步的目录是整个/home目录后续业务软件、数据库、存储都在这里规划如下主机名称node01主node02从IP192.168.1.181192.168.1.182挂载目录/home/home逻辑设备/dev/drbd0/dev/drbd0物理设备/dev/sdb1/dev/sdb1VIP192.168.1.188192.168.1.1881.1、安装drbd工具下面的操作主从都需要做无网络的话推荐制作本地仓库yun源进行下载具体方法参考如何使用yum离线安装软件_yum 离线安装icu-CSDN博客有网络的话使用2026年7月的话阿里巴巴开源镜像站的源下载的是drbd9其他网上的文章下载的是drbd84 还有用二进制源码编译的这里不介绍了yum install -y drbd安装后加载drbd驱动并添加开机自动加载modprobe drbd接下来要规划磁盘主从机器要做的分区大小要保持一致示例中我分别添加了一块5G 的硬盘两块盘的大小可以不一样但是分区大小要一样分区格式化fdisk后依次进行 n p 1 n 回车 回车 回车这里因为我只有5G所以就全分配了如果您的硬盘大小不一致我建议第二个空格改为 大小 单位的方式如100Gfdisk /dev/sdb最终效果不用格式化分别给主从配置主机名和地址解析测试连接更改主机名称hostnamectl set-hostname node01 # 181 上执行 hostnamectl set-hostname node02 # 182 上执行验证主机名是否配置完成1.2、配置drdb两个配置文件介绍/etc/drbd.d/global_common.conf # 全局配置文件/etc/drbd.d/*.res # 资源文件指定用哪个磁盘、挂哪个目录等备份原文件写入新文件下面直接复制粘贴即可mv /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.orig cat /etc/drbd.d/global_common.conf EOF global { usage-count no; } common { protocol C; #这里用同步模式 net { cram-hmac-alg sha1; shared-secret my-drbd-secret; } disk { on-io-error detach; } } EOF资源文件res要保证主从两端的配置文件内容一致注意on 后面的值要和您的主机名对应起来否则会报错找不到cat /etc/drbd.d/data.res EOF resource data { on node01 { device /dev/drbd0; disk /dev/sdb1; address 192.168.1.181:7788; meta-disk internal; } on node02 { device /dev/drbd0; disk /dev/sdb1; address 192.168.1.182:7788; meta-disk internal; } } EOF初始化drbdadm create-md data启动资源drbdadm up data配置开机自启systemctl enable drbd systemctl start drbd查看状态cat /proc/drbd这里要说明的一个事情主从同步的速度如何这个可以通过修改配置文件global文件进行调整数值统计千兆网口通常的速度为110MB/s建议先调整下这个再继续加完后重启drdb服务systemctl restart drbd现在指定主节点在master 192.168.1.181上执行drbdadm primary --force data再cat 看的时候就会发现已经变成了Primary/Secondary的关系并且正在同步块虽然文件系统是空的但是还是会同步块完成同步分区格式化只格式化主端即可mkfs.ext4 /dev/drbd0添加开机自动加载drbd驱动/etc/rc.local文件主断掉恢复后会出现独立模式手动触发连接后drbdadm connect data恢复在主192.168.1.181/home目录下传一些文件过一会儿我们将181 服务器直接关掉poweroff服务器宕机了去从节点上先切换角色为主drbdadm primary data然后挂载home看看数据仍在后续将从恢复成从主恢复后再去挂载drbd01.3、存在的问题是什么1、主从还得手动切换2、主恢复后网络中会出现两个主造成脑裂导致数据不一致3、不要在/etc/fstab中写drbd0的持久化挂载操作否则开机会挂载不上进入紧急模式。也不要写在/etc/rc.local文件中会导致rc-local 服务failed要解决上述问题就要引入本文介绍的第二套工具 packmaker2、pacemaker/corosync监测搭建2.1 安装pacemaker、corosync、pcs注册工具、drbd-pacemaker无网络建议制作本地仓库yum源进行部署同上yum install -y pacemaker corosync pcs # 开机自启动 systemctl enable pcsd --now systemctl start pcsd2.2 设置 hacluster 用户密码两端设成一样我这里设置的是123456pcs命令通过hacluster用户进行节点间认证。2.3 创建集群如果使用的yum源下载pcs默认版本是0.9 需要采用旧语法操作只需要在其中一台机器上执行指令就行了# 认证节点 pcs cluster auth node01 node02 -u hacluster -p 123456 # 创建集群 pcs cluster setup --name mycluster node01 node02 # 启动集群 pcs cluster start --all # 开机自启 pcs cluster enable --all # 查看状态 pcs status # 关闭 STONITH pcs property set stonith-enabledfalse下图表示集群创建完成只是No resources 没有资源2.4 配置drbd源先cat 检查是否同步2.5 配置 Pacemaker 资源# 第一步创建基础资源 pcs resource create drbd_data ocf:linbit:drbd \ drbd_resourcedata \ op monitor interval60s OCF_CHECK_LEVEL20 \ op monitor interval30s OCF_CHECK_LEVEL10 # 第二步升级为 Master/Slave 类型 pcs resource master drbd_data-master drbd_data \ meta master-max1 master-node-max1 clone-max2 clone-node-max1 notifytrue含义解释告诉集群DRBD 这个设备要管起来支持主从切换。# 创建一个叫drbd_data的资源使用 DRBD 这个资源代理 ocf:linbit:drbd是一个pacemaker 用来管理drbd的一个内置脚本pcs resource create drbd_data ocf:linbit:drbd \# 对应的资源文件 /etc/drbd.d/data.resdrbd_resourcedata \# 主每60秒检查依次drbd 从是30秒op monitor interval60s roleMaster \op monitor interval30s roleSlave \# 主从具体规则pcs resource master drbd_data-master drbd_data \meta master-max1 master-node-max1 clone-max2 clone-node-max1 notifytrue检查状态如果报错了就清理一下状态在主上执行pcs resource cleanup drbd_data再看状态就会发现drbd已经配置完成了由于前文我们已经格式化过drbd了所以就可以继续创建资源了2.6 创建文件系统资源注意fstype 要和之前drbd0 的分区格式对应上pcs resource create fs_home ocf:heartbeat:Filesystem \ device/dev/drbd0 \ directory/home \ fstypeext4 \ op monitor interval30s如果没对应上怎么办可以用下面的命令删除错误资源再重新创建pcs resource delete fs_home2.7 创建VIP虚拟IP资源这里无需指定网口仅指定IP即可pcs resource create vip ocf:heartbeat:IPaddr2 \ ip192.168.1.188 \ cidr_netmask24 \ op monitor interval30s2.8 设置约束# 1. 顺序约束先 DRBD 升为主再挂载文件系统最后漂 VIP pcs constraint order promote drbd_data-master then start fs_home pcs constraint order start fs_home then start vip # 2. 位置约束文件系统和 VIP 必须和 DRBD Master 跑在同一节点 pcs constraint colocation add fs_home with master drbd_data-master pcs constraint colocation add vip with master drbd_data-master2.9 检查最终状态pcs status从这张图我们可以看出master是node01slave是node02创建了vip资源drbd资源并且vip和drbd都是master node01 这个顺序是正确的目前状态良好。这里要说明的是如果我们采用了pacemaker 管理了drbd就不要再用drbdadm 命令进行管理了否则会出现混乱2.9 故障转移测试先检查当前主的状态将主关闭poweroff在从上看集群状态的时候会发现master 已经变成了node02 并且drbd和vip均已经转移此处因为主被关掉了所以drbd未知从是正常现象现在将主恢复会发现master仍然保持为node02 这是正确的drbd状态也好了做到这一步基本上完成80%3、上业务软件示例中的业务软件依赖于java、mysql 主从均已部署了mysql5.7 数据库未放在/home目录中因为如果故障转移的话很有可能会因为mysql进程占用而无法卸载drbd0导致出问题所以mysql在应用层单独配置这里演示主从复制的方法3.1 主从复制来都来了说说主从复制的原理主数据库 将操作写入二进制日志从读取主的二进制日志然后执行完成同步修改主数据库的配置文件开启二进制日志vim /etc/my.cnf systemctl restart mysqld登录数据库然后进行密码复杂性配置和创建用来同步的用户mysql -uroot -p123456 set global validate_password_policy0; set global validate_password_length4; create user tongbu% identified by 123456; grant all on *.* to tongbu; flush privileges; mysql SHOW BINARY LOGS; -------------------------- | Log_name | File_size | -------------------------- | master.000001 | 746 | --------------------------这里要记住主的二进制日志名称和size用于后续同步从的数据库应该是干净的才行如果不干净建议清理或者初始化为空便于导入数据库文件后能保持一致导出主的数据库并发到从# 导出主库 mysqldump -uroot -p123456 --lock-all-tables --all-databases all.sql # 发到从 scp all.sql 192.168.1.182:/opt现在修改从数据库的my.cnfvim /etc/my.cnf systemctl restart mysqld # 登录从进行导入 mysql -uroot -p123456 /opt/all.sql登录从数据库然后配置连接主start slave 后show slave 发现IO 和SQL并不都是yes说明未同步完成mysql change master to - master_host192.168.1.181, - master_usertongbu, - master_password123456, - master_log_filemaster.000001, - master_log_pos5249; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql start slave; Query OK, 0 rows affected (0.01 sec) mysql show slave status\G; *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.181 Master_User: tongbu Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master.000001 Read_Master_Log_Pos: 5249 Relay_Log_File: node02-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master.000001 Slave_IO_Running: No Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 5249 Relay_Log_Space: 154 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 10 Master_UUID: Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: 260721 04:44:42 Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified根据报错我们能够识别是Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. UUID一致导致的错误经过对比还真是处理方法先停掉slave 退出数据库删除stop slave; rm -rf /var/lib/mysql/auto.cnf systemctl restart mysqld mysql -uroot -p123456 mysql stop slave; Query OK, 0 rows affected (0.00 sec) mysql change master to - master_host192.168.1.181, - master_usertongbu, - master_log_filemaster.000001, - master_log_pos1373; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql start slave; Query OK, 0 rows affected (0.00 sec) mysql show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.181 Master_User: tongbu Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master.000001 Read_Master_Log_Pos: 1373 Relay_Log_File: node02-relay-bin.000002 Relay_Log_Pos: 317 Relay_Master_Log_File: master.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1373 Relay_Log_Space: 525 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 10 Master_UUID: 91ae74b0-839d-11f1-a4f1-000c295a34c3 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified上述命令重新同步了主注意二进制日志的pos可以在主上使用show binary logs;进行查看mysql SHOW BINARY LOGS; -------------------------- | Log_name | File_size | -------------------------- | master.000001 | 1373 | -------------------------- 1 row in set (0.00 sec)这下IO和SQL都是yes了这样就可以了测试在主写入mysql create database ceshi; Query OK, 1 row affected (0.00 sec)从上读完成测试mysql show databases; -------------------- | Database | -------------------- | information_schema | | ceshi | | mysql | | performance_schema | | sys | -------------------- 5 rows in set (0.00 sec)3.2 pacemaker接管业务主从两边部署业务软件配置文件写VIP示例中部署好的业务软件在/home目录下数据库用的是本地的3306 端口位置在/var/lib/mysql配置pacemaker含义比较简单pcs resource create # 这是语法创建hi_simulator 是名称 systemd 是对应services文件的名字 interval 是每30s监控一次pcs resource group add java_group 表示创建组包含4个服务pcs constraint 表示组和vip必须跑在同一个节点上必须先启动VIP再启动java_group组即那4个服务# 重新创建 pcs resource create hi_simulator systemd:HiSimulatorServer op monitor interval30s pcs resource create simpole_view systemd:SimpoleView op monitor interval30s pcs resource create simpole_server systemd:SimpoleServer op monitor interval30s pcs resource create hi_modellog_server systemd:HiModelLogServer op monitor interval30s # 重新设置约束如果用组的方式更简单 pcs resource group add java_group hi_simulator simpole_view simpole_server hi_modellog_server pcs constraint colocation add java_group with vip pcs constraint order start vip then start java_group # 清除失败记录 pcs resource cleanup hi_simulator pcs resource cleanup simpole_view pcs resource cleanup simpole_server pcs resource cleanup hi_modellog_serverXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX这里出了些逻辑上的问题大抵是夜深了脑子有些不清醒了上面我们做了pcs故障转移所以现在node02 是主node01 是从但是数据库是反过来的即node01 是主node02 是从这样便会导致如果我在node02 上运行了业务软件对应的数据库都在从上等node01 的数据库产生数据的时候node02 也会试图去同步因为它是从数据不一致了。因此数据库得做双主复制互相同步才行因此我们需要修改主从的配置文件(/etc/my.cnf)主从双主复制完成验证检查现在谁是主我这边是node01无论是谁去启动业务软件吧访问192.168.1.188:5511 可以成功运行现在将node01 关掉 进行故障转移测试 poweroff差不多10s再看就会发现所有资源已被node02 接管访问业务软件数据仍在至此完成了高可用架构的落地交付三、尾声通过drbd进行实时同步pacemaker 集群管理corosync 心跳检测 提高了业务的连续性夜深人静现在已是2152分祝愿读者您能顺利完成试验下个文章见
RELATED

相关推荐

LAMMPS fix vector 命令完全指南:全局标量序列存储、环形缓冲与扩散系数计算

LAMMPS fix vector 命令完全指南:全局标量序列存储、环形缓冲与扩散系数计算

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 fix vector 是 LAMMPS 中用于"时间序列数据积累"的核心输出工…

📅 2026/10/16 2:36:32
硬件项目开发相关知识

硬件项目开发相关知识

硬件项目开发相关知识样机阶段命名M16 A-CODE、M12G-X-CODE航空头含义M是什么意思A-Code/X-Code含义线缆按照能不能动分类线缆的弯折,拖链,扭转区别根据拖链次数区分按柔字分级(最常见)按宣传拖链次数分级样机阶段命名 硬件/整机…

📅 2026/10/16 2:36:32
数据库基础查询

数据库基础查询

1.建库建表2.插入数据mysql> use mydb8_worker; Database changed mysql> create table t_worker(-> department_id int(11) not null comment 部门号,-> worker_id int(11) primary key not null comment 职工号,-> worker_date date not null comment 工作时间…

📅 2026/10/16 2:36:32
MORE NEWS

更多资讯

📰

Spring Boot + Vue打造社区快递管理系统:从开题到落地全解析

做毕业设计或者课程项目开题的时候,最怕的就是题目选得又大又空,写起来没边,答辩的时候被老师一问就露馅。相比之下,“城南逸居快递之家管理系统”这种带着真实场景的题目,反而是很好落地的那种,因为它天然…

📰

告别404:公众号文章一键批量导出HTML与PDF的本地备份指南

做内容的人最怕的不是没人看,而是自己辛辛苦苦收藏的干货,某天忽然变成一个冷冰冰的 404。尤其是公众号里的文章,删除、迁移、账号异常、运营者手滑,任何一个小环节出问题,一篇文章就可能再也找不回来。我见过太多人等…

📰

STM32H7虚拟U盘方案:SDMMC+FATFS+USBMSC+FreeRTOS四件套实战

简介:面向嵌入式开发者的 STM32H7 虚拟U盘完整工程示例,集成 SDMMC、FATFS、USBMSC 与 FreeRTOS 四大模块,展示从 SD 卡高速读写到 USB Mass Storage 枚举的完整链路,适合学习存储接口、文件系统、USB 协议栈及多任务调度的中高级…

📰

JavaScript原型链一图搞懂:家族谱系法解析prototype与继承

1. 先聊聊“家族关系”这个比喻怎么来的JavaScript 的原型和原型链,几乎每个前端开发者在学了一段时间之后都会撞上这堵墙。你搜索“原型链面试题”,能翻出一大堆笔记和图解,但很多人看完依然是一脸茫然——prototype、__proto__、constructo…

📰

Java八大基本数据类型全解析:从内存占用到面试避坑

有些朋友学了几天 Java,还在犹豫先背知识点还是先敲代码,我觉得这问题本身就问反了。数据类型的核心用法就那么几条,你先把 8 大基本类型的特性、占位大小、取值范围、转换规则搞明白,后面读源码、调 bug、刷面试题都会顺手很多。…

📰

Spring Boot三层架构核心解析:职责边界、事务控制与常见坑

1. 三层架构的真面目:不只是分包那么简单我刚带项目组那会儿,最常被新人问的一个问题就是:“这代码到底该往哪一层写?”很多同学能背出“Controller是控制层、Service是业务层、Mapper是数据层”,可真到写代码的时候&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬