达梦的读写分离集群底层依赖数据守护(DataWatch)机制。简单来说,主库(Primary)负责所有的写入和修改操作,备库(Standby)在实时同步主库数据的同时,帮主库分担查询(SELECT)的压力。
• 主库(PRIMARY):唯一可以读写的库,产生 REDO 日志并推给备库
• 实时备库(STANDBY + GLOBAL 守护):实时接收 REDO、只读,主库挂了它能接管
• 异步备库(STANDBY + LOCAL 守护):定时接收归档日志、只读,纯容灾用,不参与自动切换
| 配置项 | 主库 | 实时备库 | 异步备库 |
|---|---|---|---|
| 业务 IP | 192.168.244.131 | 192.168.244.132 | 192.168.244.133 |
| 心跳 IP | 192.168.244.131 | 192.168.244.132 | 192.168.244.133 |
| 实例名 | DW1_01 | DW1_02 | DW1_03 |
| 实例端口 | 5236 | 5236 | 5236 |
| MAL 端口 | 5336 | 5336 | 5336 |
| MAL 守护进程端口 | 5436 | 5436 | 5436 |
| 守护进程端口 | 5536 | 5536 | 5536 |
| INST_OGUID | 45331 | 45331 | 45331 |
| 守护组 | GDW1 | GDW1 | GDW1 |
| 安装路径 | /dmdbms | /dmdbms | /dmdbms |
| 实例路径 | /dmdata/data | /dmdata | /dmdata |
| 归档路径 | /dmdata/arch | /dmarch | /dmarch |
| 归档上限(MB) | 1024 | 1024 | 1024 |
| 确认监视器 IP | 192.168.244.134 |
注意:业务IP和心跳IP在生产环境中必须用不同的两个网卡分开,这样避免业务流量高峰期把心跳链路堵死导致误判故障。在学习环境中,我这边只有一个网卡,就使用同一个IP。
关闭防火墙
[root@dmdw01 ~]# systemctl stop firewalld.service
创建用户、用户组、目录和目录授权
groupadd dinstall -g 2001
useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
passwd dmdba
mkdir /dmdbms
mkdir -p /dmdata/data
mkdir -p /dmdata/arch
chown -R dmdba:dinstall /dmdbms
chown -R dmdba:dinstall /dmdata/data
chown -R dmdba:dinstall /dmdata/arch
将服务IP修改为静态,删除uuid
vi /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
# BOOTPROTO=dhcp改为BOOTPROTO=static
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens160
#UUID=d6106c0d-9798-4a04-8810-17c6919f0973
DEVICE=ens160
#ONBOOT=no改为ONBOOT=yes
ONBOOT=yes
##IPADDR配置相关的IPV4地址
IPADDR=192.168.244.131
#NETMASK配置对应的子网掩码
NETMASK=255.255.255.0
#GATEWAY配置对应的网关
GATEWAY=192.168.244.1
#DNS1、DNS2配置对应的域名解析服务器
DNS1=8.8.8.8
修改文件打开最大数
vi /etc/security/limits.conf
# End of file
dmdba soft nice 0
dmdba hard nice 0
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft data unlimited
dmdba hard data unlimited
安装DM9数据库软件,但是不初始化实例
[root@localhost ~]# mount -o loop dm9_20260527_x86_kylin10_sp1_64.iso /mnt
[dmdba@localhost mnt]$ ./DMInstall.bin -i
将主库克隆三份(给实时备库和异步备库、确认监视器用)
VMware → 右键虚拟机 → 管理 → 克隆 → 创建完整克隆
每一台机器都需要修改IP和主机名(具体IP参照上述集群规划中的业务IP)
vi /etc/sysconfig/network-scripts/ifcfg-ens160
IPADDR=192.168.244.131
修改主机名
hostnamectl set-hostname dmdw01 # 192.168.244.131 机器
hostnamectl set-hostname dmdw02 # 192.168.244.132机器
hostnamectl set-hostname dmdw03 # 192.168.244.133机器
hostnamectl set-hostname dmdw04 # 192.168.244.134机器
修改IP后需要重启vm
[dmdba@dmdw01 ~]$ /dmdbms/bin/dminit PATH=/dmdata/data INSTANCE_NAME=DW1_01 PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=********** SYSAUDITOR_PWD=**********
注意:页大小初始化后就不可以修改了
前台启动实例
[dmdba@dmdw01 ~]$ /dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini
# 新开一个终端会话连进去
[dmdba@dmdw01 ~]$ /dmdbms/bin/disql sysdba/**********:5236
-- 先切到 MOUNT 模式,很多参数只有在 MOUNT 状态才能改
SQL> ALTER DATABASE MOUNT;
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); -- 守护进程心跳间隔
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0); -- 禁止手工切换主备角色,防止误操作
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); -- 允许备库表空间脱机
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); -- 开启 MAL 通信,集群必须开
SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1); -- 开启归档,集群必须开
SQL> SP_SET_PARA_VALUE (2,'TIMER_INI',1); -- 开启定时器,给异步归档用
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64); -- 监控发送/应用日志的滑动窗口大小
SQL> ALTER DATABASE OPEN;
关闭实例----刚刚临时开启实例的窗口Ctrl+c
接下来脱机备份—后续给两个备库做初始化数据用,保证数据一致性
[dmdba@dmdw01 bin]$ /dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini' FULL BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE' PARALLEL 4"
[dmdba@dmdw01 bin]$ vi /dmdata/data/DAMENG/dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL # 本地归档,必须有,是其他归档的"原材料"
ARCH_DEST = /dmdata/arch # 本地归档存放路径
ARCH_FILE_SIZE = 128 # 单个归档文件大小,单位 MB
ARCH_SPACE_LIMIT = 1024 # 归档总上限,超了会自动清理最老的,单位 MB
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档,主库每次 COMMIT 都会实时推给备库
ARCH_DEST = DW1_02 # 目标是实时备库的实例名(不是 IP!)
[ARCHIVE_ASYNC]
ARCH_TYPE = ASYNC # 异步归档,按定时器批量推
ARCH_DEST = DW1_03 # 目标是异步备库的实例名
ARCH_TIMER_NAME = TIMER1 # 关联哪个定时器(在 dmtimer.ini 里定义)
注意:ARCH_WAIT_APPLY和ARCH_DEST
ARCH_WAIT_APPLY = 0 (高性能模式)
行为:这是默认值。采用高性能模式时,主库收到一个事务提交请求,会将Redo日志发送给备库,只要备库确认“收到”日志,主库就会立即响应客户端“提交成功”,而不会等待备库真正把日志“重演(Apply)”完。
结果:主库的响应速度最快,系统整体吞吐量高。但代价是,备库的数据更新可能比主库略有延迟(通常在秒级以内),如果此时去备库查询,可能读不到刚刚在主库提交的最新数据。
ARCH_WAIT_APPLY = 1 (事务一致模式)
行为:采用事务一致模式时,主库会等待备库不仅收到Redo日志,还必须完成日志重演,并回复主库后,主库才会向客户端确认“提交成功”。
结果:这保证了主库和备库的数据在任何时刻都是强一致的,你在主库写入数据后,立刻去备库查询也一定能看到。但代价是每个写事务的提交响应时间会变长,对数据库性能有一定影响
ARCH_DEST 填的是实例名,不是 IP 或主机名。系统通过 dmmal.ini 里的实例名去查对应的 IP。这个设计的好处是切换后不用改归档配置,因为实例名不变。
dmmal.ini文件是通讯配置文件,每个主库和备库必须都一致,不然无法通讯
[dmdba@dmdw01 DAMENG]$ vi /dmdata/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 # MAL 链路心跳检测间隔,秒
MAL_CONN_FAIL_INTERVAL = 10 # 超过这个时间收不到响应,判定链路断开
MAL_TEMP_PATH = /dmdata/data/malpath/ # 日志传输的临时缓冲目录,要提前建好
MAL_BUF_SIZE = 256 # 单个 MAL 连接的缓冲大小,单位 MB
MAL_SYS_BUF_SIZE = 1024 # MAL 系统总缓冲上限,单位 MB
MAL_COMPRESS_LEVEL = 0 # 日志压缩等级,0 不压缩,跨地域传输可以考虑开
[MAL_INST1]
MAL_INST_NAME = DW1_01 # 实例名,与 dm.ini 中 INSTANCE_NAME 对应
MAL_HOST = 192.168.244.131 # 心跳 IP,用于日志传输和守护通信
MAL_PORT = 5336 # MAL 监听端口,用于实例间日志传输
MAL_INST_HOST = 192.168.244.131 # 业务 IP,应用程序连接数据库用
MAL_INST_PORT = 5236 # 业务端口,数据库对外服务端口
MAL_DW_PORT = 5436 # 守护进程对外监听端口(守护进程互联、监视器连接用)
MAL_INST_DW_PORT = 5536 # 实例监听守护进程的端口(守护向实例发指令用)
[MAL_INST2]
MAL_INST_NAME = DW1_02
MAL_HOST = 192.168.244.132
MAL_PORT = 5336
MAL_INST_HOST = 192.168.244.132
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST3]
MAL_INST_NAME = DW1_03
MAL_HOST = 192.168.244.133
MAL_PORT = 5336
MAL_INST_HOST = 192.168.244.133
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
注意:5336 是节点间传日志的,5436 是守护进程之间、守护进程和监视器握手的,5536 是守护进程向实例下命令用的(比如"你给我切换成 STANDBY")。三个端口职责完全不同。
[dmdba@dmdw01 ~]$ vi /dmdata/data/DAMENG/dmwatcher.ini
[GDW1]
DW_TYPE = GLOBAL # 全局守护,主库和实时备库用这个;异步备库用 LOCAL
DW_MODE = AUTO # AUTO=故障自动切换,MANUAL=故障手动切换
DW_ERROR_TIME = 20 # 多少秒收不到远端守护进程的心跳,认定对方故障,秒
INST_ERROR_TIME = 20 # 多少秒连不上本机实例,认定本机实例故障,秒
INST_RECOVER_TIME = 60 # 主库守护进程尝试恢复实例的间隔时间,秒
INST_OGUID = 45331 # 整个守护系统的唯一标识,所有节点必须相同!
INST_INI = /dmdata/data/DAMENG/dm.ini # 本机 dm.ini 路径
INST_AUTO_RESTART = 1 # 实例崩溃后守护进程自动拉起,生产必开
INST_STARTUP_CMD = /dmdbms/bin/DmServiceDW start
RLOG_SEND_THRESHOLD = 0 # 主库发送日志延迟告警阈值,0=关闭告警
RLOG_APPLY_THRESHOLD = 0 # 备库应用日志延迟告警阈值,0=关闭告警
[dmdba@dmdw01 ~]$ vi /dmdata/data/DAMENG/dmtimer.ini
[TIMER1]
TYPE = 2 # 按日执行模式
FREQ_MONTH_WEEK_INTERVAL = 1 # 间隔周/月数
FREQ_SUB_INTERVAL = 1 # 间隔天数
FREQ_MINUTE_INTERVAL = 1 # 间隔分钟数,这里设 1 分钟推一次
START_TIME = 00:00:00
END_TIME = 00:00:00 # 开始和结束都是 00:00:00 代表全天有效
DURING_START_DATE = 2026-07-10 00:00:01
DURING_END_DATE = 9999-12-31 23:59:59
NO_END_DATE_FLAG = 1
DESCRIBE = RT TIMER
IS_VALID = 1
其实就是个定时器,设置每隔多长时间同步一次归档日志。这里学习环境就设置为每分钟同步一次。如果是生产环境建议根据RPO来确定间隔时间
[dmdba@dmdw01 ~]$ scp -r /dmdata/data/DAMENG/dmdba@192.168.244.132:/dmdata/data/
[dmdba@dmdw01 ~]$ scp -r /dmdata/data/DAMENG/dmdba@192.168.244.133:/dmdata/data/
为什么不在备库重新 dminit,而是要拷贝?
两个原因:
# 用 root 执行
[root@dmdw01 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmserver -p DW -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
# 注册守护进程服务
[root@dmdw01 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
注意:注册数据库服务:-m mount 是关键!必须以 MOUNT 状态启动,如果以 OPEN 启动,数据库会开始产生 Redo 日志,破坏主备数据一致性
[dmdba@dmdw02 ~]$ vi /dmdata/data/DAMENG/dm.ini
[dmdba@dmdw02 ~]$ vi /dmdata/data/DAMENG/dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL # 本地归档,必须有,是其他归档的"原材料"
ARCH_DEST = /dmdata/arch # 本地归档存放路径
ARCH_FILE_SIZE = 128 # 单个归档文件大小,单位 MB
ARCH_SPACE_LIMIT = 1024 # 归档总上限,超了会自动清理最老的,单位 MB
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档,主库每次 COMMIT 都会实时推给备库
ARCH_DEST = DW1_01 # 指向主库---当发生切换时DW1_02变为主库,DW1_01变为备库,DW1_02要向DW1_01同步归档日志
[ARCHIVE_ASYNC]
ARCH_TYPE = ASYNC # 异步归档,按定时器批量推
ARCH_DEST = DW1_03 # 目标是异步备库的实例名
ARCH_TIMER_NAME = TIMER1 # 关联哪个定时器(在 dmtimer.ini 里定义)
[root@dmdw02 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmserver -p DW -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
[root@dmdw02 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
# 第一步:还原(用备份覆盖当前数据文件)
[dmdba@dmdw02 ~]$ /dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"
# 第二步:恢复(应用备份集中的归档日志,把数据推进到备份结束时)
[dmdba@dmdw02 ~]$ /dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"
# 第三步:更新数据库魔数(标记这是一个独立的数据库实体,区别于主库)
[dmdba@dmdw02 ~]$/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
[dmdba@dmdw03 ~]$ vi /dmdata/data/DAMENG/dm.ini
[dmdba@dmdw03 ~]$ vi /dmdata/data/DAMENG/dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL # 本地归档,必须有,是其他归档的"原材料"
ARCH_DEST = /dmdata/arch # 本地归档存放路径
ARCH_FILE_SIZE = 128 # 单个归档文件大小,单位 MB
ARCH_SPACE_LIMIT = 1024 # 归档总上限,超了会自动清理最老的,单位 MB
因为异步备库只接收归档日志,所以没有REALTIME和ASYNC
[dmdba@dmdw03 ~]$ vi /dmdata/data/DAMENG/dmwatcher.ini
[GDW1]
DW_TYPE = LOCAL # 异步备库用 LOCAL,本地守护,不参与全局切换决策,监视器不会选他当主库
DW_MODE = AUTO # AUTO=故障自动切换,MANUAL=故障手动切换
DW_ERROR_TIME = 20 # 多少秒收不到远端守护进程的心跳,认定对方故障,秒
INST_OGUID = 45331 # 整个守护系统的唯一标识,所有节点必须相同!
INST_INI = /dmdata/data/DAMENG/dm.ini # 本机 dm.ini 路径
INST_AUTO_RESTART = 1 # 实例崩溃后守护进程自动拉起,生产必开
INST_STARTUP_CMD = /dmdbms/bin/DmServiceDW start
[root@dmdw03 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmserver -p DW -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
[root@dmdw03 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
# 第一步:还原(用备份覆盖当前数据文件)
[dmdba@dmdw03 ~]$ /dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"
# 第二步:恢复(应用备份集中的归档日志,把数据推进到备份结束时)
[dmdba@dmdw03 ~]$ /dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"
# 第三步:更新数据库魔数(标记这是一个独立的数据库实体,区别于主库)
[dmdba@dmdw03 ~]$/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
[dmdba@dmdw04 ~]$ vi /dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 # 1=确认监视器,发起切换需要多数票(防脑裂的关键)
MON_LOG_PATH = ../log
MON_LOG_INTERVAL = 60 # 每 60 秒记录一次系统状态到日志
MON_LOG_FILE_SIZE = 256
MON_LOG_SPACE_LIMIT = 1024
[GDW1]
MON_INST_OGUID = 45331
MON_DW_IP = 192.168.244.131:5436 # IP 对应 MAL_HOST,端口对应 MAL_DW_PORT
MON_DW_IP = 192.168.244.132:5436
MON_DW_IP = 192.168.244.133:5436 # 异步备库也要加进来,纳入监控范围
[root@dmdw04 ~]# /dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdbms/bin/dmmonitor.ini
dmdw01
[dmdba@dmdw01 ~]$ /dmdbms/bin/DmServiceDW start
[dmdba@dmdw01 ~]$ /dmdbms/bin/disql SYSDBA/**********:5236
SQL> SP_SET_OGUID(45331); --先设置OGUID,告诉数据库自己属于哪个守护组
SQL> ALTER DATABASE PRIMARY; --声明该数据库是主库
dmdw02
[dmdba@dmdw02 ~]$ /dmdbms/bin/DmServiceDW start
[dmdba@dmdw02 ~]$ /dmdbms/bin/disql SYSDBA/**********:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
dmdw03
[dmdba@dmdw03 ~]$ /dmdbms/bin/DmServiceDW start
[dmdba@dmdw03 ~]$ /dmdbms/bin/disql SYSDBA/**********:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
dmdw01,dmdw02,dmdw03都需要执行
[dmdba@dmdw01 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
[dmdba@dmdw02 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
[dmdba@dmdw03 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
# 前台启动,能实时看到切换日志,调试时推荐
[dmdba@dmdw04 ~]$ /dmdbms/bin/dmmonitor /dmdbms/bin/dmmonitor.ini
# 后台启动
[dmdba@dmdw04 ~]$ /dmdbms/bin/DmMonitorServiceMonitor start
#启动,启动守护进程,数据库服务会自动被拉起
[dmdba@dmdw01 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
[dmdba@dmdw02 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
[dmdba@dmdw03 ~]$ /dmdbms/bin/DmWatcherServiceWatcher start
#停止
[dmdba@dmdw01 ~]$ /dmdbms/bin/DmWatcherServiceWatcher stop
[dmdba@dmdw02 ~]$ /dmdbms/bin/DmWatcherServiceWatcher stop
[dmdba@dmdw03 ~]$ /dmdbms/bin/DmWatcherServiceWatcher stop
[dmdba@dmdw01 ~]$ /dmdbms/bin/DmServiceDW stop
[dmdba@dmdw02 ~]$ /dmdbms/bin/DmServiceDW stop
[dmdba@dmdw03 ~]$ /dmdbms/bin/DmServiceDW stop
在客户端配置Windows通常在C:\Windows\system32下,Linux通常在/etc/下
TIME_ZONE=(480)
LANGUAGE=(CN)
# 服务别名,列出集群所有节点
DW1=(192.168.244.131:5236, 192.168.244.132:5236)
[GDW1]
CLUSTER=(GDW1) # 守护组名,对应 dmwatcher.ini 里的 [GDW1]
SWITCH_TIMES=(100) # 连接失败时重试次数
SWITCH_INTERVAL=(1000) # 重试间隔,毫秒
RW_SEPARATE=(1) # 开启读写分离,写请求路由主库,读请求路由备库
当主库发生故障时,我们可以使用手动切换模式或自动切换模式让备库接管:
手动切换模式:需要DBA通过监视器手动执行切换命令,让备库接管,不需要系统自动干预
自动切换模式:监视器会自动选举合适德备库来接管,该模式对网络稳定性要求极高,网络抖动很容易引发脑裂。
如果原来德主库修复重启后,会根据日志(LSN)等记录,自动判定是继续做主库,还是降级为备库重新加入集群
无论是备库是宕机还是因为网络、磁盘等原因响应变慢,主库都应该立即将其归档状态设置为无效状态(Invalid)并暂停同步,以防止拖慢主库德业务处理,总之备库故障时以保护主库为第一原则。
自动触发:备库重启或网络恢复后,主库守护进程会自动触发恢复流程,无需监视器或人工干预。
核心动作:主库向备库发送归档日志来同步历史数据。当有多个备库需要恢复时,系统支持动态并行恢复,大幅提升效率。
恢复完成:数据同步一致后,备库归档恢复为有效状态,主库短暂切为 Suspend 后立刻切回 Open,集群恢复正常。
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 同城双机房(延迟 ≤10ms) | 实时主备 | 低延迟 |
| 异地容灾(延迟 ≥50ms) | 异步备库 | 跨城延迟高,实时同步会拖慢主库 |
| 金融核心系统 | 实时主备 + 确认监视器 | 业务要求 |
| 报表/分析只读场景 | 异步备库开放只读 | 可接受数据轻微滞后,保护主库 |
| 升级演练/变更测试 | 在异步备库上折腾 | 不影响生产 |
文章
阅读量
获赞
