部署达梦8读写分离集群
一、原理
读写分离集群其实是主备集群的升级版本,在双机热备的基础上把用户写和读的会话事务分别放在主库和备库上执行。
写事务会被分发到主库上执行,读事务则部分分发到备库上执行,分发比例在dm_svc.conf中控制,如:RW_PERCENT=25,指的是25%的读分发到主库。
由接口负责读写事务的分发。读写分离集群是基于即时归档实现的高性能数据库集群,不但提供数据保护、容灾等数据守护基本功能,还具有读写操作自动分离、负载均衡等特性。
二、环境准备
1、服务器
服务器 主库IP:192.168.202.153 dm8数据库 实例名 :GRP1_RWW_01 端口号:5236
服务器 备库IP:192.168.202.154 dm8数据库 实例名 :GRP1_RWW_01 端口号:5236
2、创建用户和用户组,上传安装包
两个节点都需要。
3、安装达梦数据库管理系统
两个节点都需要。
4、安装达梦数据库
两个节点都需要。
5、启动达梦数据库
两个节点都需要。启动好后验证是否可以正常登录,验证成功后关闭disql和dmserver。
注意:配置读写分离集群之前,必须先通过备份还原方式同步各数据库的数据,确保各数据的数据保持完全一致。我就踩了这个坑,具体可以参考第十一步,备份还原!!!
三、配置主库GRP1_RWW_01
1、修改dm.ini文件
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16 INSTANCE_NAME = GRP1_RWW_01 PORT_NUM = 32141 #数据库实例监听端口 DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间 MAL_INI = 1 #打开 MAL 系统 ARCH_INI = 1 #打开归档配置 RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
2、配置dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致。 MAL_HOST 正常应该使用内部网络 IP,我虚拟机没加测试网卡,所以内外网都一样。 MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 [MAL_INST1] MAL_INST_NAME = GRP1_RWW_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.202.153 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.202.153 #实例的对外服务 IP 地址 MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = GRP1_RWW_02 MAL_HOST = 192.168.202.154 MAL_PORT = 61142 MAL_INST_HOST = 192.168.202.154 MAL_INST_PORT = 32142 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142
3、配置 dmarch.ini
[ARCHIVE_TIMELY1]
arch_wait_apply = 1 #是否需要等待备库做完日志,1 表示需要 事务一致性 ARCH_TYPE = REALTIME ARCH_DEST = GRP1_RWW_02 #即时归档目标实例名 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /home/dmdba/dmdbms/data/DAMENG/arch #本地归档文件存放路径 ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值 ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
4、配置 dmwatcher.ini
[GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453332 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dmdbms/data/DAMENG/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
5、配置文件存放位置
主库
6、启动主库
以 Mount 方式启动主库
cd /home/dmdba/dmdbms/bin
./dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount
7、设置 OGUID
切换会话,我是用root用户登录的。在disql中设置OGUID。
[root@dameng6 ~]#cd /home/dmdba/dmdbms/bin
[root@dameng6 bin]# ./disql sysdba@192.168.202.153:32141
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
系统通过 OGUID 值确定一个守护进程组。确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID
8、修改数据库模式
SQL>alter database primary;
四、配置备库GRP1_RWW_02
1、修改dm.ini文件
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16 INSTANCE_NAME = GRP1_RWW_02 PORT_NUM = 32142 #数据库实例监听端口 DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间 ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间 MAL_INI = 1 #打开 MAL 系统 ARCH_INI = 1 #打开归档配置 RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
2、配置 dmmal.ini
略,和主库的一样。
3、配置 dmarch.ini
[ARCHIVE_TIMELY1]
arch_wait_apply = 1
ARCH_TYPE = REALTIME
4、配置 dmwatcher.ini
[GRP1] DW_TYPE =GLOBAL #全局守护类型 DW_MODE = AUTO #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453332 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dmdbms/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 #指定备库重演日志的时间阈值,默认关闭
5、配置文件存放位置
备库
6、启动备库
以 Mount 方式启动备库
cd /home/dmdba/dmdbms/bin
./dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount
注意:我启动的时候报如下错误:
原因是我一开始按照单机的方式注册了服务启动了数据库,后来想到读写分离部署这样注册服务的,就把服务卸载的,结果忘记先用服务把数据库关闭了。
处理方式如下:
7、设置 OGUID
切换会话,我是用root用户登录的。在disql中设置OGUID。
[root@dameng7 ~]#cd /home/dmdba/dmdbms/bin
[root@dameng7 bin]# ./disql sysdba@192.168.202.154:32142
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
这里做错了一步,手欠exit;了,等下修改数据库模式还要用。
8、修改数据库模式
SQL>alter database standby;
SQL> select MODEinstance; --验证模式是否修改成功
注意:如果当前数据库不是 Normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); ----第 1 步
SQL>alter database standby; ----第 2 步
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); ----第 3 步
五、配置监视器dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式 MON_LOG_PATH = E:\DCA\rww\log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 [GRP1] MON_INST_OGUID = 453332 #组 GRP1 的唯一 OGUID 值 #以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置 #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT MON_DW_IP = 192.168.202.153:52141 MON_DW_IP = 192.168.202.154:52142
注意:我打算在windows上启动监视器,所以监视器日志路径配置的是win路径。
六、启动守护进程
启动各个主备库上的守护进程:
./dmwatcher /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open,并切换为 Open 状态。
七、启动监视器
进入E:\dmdbms\bin目录
dmmonitor.exe E:\DCA\rww\dmmonitor.ini
说明:我在我本地创建两台虚拟机用来测试部署读写分离集群的,监视器其实在主备库上配置也可以,但是最好配置在第三台机器上,所以我配置在了我本地。
如果监视器的配置文件放在Linux下,启动方式如下:
cd /home/dmdba/dmdbms/bin
./dmmonitor /home/dmdba/dmdbms/data/dmmonitor.ini
八、配置服务
两个实例都需要。
1、注册数据库实例服务
主库:
[root@dameng6 root]#cd /home/dmdba/dmdbms/script/root [root@dameng6 root]# ./dm_service_installer.sh -t dmserver -p GRP1_RWW_01 -dm_ini /home/dmdba/dmdbms/data/DAMENG/dm.ini -m mount Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceGRP1_RWW_01.service to /usr/lib/systemd/system/DmServiceGRP1_RWW_01.service. 创建服务(DmServiceGRP1_RWW_01)完成
备库:
[root@dameng7 root]#cd /home/dmdba/dmdbms/script/root [root@dameng7 root]# ./dm_service_installer.sh -t dmserver -p GRP1_RWW_02 -dm_ini /home/dmdba/dmdbms/data/DAMENG/dm.ini -m mount Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceGRP1_RWW_02.service to /usr/lib/systemd/system/DmServiceGRP1_RWW_02.service. 创建服务(DmServiceGRP1_RWW_02)完成
2、注册守护进程服务
主库:
[root@dameng6 root]# ./dm_service_installer.sh -t dmwatcher -p GRP1_RWW_01 -watcher_ini /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceGRP1_RWW_01.service to /usr/lib/systemd/system/DmWatcherServiceGRP1_RWW_01.service. 创建服务(DmWatcherServiceGRP1_RWW_01)完成
备库:
[root@dameng6 root]# ./dm_service_installer.sh -t dmwatcher -p GRP1_RWW_02 -watcher_ini /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceGRP1_RWW_02.service to /usr/lib/systemd/system/DmWatcherServiceGRP1_RWW_02.service. 创建服务(DmWatcherServiceGRP1_RWW_02)完成
3、注册监视器服务
在windows上我不会配置,如果是在linux下的话,配置方式如下:
[root@localhost root]# ./dm_service_installer.sh -t dmmonitor -p GRP1 -monitor_ini /home/dmdba/dmdbms/data/DAMENG/dmmonitor.ini
九、服务方式启动
注意:启动的话最好用dmdba用户,因为注册脚本只能用root用户,所以注册完后最好把脚本权限赋给dmdba,我这里没赋。
主库:
systemctl start DmServiceGRP1_RWW_01
systemctl start DmWatcherServiceGRP1_RWW_01
备库:
systemctl start DmServiceGRP1_RWW_02
systemctl start DmWatcherServiceGRP1_RWW_02
注意,我启动好后连接报如下错误:
查看监视器发现没有什么问题
查看dmmal.ini发现是我端口号输错了。
十、故障重连
在dm_svc.conf中,配置一个名为 dw_svc 的连接服务名,使用 dw_svc 连接数据守护中的数据库,即可实现故障自动重连。
dw_svc=(192.168.202.153:32141,192.168.202.154:32142) TIME_ZONE=(+480) #表示+8:00 时区 LOGIN_ENCRYPT=(0) DIRECT=(Y) [dw_svc] TIME_ZONE=(+540) #表示+9:00 时区 LOGIN_MODE =(1) #检测到数据库实例故障时,接口在服务器之间切换的次数 SWITCH_TIME=(3) #表 示 在 服 务 器 之 间 切 换 的 时 间 间 隔 , 单 位 为 毫 秒 SWITCH_INTERVAL=(1000) #指定是否启用读写分离。0 表示不启用读写分离;1 表示启用读写分离,默认值为 0 RW_SEPARATE=(1) #读写分离分发比例 30%读操作分发到主库 RW_PERCENT=(30)
我在我本地配置的dm_svc.conf,所以在本地测试用服务名连接。
十一、备份还原
我在想测试备份还原的时候,发现主库和备库都是mount状态,正常读写分离集群配置好后会自动open数据库的。研究了半天发现是因为我在配置读写分离集群的时候少了一个步骤,没有备份主库去还原备库。我一开始想着,主库和备库都是新初始化的,应该不用做备份还原操作了吧,后来发现不行。
处理方式如下:
1、 停掉主库和备库的watch和实例
注意步骤!!!
备库
./DmWatcherServiceGRP1_RWW_02 stop
主库
./DmWatcherServiceGRP1_RWW_01 stop
./DmServiceGRP1_RWW_01 stop
备库
./DmServiceGRP1_RWW_02 stop
2、 在主库上备份并把备份文件拷贝到备库
[root@dameng6 bin]# ./dmrman dmrman V8 RMAN> backup database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' backupset '/home/dmdba/A'; [root@dameng6 bin]# cd /home/dmdba/ [root@dameng6 dmdba]# ls A dmdbms [root@dameng6 dmdba]# scp -r A dmdba@192.168.202.154:/home/dmdba
3、在备库上还原
[dmdba@dameng7 bin]$ ./dmrman dmrman V8 RMAN> restore database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' from backupset '/home/dmdba/A'; RMAN> recover database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' update db_magic;
4、在备库上重新设置为备库状态
5、启动
主库
./DmServiceGRP1_RWW_01 start
备库
./DmServiceGRP1_RWW_02 start
主库
./DmWatcherServiceGRP1_RWW_01 start
备库
./DmWatcherServiceGRP1_RWW_02 start
6、说明
在处理问题的时候顺便把备份还原测了,就不再单独写了。
在配置读写分离集群前,准备好安装环境,创建好数据库实例后,就应该先备份主库,用主库的备份集去还原备库!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)