文章目录
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