守护主备集群与读写分离集群的搭建
2026/7/31 16:51:57 网站建设 项目流程

目录

一、概念

1、什么是守护主备集群?

2、什么是读写分离集群?

二、集群规划

三、机器1的配置(主机)

1、初始化主机实例

2、开启归档与备份

3、修改dm.ini配置文件

4、修改dmarch.ini文件

5、创建dmmal.ini文件

6、创建dmwatcher.ini文件

7、拷贝备份文件

8、注册服务

四、机器2的配置(备机)

1、初始化实例

2、恢复数据

3、配置/创建相关文件

4、注册服务

五、监视器的配置

1、配置监视器

2、主备切换

六、读写分离搭建

七、总结


一、概念

1、什么是守护主备集群?

定义:由多台机器组成的“主-备”架构。主机对外提供全部读写服务,备机实时同步数据。一旦主机发生宕机或网络中断,备机将在秒级内切换为主节点接管业务。

核心机制:

  • 心跳检测:主备节点通过专用链路持续通信,判断节点是否存活;

  • 数据同步:主机将业务产生的REDO日志实时传输给备机,确保主备节点数据一致;

  • 故障切换:当心跳超时,备机自动升级为主机并继续对外提供服务;

局限:备机平时处于“只读”或不可用状态,资源利用率较低(仅50%)。只解决“机器坏了不停服务”的问题,无法解决高并发下的查询瓶颈。

2、什么是读写分离集群?

定义:主库负责写事务(增删改),从库负责读事务(查)。通过读写分离模式极大提升系统整体吞吐量。

核心机制:

  • 流量分发:应用程序/中间件根据SQL类型,将写操作发往主库,读操作发往从库。

总结:读写分离集群 = 守护主备集群 + SQL自动路由,它是在保障高可用的基础上,实现了读写负载均衡。

二、集群规划

本文实战采用经典的两节点架构(一台主机 + 一台备机),提前规划好IP、端口及实例名。

机器1

机器2

业务IP

192.168.159.131192.168.159.132

心跳IP

192.168.159.131192.168.159.132

实例名

DMOA_MDMOA_S

实例端口

52365236

MAL端口

53365336

MAL守护进程端口

54365436

守护进程端口

55365536

OGUID

4533145331

守护组

GRP1GRP1

安装目录

/home/dmdba/dmdbms/home/dmdba/dmdbms

实例目录

/dmdata/data/dmdata/data

三、机器1的配置(主机)

1、初始化主机实例

进入达梦bin目录下使用dminit工具初始化数据库。

cd /home/dmdba/dmdbms/bin

./dminit PATH=/dmdata/data INSTANCE_NAME=DMOA_M PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=****** SYSAUDITOR_PWD=******

2、开启归档与备份

首先启动前台服务,然后通过disql工具开启归档与备份。

./dmserver /dmdata/data/DAMENG/dm.ini

开启本地归档。

./disql SYSDBA/*****@1localhost:5236

SQL> ALTER DATABASE MOUNT; # 将数据库挂载

SQL> ALTER DATABASE ARCHIVELOG; # 将数据库改为归档模式

SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdata/data/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200'; # 开启本地归档

SQL> ALTER DATABASE OPEN; # 将数据库还原为OPEN模式

进行全局备份用于备节点数据同步。

SQL> BACKUP DATABASE BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE';

3、修改dm.ini配置文件

通过数据库内置存储过程修改dm.ini参数,其中MAL_INI=1开启MAL通信链路。

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);

SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);

4、修改dmarch.ini文件

归档配置是本地归档+实时归档,本地归档用于本地日志留存,实时归档用于将日志实时推送给备机DMOA_S使用如下命令编辑归档配置文件:

vi /dmdata/data/DAMENG/dmarch.ini

总体归档模式为高性能,定义本地归档与实时归档,本地归档填写归档路径,实时归档填写目标实例。

ARCH_WAIT_APPLY = 0 # 0:高性能 1:事务一致

[ARCHIVE_LOCAL]

ARCH_TYPE = LOCAL # 本地归档类型

ARCH_DEST = /dmdata/data/DAMENG/arch/ # 本地归档存放路径

ARCH_FILE_SIZE = 1024 # 单个归档大小,单位 MB

ARCH_SPACE_LIMIT = 51200 # 归档上限,单位 MB

[ARCHIVE_REALTIME1]

ARCH_TYPE = REALTIME # 实时归档类型

ARCH_DEST = DMAO_S # 实时归档目标实例名

5、创建dmmal.ini文件

MAL是达梦集群的内部通信协议。此处定义MAL链路信息、主备节点的IP、MAL端口以及守护进程监听端口,相当于构建一条集群专用的“数据传输公路”。

vi /dmdata/data/DAMENG/dmmal.ini

MAL_CHECK_INTERVAL = 10 # MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL = 10 # 判定MAL链路断开的时间

MAL_TEMP_PATH = /dmdata/data/malpath/ # 临时文件目录

MAL_BUF_SIZE = 512 # 单个MAL缓存大小

MAL_SYS_BUF_SIZE = 2048 # MAL 总大小限制

MAL_COMPRESS_LEVEL = 0 # MAL 消息压缩等级(0不压缩)

[MAL_INST1]

MAL_INST_NAME = DMOA_M # 实例名

MAL_HOST = 192.168.159.131 # MAL系统监听TCP连接的IP地址

MAL_PORT = 5336 # MAL系统监听TCP连接的端口

MAL_INST_HOST = 192.168.159.131 # 实例的对外服务IP地址

MAL_INST_PORT = 5236 # 实例对外服务端口

MAL_DW_PORT = 5436 # 守护进程监听TCP连接的端口

MAL_INST_DW_PORT = 5536 # 实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME = DMOA_S

MAL_HOST = 192.168.159.132

MAL_PORT = 5336

MAL_INST_HOST = 192.168.159.132

MAL_INST_PORT = 5236

MAL_DW_PORT = 5436

MAL_INST_DW_PORT = 5536

6、创建dmwatcher.ini文件

守护进程是实现自动故障切换的大脑。配置中DW_MODE=AUTO表示开启自动切换,INST_OGUID则是集群的唯一标识(需与备机一致),守护进程通过该ID识别合法成员。

vi /dmdata/data/DAMENG/dmwatcher.ini

[GRP1]

DW_TYPE = GLOBAL # 全局守护类型

DW_MODE = AUTO # MANUAL:故障手切,AUTO:故障自切

DW_ERROR_TIME = 20 # 远程守护进程故障认定时间

INST_ERROR_TIME = 20 # 本地实例故障认定时间

INST_RECOVER_TIME = 60 # 主库守护进程启动恢复的间隔时间

INST_OGUID = 45331 # 守护系统唯一 OGUID 值

INST_INI = /dmdata/data/DAMENG/dm.ini # dm.ini 文件路径

INST_AUTO_RESTART = 1 # 打开实例的自动启动功能

INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver

RLOG_SEND_THRESHOLD = 0 # 指定主库发送日志到备库的时间阈值

RLOG_APPLY_THRESHOLD = 0 # 指定备库重演日志的时间阈值

7、拷贝备份文件

将前面备份的全量文件拷贝到机器2,作为备机恢复的基础。

scp -r dmdata/data/DAMENG/bak/BACKUP_FILE dmdba@192.168.159.132:/dmdata/data/DAMENG/bak

8、注册服务

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMOA_M -dm_ini /dmdata/data/DAMENG/dm.ini -m mount

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini

四、机器2的配置(备机)

1、初始化实例

cd /home/dmdba/dmdbms/bin

./dminit PATH=/dmdata/data INSTANCE_NAME=DMOA_S PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=****** SYSAUDITOR_PWD=******

2、恢复数据

备机的数据恢复分为三个步骤

还原(RESTORE):将主机拷贝过来的全量备份文件中的数据页写入备机的数据文件;

./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"

恢复(RECOVER):将备份集中的归档日志(Redo日志)重演到数据文件中,使备库与主库在备份完成时刻的状态完全一致;

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/data/DAMENG/bak/BACKUP_FILE'"

更新魔数(UPDATE MAGIC):将备库的数据库魔数与备份文件中的魔数更新为一致;

./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

3、配置/创建相关文件

dm.inidmmal.inidmwatcher.ini这三个文件与机器1完全相同。dmarch.ini中的实时归档需要修改归档目标为主库实例名(DMOA_M):

ARCH_WAIT_APPLY = 0

[ARCHIVE_LOCAL]

ARCH_TYPE = LOCAL

ARCH_DEST = /dmdata/data/DAMENG/arch/

ARCH_FILE_SIZE = 1024

ARCH_SPACE_LIMIT = 51200

[ARCHIVE_REALTIME1]

ARCH_TYPE = REALTIME

ARCH_DEST = DMAO_M

4、注册服务

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMOA_S -dm_ini /dmdata/data/DAMENG/dm.ini -m mount

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini

所有配置完成后,依次启动主机和备机的数据库实例与守护进程。建议先启动数据库实例,再启动守护进程,确保守护进程能够正确识别实例的初始状态。

/home/dmdba/dmdbms/bin/DmServiceDMOA_M start

/home/dmdba/dmdbms/bin/DmServiceDMOA_S start

/home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start

五、监视器的配置

1、配置监视器

监视器负责监控集群所有节点的运行状态,并在主机故障时协调备机执行自动切换。建议在第三台独立机器上部署监视器:

vi /home/dmdba/dmdbms/bin/dmmonitor.ini

MON_DW_CONFIRM = 1 # 0:非确认(故障手切) 1:确认(故障自切)

MON_LOG_PATH = ../log # 监视器日志文件存放路径

MON_LOG_INTERVAL = 60 # 每隔 60s 定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 512 # 单个日志大小,单位 MB

MON_LOG_SPACE_LIMIT = 2048 # 日志上限,单位 MB

[GRP1]

MON_INST_OGUID = 45331 # 组GRP1的唯一OGUID值

MON_DW_IP = 192.168.159.131:5436 # 机器1的心跳IP和守护进程监听端口

MON_DW_IP = 192.168.159.132:5436 # 机器2的心跳IP和守护进程监听端口

通过前台方式启动:

cd /home/dmdba/dmdbms/bin

./dmmonitor ./dmmonitor.ini

正常启动后,监视器界面会显示类似如下信息:

也可注册为后台服务运行:

/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini

/home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start

2、主备切换

守护主备集群的核心价值在于自动故障切换,这里可以模拟主机宕机来验证这一能力。在机器1上手动停止数据库服务与守护进程,触发故障检测:

/home/dmdba/dmdbms/bin/DmServiceDMOA_M stop

home/dmdba/dmdbms/bin/DmWatcherServiceWatcher stop

此时备机守护进程在DW_ERROR_TIME时间内监测不到主机心跳,监视器与备机协商后将备机(DMOA_S)升为新主机,角色从STANDBY切换到PRIMARY。原主机(DMOA_M)手动恢复并重新加入集群后,它会被守护系统识别并降为备机,作为新主机的同步副本。

六、读写分离搭建

前面完成了守护主备集群搭建,读写分离集群是在此基础上,在客户端应用的配置文件添加如下内容:

vi /etc/dm_svc.conf

TIME_ZONE=(480)

LANGUAGE=(cn)

# 定义集群服务名

DMRW=(192.168.159.131:5236,192.168.159.132:5236,172.16.1.3:5236)

[DMRW]

LOGIN_MODE=(1) # 强制连接主库

RW_SEPARATE=(1) # 开启读写分离

RW_PERCENT=(0) # 完全读写分离

SWITCH_TIMES=(60) # 切换尝试次数

SWITCH_INTERVAL=(1000) # 切换间隔

七、总结

1、文章介绍了守护主备集群与读写分离集群的完整搭建流程;

2、配置确认监视器防止因网络分区导致集群出现脑裂;

3、更多细节及高级配置,请参阅达梦官方文档https://eco.dameng.com;

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询