目录
一、概念
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.131 | 192.168.159.132 |
心跳IP | 192.168.159.131 | 192.168.159.132 |
实例名 | DMOA_M | DMOA_S |
实例端口 | 5236 | 5236 |
MAL端口 | 5336 | 5336 |
MAL守护进程端口 | 5436 | 5436 |
守护进程端口 | 5536 | 5536 |
OGUID | 45331 | 45331 |
守护组 | GRP1 | GRP1 |
安装目录 | /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.ini、dmmal.ini、dmwatcher.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;