文章目录
1、部署规划
读写分离集群适合读多写少的应用环境
3节点读写分离集群部署规划(1写2读)
IP规划:
| 主机名 | 服务IP | 心跳IP | 数据库名 | 实例名 |
|---|---|---|---|---|
| dmdb01 | 192.168.8.131 | 192.168.8.131 | DAMENG | dmrw1 |
| dmdb02 | 192.168.8.132 | 192.168.8.132 | DAMENG | dmrw2 |
| dmdb03 | 192.168.8.133 | 192.168.8.133 | DAMENG | dmrw3 |
注意:
最好一台机器配置两张网卡,第一张作为服务IP供外部应用访问,第二张作为心跳IP供DM内部应用访问。(此处只使用一张网卡,故服务IP与心跳IP相同)
端口规划:
| 实例名 | 实例端口(监听外部应用) | MAL端口 | dmwatch端口 | 实例-dmwatch端口 |
|---|---|---|---|---|
| dmrw1 | 5236 | 61141 | 52141 | 33141 |
| dmrw2 | 5236 | 61141 | 52141 | 33141 |
| dmrw3 | 5236 | 61141 | 52141 | 33141 |
磁盘规划:(按实际需求调整磁盘空间)
| 磁盘 | LVM 磁盘名/用途 |
|---|---|
| /dev/sdc(100G) | /dev/dmappvg/dmapplv(数据库安装磁盘) |
| /dev/sde(500G) | /dev/dmdatavg/dmdatalv(数据磁盘) |
| /dev/sdf(500G) | /dev/dmbakvg/dmbaklv(备份磁盘) |
目录规划:(在对应服务器上创建目录 owner 为 dmdba 组为 dinstall)
| 目录 | 路径 |
|---|---|
| 数据库软件安装目录 | /opt/dmdbms |
| 实例安装目录 | /dmdata/data |
| 归档日志存放目录 | /dmdata/arch |
| 备份文件存放目录 | /dmbak/ |
注意:目录创建后,需执行以下命令
chown -R dmdba:dinstall /opt/dmdbms
chmod -R 775 /opt/dmdbms
chown -R dmdba:dinstall /dmdata/data
chmod -R 775 /dmdata/data
chown -R dmdba:dinstall /dmdata/arch
chmod -R 775 /dmdata/arch
chown -R dmdba:dinstall /dmbak
chmod -R 775 /dmbak
2、数据库软件安装
略。
3、读写分离集群配置
初始化实例
实例初始化(3个节点)
dminit path=/dmdata/data page_size=32 charset=1 log_size=2048
以主机dmdb01为读写分离主库,启动实例(dmdba用户)
dmserver /dmdata/data/DAMENG/dm.ini
出现system is ready后,ctrl + c停库
注:这样可快速启停库
脱机备份数据库
在主机dmdb01上执行以下命令,确认主库dmap服务已启动
ps -ef|grep dmap
若未启动,则切换到数据库软件安装目录的bin目录下执行以下命令
./DmAPService start
使用dmrman进行全库备份
dmrman
backup database '/dmdata/data/DAMENG/dm.ini' backupset '/dmbak/bakfull';
备份还原备库
将备份的文件/dmbak/bakfull拷贝到另外两台服务器上。
在主机 Dmdb02 和 Dmdb03 上
使用 dmrman 工具还原备库,dmdba 用户执行:
dmrman
进入 dmrman 工具交互界面
执行 restore:
restore database '/dmdata/data/DAMENG/dm.ini' from backupset '/dmbak/bakfull';
完成后执行 recover:
recover database '/dmdata/data/DAMENG/dm.ini' from backupset '/dmbak/bakful
最后执行 recover update db_magic。
recover database '/dmdata/data/DAMENG/dm.ini' update db_magic
修改dm.ini参数
所有节点都要修改,执行以下命令
vi /dmdata/data/DAMENG/dm.ini
主库 Dmdb01 上修改以下参数值:
INSTANCE_NAME = dmrw1
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
备库 Dmdb02 上修改以下参数值:
INSTANCE_NAME = dmrw2
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
备库 Dmdb03 上修改以下参数值:
INSTANCE_NAME = dmrw3
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
配置归档配置文件 dmarch.ini
在实例目录下新建文件 dmarch.ini,执行以下命令:
vi /dmdata/data/DAMENG/dmarch.ini
主库 Dmdb01 上添加以下内容:
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw2 #即时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw3 #即时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 102400 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
备库 Dmdb02 上添加以下内容:
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw1 #即时归档目标实例名(备库侧填写主库实例名)
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw3 #即时归档目标实例名(备库侧填写其他备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 102400 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
备库 Dmdb03 上添加以下内容:
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw1 #即时归档目标实例名(备库侧填写主库实例名)
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw2 #即时归档目标实例名(备库侧填写其他备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 102400 #单位 MB,0 表示无限制,范围 1024~4294967294 M
配置 MAL 系统配置文件 dmmal.ini
在实例目录下新建文件 dmmal.ini,执行以下命令。
vi /dmdata/data/DAMENG/dmmal.ini
主备库 3 个节点文件内容要相同。
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = dmrw1 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.8.131 #MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.8.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = dmrw2 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.8.132 # MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.8.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
[MAL_INST3]
MAL_INST_NAME = dmrw3 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.8.133 # MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.8.133 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
配置守护进程配置文件 dmwatcher.ini
在实例目录下新建文件 dmwatcher.ini,执行以下命令:
vi /dmdata/data/DAMENG/dmwatcher.ini
主备库 3 节点文件内容要相同。
[GRP_RW]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = MANUAL #手动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
以 Mount 方式启动数据库实例
使用 dmdba 用户,执行以下命令(主备库都执行):
dmserver /dmdata/data/DAMENG/dm.ini mount
注:当前还在测试部署中,用此命令起库即可,方便停库(ctrl + c)
在新的终端使用 disql 工具连接数据库:
./disql SYSDBA/SYSDBA
主备库都修改 oguid,执行以下命令:
sp_set_oguid(453331);
主库 Dmdb01 上修改数据库模式为 primary,执行以下命令:
alter database primary;
备库 Dmdb02 和 Dmdb03 上修改数据库模式为 standby,执行以下命令:
alter database standby;
启动守护进程
dmdba 用户下,到数据库安装目录的 bin 下执行以下命令(主备库都执行):
dmwatcher /dmdata/data/DAMENG/dmwatcher.ini
守护进程启动后,会将 Mount 的实例 Open
注:此方式启动即可,便于关闭dmwatcher
使用dmmonitor检查下配置是否正常
启动监视器(可以在任意节点配置)
守护进程配置为自动切换时,必须配置确认监视器。在主备服务器以外的服务器上(需安装有 DM 数据库软件,且与主备心跳网络端口开放)。
新建确认监视器配置文件 dmmonitor.ini,执行以下命令:
vi /dmdata/data/DAMENG/dmmonitor.ini
添加以下内容:
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /opt/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP_RW]
MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.8.131:52141
MON_DW_IP = 192.168.8.132:52141
MON_DW_IP = 192.168.8.133:52141
执行以下命令,启动监视器。
dmmonitor /dmdata/data/DAMENG/dmmonitor.ini
启动后输入 show
部署成功示例图

注册服务
以上启动为前台方式启动,仅用户搭建过程中验证配置。配置没问题后需要将实例,守护进
程和确认监视器注册为系统服务。
使用 root 用户,到数据库安装目录的 script/root 下
注册守护进程服务(主备库都执行)
./dm_service_installer.sh -t dmwatcher -p dmrw -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
注册数据库实例服务(主备库都执行):
./dm_service_installer.sh -t dmserver -p dmrw -dm_ini /dmdata/data/DAMENG/dm.ini
以服务方式启动
执行以下命令,启动数据库实例:
systemctl start DmServicedmrw
执行以下命令,启动守护进程
systemctl start DmWatcherServicedmrw
验证主备集群同步状态
监视器查看读写分离集群状态
集群任意节点,配置普通监视器配置文件 dmmonitor.ini,执行以下命令:
vi /dmdata/data/DAMENG/dmmonitor.ini
添加以下内容:
MON_DW_Confirm = 0 #普通监视器模式
MON_LOG_PATH = /opt/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP_RW]
MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.8.131:52141
MON_DW_IP = 192.168.8.132:52141
MON_DW_IP = 192.168.8.133:52141
执行以下命令,启动监视器:
./dmmonitor /dmdata/data/DAMENG/dmmonitor.ini
输入 show 命令查看集群状态
disql 客户端验证
使用 disql 客户端登录主库,创建测试表,插入数据,执行以下命令:
disql SYSDBA/SYSDBA@192.168.8.131:5236
SQL 提示符下执行以下命令:
create table test(id int);
insert into test values (1);
commit;
使用 disql 客户端登录备库,查询测试表验证,执行以下命令:
disql SYSDBA/SYSDBA@192.168.8.132:5236
SQL 提示符下执行以下命令:
select * from test;
disql SYSDBA/SYSDBA@192.168.8.133:5236
SQL 提示符下执行以下命令:
select * from test;
可用命令
vim不适合批量修改多台机器上的文件,下面为sed批量修改的命令
修改网卡配置
cd /etc/sysconfig/network-scripts
sed -i '/UUID/d' ifcfg-ens33
systemctl stop network
systemctl start network
nmcli con | sed -n '1,2p'
sed -i 's/dhcp/static/' 1.txt
修改主机名
hostnamectl set-newname dmdb01
hostnamectl set-newname dmdb02
hostnamectl set-newname dmdb03
系统配置文件
sed -i '$a vm.swappiness=10' /etc/sysctl.conf
sed -i '$a vm.dirty_background_ratio=0' /etc/sysctl.conf
sysctl -p
批量修改/etc/security/limits.conf
sed -i '$a dmdba soft nice 0' /etc/security/limits.conf
sed -i '$a dmdba hard nice 0' /etc/security/limits.conf
sed -i '$a dmdba soft as unlimited' /etc/security/limits.conf
sed -i '$a dmdba hard as unlimited' /etc/security/limits.conf
sed -i '$a dmdba soft fsize unlimited' /etc/security/limits.conf
sed -i '$a dmdba hard fsize unlimited' /etc/security/limits.conf
sed -i '$a dmdba soft nproc 65536' /etc/security/limits.conf
sed -i '$a dmdba hard nproc 65536' /etc/security/limits.conf
sed -i '$a dmdba soft nofile 65536' /etc/security/limits.conf
sed -i '$a dmdba hard nofile 65536' /etc/security/limits.conf
sed -i '$a dmdba soft core unlimited' /etc/security/limits.conf
sed -i '$a dmdba hard core unlimited' /etc/security/limits.conf
sed -i '$a dmdba soft data unlimited' /etc/security/limits.conf
sed -i '$a dmdba hard data unlimited' /etc/security/limits.conf
批量修改/etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft nice 0' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard nice 0' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft as unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard as unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft fsize unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard fsize unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft nproc 65536' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard nproc 65536' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft nofile 65536' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard nofile 65536' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft core unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard core unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba soft data unlimited' /etc/security/limits.d/20-nproc.conf
sed -i '$a dmdba hard data unlimited' /etc/security/limits.d/20-nproc.conf
批量修改/home/dmdba/.bash_profile
sed -i '$a export DM_HOME=/opt/dmdbms' /home/dmdba/.bash_profile
sed -i '$a export PATH=$PATH:$DM_HOME/bin' /home/dmdba/.bash_profile
sed -i '$a export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin' /home/dmdba/.bash_profile
启动实例
1、root用户
systemctl start DmServicedmdb
2、dmdba用户
dmserver /dmdata/data/DAMENG/dm.ini
4、部署过程中遇到的问题
部署读写分离集群三台机器的初始化:
先部署第一台机器(只安装了操作系统),通过克隆虚拟机的方式部署后两台
问题1:
克隆的机器网卡的UUID一致,无法正常使用
办法1:
删除网卡配置文件中的UUID后重启网卡,根据命令获取网卡真实的UUID并修改配置文件
问题2:
修改完oguid和数据库模式后,启动dmwatcher,实例没有从mount变为open
办法2:
由于主从之间需要交互,需关闭防火墙。
dmwatcher日志如下:
2021-10-15 19:02:01.819 [INFO] dmwatcher P0000049897 T0000139833215907648 DMWATCHER[4.0] group(GRP_RW) initialized succeed.
GUID(DCE5E18EDCE5E18E5D13B88A7841ABD7)
2021-10-15 19:02:01.824 [INFO] dmwatcher P0000049897 T0000139833215907648 DMWATCHER[4.0] IS READY
2021-10-15 19:02:02.823 [INFO] dmwatcher P0000049897 T0000139833105229568 dw2_send_port_set to dmserver vio(3) set, mid(-1), to name:DMRW1, ip:127.0.0.1
2021-10-15 19:02:02.825 [ERROR] dmwatcher P0000049897 T0000000000000049902 Can't connect to DM server on '192.168.8.132' port(52141) errno(113)
2021-10-15 19:02:02.827 [ERROR] dmwatcher P0000049897 T0000000000000049903 Can't connect to DM server on '192.168.8.133' port(52141) errno(113)
2021-10-15 19:02:02.831 [INFO] dmwatcher P0000049897 T0000139833096808192 dw2_group_process_svr_info_low, receive ep(seqno:0, master:0, n_ok:0) message, change ep(DMRW1) status from ERROR to OK.
2021-10-15 19:02:02.832 [INFO] dmwatcher P0000049897 T0000139833096808192 Local db apply info changed, old info[p_db_magic:0, n_apply_ep:0], new info to set[p_db_magic:333042144, n_apply_ep:0]!
2021-10-15 19:02:02.832 [INFO] dmwatcher P0000049897 T0000139833096808192 dw2_process_ohis_info, n_ohis changed from 0 to 1, from_ep:DMRW1, ep_seqno:0, hpc_master:0
2021-10-15 19:02:02.833 [INFO] dmwatcher P0000049897 T0000139833096808192 dw2_process_ohis_info local apply info, p_db_magic:333042144, n_apply_ep:0, n_fill_ep:1 pkg_seq_arr:[4243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], apply_lsn_arr:[24277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]!
2021-10-15 19:02:02.833 [INFO] dmwatcher P0000049897 T0000139833096808192 Server(DMRW1) public key changed, broadcast new value to monitor
2021-10-15 19:02:12.844 [INFO] dmwatcher P0000049897 T0000000000000049903 dm_connect_async connection 6 is in progress
2021-10-15 19:02:12.847 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is in progress
2021-10-15 19:02:22.855 [INFO] dmwatcher P0000049897 T0000000000000049903 dm_connect_async connection 6 is timeout
2021-10-15 19:02:22.859 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is timeout
2021-10-15 19:02:43.913 [INFO] dmwatcher P0000049897 T0000000000000049903 dm_connect_async connection 6 is in progress
2021-10-15 19:02:44.912 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is in progress
2021-10-15 19:02:46.925 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is failed
2021-10-15 19:02:53.924 [INFO] dmwatcher P0000049897 T0000000000000049903 dm_connect_async connection 6 is timeout
2021-10-15 19:03:07.966 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 6 is in progress
2021-10-15 19:03:09.981 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 6 is failed
2021-10-15 19:03:40.061 [INFO] dmwatcher P0000049897 T0000000000000049903 dm_connect_async connection 6 is in progress
2021-10-15 19:03:41.045 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is in progress
2021-10-15 19:03:43.061 [INFO] dmwatcher P0000049897 T0000000000000049902 dm_connect_async connection 7 is failed
从日志的报错可以发现,主从之间的连接有问题,很可能是被防火墙拦截了,关闭防火墙后问题解决。
达梦云适配中心:
https://eco.dameng.com
达梦读写分离集群部署
本文介绍了一种适用于读多写少应用场景的达梦数据库读写分离集群部署方案,包括详细步骤如IP规划、端口规划、磁盘及目录规划、数据库软件安装等,并记录了部署过程中遇到的问题及解决方案。
940

被折叠的 条评论
为什么被折叠?



