达梦技术社区:https://eco.dameng.com
DM数据库中,数据守护集群有两种方式:
- 主备模式
- 主备+ 读写分离模式
二者在部署方面的区别(以下会有具体说明):
- dmarch.ini 配置文件中,归档方式
- 主备模式使用realtime实时归档方式
- 读写分离模式使用timely即使归档方式
- dm_svc.conf
一、安装前准备
01| 集群规划
- A 与B节点的实例名不能相同
- oguid 类型为int,精度10,为保险可配置为8-9位随机数
业务线 | 守护组名 | OGUID | 服务器角色 | 业务IP | 心跳IP | 实例名 | 实例端口 (外部->dmserver) | MAL端口 (InsA->mal<-InsB) | watcher监听端口 (->dmwatcher) | Ins监听watcher端口 (InsA<-watcherA InsB<-watcherB) | 安装目录 | 实例目录 | 归档上限M | 说明 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
测试 | GDW1 | 83765937 | A-primary | 172.16.72.129 | 172.16.72.129 | dm03 | 5237 | 5337 | 5437 | 5537 | /home/dmdba/dmdbms | /home/dmdba/dmdata | 51200 | |
B-standby | 172.16.72.130 | 172.16.72.130 | dm03_B | 5237 | 5337 | 5437 | 5537 | /home/dmdba/dmdbms | /home/dmdba/dmdata | 51200 | ||||
C-monitor | 172.16.72.128 | 172.16.72.128 | - | - | - | - | - | /home/dmdba/dmdbms | - | - | ||||
02| 参数调整
# 调整内核参数
tee /etc/sysctl.d/dm.conf<<-"EOF"
fs.file-max = 6815744
fs.aio-max-nr = 1048576
# 控制共享内存页数,Linux页为4K,取值= (9/16物理内存大小)/4K
kernel.shmall = 2097152
#大于memory_target最大可设置成物理内存,这里是2G
kernel.shmmax = 2147483648
#最大共享内存段数量,通常不需要修改
kernel.shmmni = 4096
# 信号灯的相关配置,cat proc/sys/kernel/sem
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
vm.overcommit_memory = 1
# 关闭swap
vm.swappiness = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
EOF
sysctl -p
sysctl -p /etc/sysctl.conf
sysctl -q vm.swappiness
# 关闭swap
swapoff -a
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
# 调整limits.conf
ulimit -n65536
tee /etc/security/limits.d/dmdba.conf <<-'EOF'
* soft nice 0
* hard nice 0
* soft as unlimited
* hard as unlimited
* soft fsize unlimited
* hard fsize unlimited
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
* soft core unlimited
* hard core unlimited
* soft data unlimited
* hard data unlimited
EOF
sysctl -p
tee /etc/profile.d/dm.sh<<-"EOF"
ulimit -SHn 65536
IP=$(hostname -I|awk '{ print $1}')
PS1="\[\e[1;32m\]\u\[\e[m\]\[\e[1;33m\]@$(hostname) $IP\[\e[m\]\[\e[1;35m\] \t \[\e[m\][pwd:\w]\\$ "
EOF
source /etc/profile
# 调整login
sed -i '/pam_limits.so/d' /etc/pam.d/login
tee >>/etc/pam.d/login<<-"EOF"
session required /lib64/security/pam_limits.so
session required pam_limits.so
EOF
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 修改时区
tee /etc/sysconfig/clock <<-"EOF"
ZONE=Asia/Shanghai
EOF
rm -rf /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
systemctl stop firewalld
systemctl disable firewalld
# 或者调整防火墙
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="tcp" port="5237" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="tcp" port="5337" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="tcp" port="5437" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="udp" port="5537" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="udp" port="5437" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="udp" port="5337" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.72.0/24" port protocol="udp" port="5237" accept"
firewall-cmd --reload
二、软件安装
01| 安装DM软件(A\B\C 都安装)
yum install zip unzip -y
groupadd dinstall -g 2001
useradd -g dinstall dmdba -u2001
echo 'admin1234' | passwd dmdba --stdin
mkdir /home/dmdba/{dmdbms,dmdata} -p
chown -R dmdba:dinstall /home/dmdba/
mkdir /mnt/dm
mount /opt/dm*/dm8*.iso /mnt/dm
cd /mnt/dm
./DMInstall.bin -i
注意:这里需要用root用户执行脚本
sudo sh /home/dmdba/dmdbms/script/root/root_installer.sh
# 设置环境变量
cat >> /home/dmdba/.bash_profile <<-'EOF'
#export DM_HOME="/home/dmdba/dmdbms"
#export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${DM_HOME}/bin"
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
EOF
source /home/dmdba/.bash_profile
02| 配置服务器(A)
注意
以下三个参数一定要与客户确认好,在安装实例:
- CASE_SENSITIVE # 大小敏感(Y),可选值:Y/N,1/0
- CHARSET # 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
- LENGTH_IN_CHAR # VARCHAR类型长度是否以字符为单位(N),可选值:Y/N,1/0
dminit PATH=/home/dmdba/dmdata EXTENT_SIZE=32 PAGE_SIZE=32 LOG_SIZE=2048 DB_NAME=dm03 instance_name=dm03 port_num=5237 CASE_SENSITIVE=Y CHARSET=1 LENGTH_IN_CHAR=N
# 前台启动服务
cd $DM_HOME/bin/
dmserver /home/dmdata/dm03/dm.ini
设置归档(A)
# 新开一个session操作
# 设置归档
alter database mount;
ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdata/dm03/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
alter database archivelog;
alter database open;
# 备份
BACKUP DATABASE BACKUPSET 'BACKUP_FILE';
/*
注:
【这里可能出现的问题一】
BACKUP DATABASE BACKUPSET 'BACKUP_FILE';
[-718]:收集到的归档日志不连续.
【处理】
前台启动服务时使用绝对路径;使用相对路径会报这个错
【这里可能遇到的问题二】
[-7169]:bakres与DMAP消息通信失败.
【处理】
重启DmAPService,执行:DmAPService restart
*/
修改dm.ini参数,或者直接修改dm.ini
SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SP_SET_PARA_VALUE (2,'MAL_INI',1);
SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
--数据库兼容模式,默认0, 0:none, 1:SQL92, 2:Oracle, 3:MS SQL Server, 4:MySQL, 5:DM6, 6:Teradata
SP_SET_PARA_VALUE (2,'COMPATIBLE_MODE',2)
# 关闭前台服务
修归档配置
vi dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dmdba/dmdata/dm03/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
## 以下为添加内容-主备集群
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DM03_B #实时归档目标实例名
## 以下为添加内容-读写分离集群
#[ARCHIVE_TIMELY1]
# ARCH_TYPE = TIMELY #即时归档类型
# ARCH_DEST = DM03_B #即时归档目标实例名
创建dmmal.ini
- 如果服务器满足双网卡,两个IP就分别使用一个网卡‘
- 两个节点的数据库实例名不能一样
MAL_CHECK_INTERVAL = 10 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定MAL链路断开的时间
MAL_TEMP_PATH = /home/dmdba/dmdata/dm03/malpath/ #临时文件目录
MAL_BUF_SIZE = 512 #单个MAL缓存大小,单位MB
MAL_SYS_BUF_SIZE = 2048 #MAL总大小限制,单位MB
MAL_COMPRESS_LEVEL = 0 #MAL消息压缩等级,0表示不压缩
[MAL_INST1]
MAL_INST_NAME = dm03 #实例名,和 dm.ini的INSTANCE_NAME一致
MAL_HOST = 172.16.72.129 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5337 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 172.16.72.129 #实例的对外服务IP地址
MAL_INST_PORT = 5237 #实例对外服务端口,和dm.ini的PORT_NUM一致
MAL_DW_PORT = 5437 #实例对应的守护进程watcher监听TCP连接的端口
MAL_INST_DW_PORT = 5537 #实例监听守护进程TCP连接的端口(dmserver<-dmwatcher)
[MAL_INST2]
MAL_INST_NAME = dm03_B
MAL_HOST = 172.16.72.130
MAL_PORT = 5337
MAL_INST_HOST = 172.16.72.130
MAL_INST_PORT = 5237
MAL_DW_PORT = 5437
MAL_INST_DW_PORT = 5537
创建dmwatcher.ini
关键参数说明:
[GDW1] # 组名
- DW_MODE = AUTO #AUTO表示故障自动切换模式;MANUAL 表示手动切换模式
- INST_OGUID # 必须是int 精度10(否则后边设置模式时将报错)
自动切换和手动切换说明:
- 自动切换模式:需要3台服务器,为防止脑裂,确认服务器必须单独放置在一台服务器上
- 手动切换模式:需要2台服务器,可将确认监视器部署在B服务器上,使用时启动,不用时关闭
[GDW1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #故障自动切换模式
# DW_MODE = MANUAL #故障手动切换模式
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 83765937 #守护系统唯一OGUID值
INST_INI = /home/dmdba/dmdata/dm03/dm.ini #dm.ini文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
拷贝实例目录到备库(A–>B)
scp -r /home/dmdba/dmdata/dm03 dmdba@172.16.72.130:/home/dmdba/dmdata/
# 注册服务
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -p dm03 -t dmserver -dm_ini /home/dmdba/dmdata/dm03/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdata/dm03/dmwatcher.ini
如果不想使用systemctl管理,可以删除对应的.service 文件
cd /usr/lib/systemd/system
ll | grep Dm
02| 配置服务器(B)
# dm.ini
INSTANCE_NAME = DM03_B #数据库实例名,不能和A服务器相同,否则recovery的时候报错
# dmarch.ini
ARCH_DEST = DM03 #实时归档目标实例名,A服务器实例名
# 注册服务
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -p dm03_B -t dmserver -dm_ini /home/dmdba/dmdata/dm03/dm.ini -m mount
./dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdata/dm03/dmwatcher.ini
# 添加环境变量
cat >> /home/dmdba/.bash_profile <<-'EOF'
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
EOF
dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdata/dm03/dm.ini' from backupset '/home/dmdba/dmdata/dm03/bak/BACKUP_FILE'"
/*注:
【这里最可能出现的问题一】
[Percent:0.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
[-4558]:File exists
【解决办法】:
查看$DM_HOME/log/dm_BAKRES*.log,找到报错的文件将其改名(可能出现问题的文件为system.dbf,roll.dbf,main.dbf)
如"/data/dm8/dmdata/dm03/ROLL.DBF already exists." ,对应的处理方式:mv /data/dm8/dmdata/dm03/ROLL.DBF /data/dm8/dmdata/dm03/ROLL.DBF.bak
【这里可能出现的问题二】
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
[Percent:0.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
[-2406]:Invalid log file [/u01/dm8/dmdata/dm03/dm0301.log]
*/
dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/dm03/dm.ini' from backupset '/home/dmdba/dmdata/dm03/bak/BACKUP_FILE'"
/*注:
【这里可能出现的问题是】
archive_dest can not be self instance!
Read ini file(/data/dm8/dmdata/dm03/dmarch.ini) error in line 13, code(-952)
【原因】B服务器和A服务器中的INSTANCE_NAME不能相同
【解决办法】
1.修改B服务器的dm.ini中INSTANCE_NAME
2.修改B服务器中的dmarch.ini中的ARCH_DEST为A服务器实例名
*/
dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/dm03/dm.ini' UPDATE DB_MAGIC"
03| 配置监视服务器
监视服务器的配置文件,统一放置到$DM_HOME/bin下
关键性配置:
- MON_DW_CONFIRM = 1 #0为非确认监视器,1为确认监视器(仅为服务器C配置为1)
- MON_INST_OGUID = 83765937 #组GDW1的唯一OGUID 值(必须是int,DM里int精度为10)
- MON_DW_IP = 172.16.72.129:5437 # A.MAL_HOST:A.MAL_DW_PORT
- MON_DW_IP = 172.16.72.130:5437 # B.MAL_HOST:B.MAL_DW_PORT
1. 配置服务器A/B
cat >$DM_HOME/bin/dmmonitor_DM03.ini_0<<-'EOF'
MON_DW_CONFIRM = 0 #0为非确认,1为确认
MON_LOG_PATH = ../log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位MB
[GDW1]
MON_INST_OGUID = 83765937 #组GDW1的唯一OGUID 值
MON_DW_IP = 172.16.72.129:5437 # A.MAL_HOST:A.MAL_DW_PORT
MON_DW_IP = 172.16.72.130:5437 # B.MAL_HOST:B.MAL_DW_PORT
EOF
2. 配置服务器C
cat >$DM_HOME/bin/dmmonitor_DM03.ini_1 <<-'EOF'
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
[GDW1]
MON_INST_OGUID = 83765937 #组GDW1的唯一OGUID 值
MON_DW_IP = 172.16.72.129:5437 # A.MAL_HOST:A.MAL_DW_PORT
MON_DW_IP = 172.16.72.130:5437 # B.MAL_HOST:B.MAL_DW_PORT
EOF
# 注册监视器root执行(仅C执行)
exit
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor_DM03.ini_1
04| 启动instance,配置模式
# A 服务器
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./DmServicedm03 start
dmdba@dw1_01 [pwd:~/dmdbms/bin]$disql SYSDBA/SYSDBA@172.16.72.129:5237
--这里的83765937要和配置文件中的OGUID保持一致
SP_SET_OGUID(83765937);
alter database primary;
# B服务器
dmdba@dw1_02 [pwd:~/dmdbms/bin]$ ./DmServicedm03_B start
dmdba@dw1_02 [pwd:~/dmdbms/bin]$ disql SYSDBA/SYSDBA@172.16.72.130:5237
SP_SET_OGUID(83765937);
alter database standby;
/*【这里可能出现的报错】
Starting DmServicedm03: [ FAILED ]
file dm.key not found, use default license!
Instance DM03_B cannot find in dmmal.ini
Validate dmarch.ini error, code=-808
dmserver startup failed, code = -808 [Invalid archive config destination]
nsvr_ini_file_read failed, [code: -808]
【处理】
检查dmarch.ini中dest的实例名
*/
三、集群启停
01| 启动集群
说明:服务器A和B的实例默认都是已mount方式启动,当启动了监视器服务后,由监视器检测A.instance 和B.instance的数据是否一致,一致自动将AB实例启动到open状态;
# 1.启动实例A、B,(如果是第一次安装,前面已经启动了)
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./DmServicedm03 start
dmdba@dw1_02 [pwd:~/dmdbms/bin]$ ./DmServicedm03_B start
# 2.启动守护进程A、B(watcher)
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./DmWatcherServiceWatcher start
dmdba@dw1_02 [pwd:~/dmdbms/bin]$ ./DmWatcherServiceWatcher start
# 3.启动监视机上的监视器C(monitor)
dmdba@dmteset [pwd:/dm8/dm_home/bin]$ ./DmMonitorServiceMonitor start
02| 关闭集群
关闭集群有两种方式
- 通过监视器执行命令:
stop group
- 手动关闭集群
Stop Group 命令内部流程如下:
- 通知守护进程切换为 Shutdown 状态 ,守护进程并未真正退出
- 通知主库退出
- 通知其他备库退出
手动关闭集群
# 1.退出监视器-C
dmdba@dmteset [pwd:/dm8/dm_home/bin]$ ./DmMonitorServiceMonitor stop
# 2.关闭备机的守护进程
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./DmWatcherServiceWatcher stop
# 3.关闭主机的守护进程
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./DmWatcherServiceWatcher stop
# 4,关闭主机实例
SQL> shutdown immediate;
# 5.关闭备机实例
SQL> shutdown immediate;
如果是只关闭主库,并且不想引发备库自动接管,有以下两种方法:
- 方法一:
1.通过 Detach database 命令将所有备库分离
2.通过 Stop database 命令退出主库
- 方法二:严格按照以下顺序执行:
- 通过 Stop dmwatcher 命令关闭所有守护进程监控
- 手动正常退出主库
如果是只关闭备库,并且不想引发主库发送日志失败进入 Suspend 状态,请严格按照
以下顺序执行:
- 通过 Detach database 命令将备库分离出数据守护系统
- 正常退出备库(手动退出或者通过 Stop database 命令退出)
⚠️警告关闭整个数据守护系统时,先关闭主库再关闭备库,顺序一定不能错。
对于本地守护类型的库,在关闭数据守护系统时,不受此顺序限制。
因为主库 Shutdown 过程中,需要 Purge 所有已提交事务,会修改数据,并 产生 Redo 日志。
如果先 Shutdown 备库,会导致主库发送归档日志失败, 并且由于主库已经处于 Shutdown 状态,会导致主库异常关闭。
四、验证集群
01| 验证集群的状态和切换
命令 | 含义 |
---|---|
help | 帮助 |
show、show global info | 显示守护进程及其监控数据库的状态信息 |
exit | 关闭监视器 |
list | 查看守护进程的配置信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器,登录监视器后可执行switchover等命令 |
logout | 退出登录 |
open force | 备机不启动,只启动主机及其守护进程时,强制OPEN主机及其守护进程。主机的实时归档变成无效模式 |
choose switchover GRWC1 | 主机正常:查看可切换为主机的实例列表 |
switchover、switchover GRWC1.实例名 | 主机正常:由系统判断或使用指定组的指定实例,切换为主机 |
takeover、takeover GRWC1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
choose takeover GRWC1 | 主机故障:查看可切换为主机的实例列表 |
choose takeover force GRWC1 | 强制切换:查看可切换为主机的实例列表 |
takeover force GRWC1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
主机故障后,在备机执行SELECT SF_DW_CHECK_TAKEOVER();
【1:可接管 0:不可接管】
以上命令的用法:以前台启动的方式启动一个monitor,直接输入命令
# 1.在前台启动一个非确认监视器(A或B上的monitor)
dmdba@dw1_01 [pwd:~/dmdbms/bin]$ ./dmmonitor dmmonitor_DM03.ini_0
[monitor] 2022-04-28 21:45:40: DMMONITOR[4.0] V8
[monitor] 2022-04-28 21:45:46: DMMONITOR[4.0] IS READY.
[monitor] 2022-04-28 21:45:46: 收到守护进程(DM03)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-04-28 21:45:46 OPEN OK DM03 OPEN STANDBY NULL 7 53157 53157
--> 关注点1 -->关注点2 --> 关注点3 -->关注点4 # NULL状态应该是还未获取到新的状态,可以稍后在show一下
[monitor] 2022-04-28 21:45:46: 收到守护进程(DM03_B)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-04-28 21:45:46 OPEN OK DM03_B OPEN PRIMARY VALID 7 53157 53158
--> 关注点1 -->关注点2 --> 关注点3 -->关注点4
login # 输入login 登录
用户名:SYSDBA
密码:
[monitor] 2022-04-28 21:48:47: 登录监视器成功!
switchover # 执行手动切换
。。。
[monitor] 2022-04-28 21:56:23: 清理守护进程(DM03)请求成功
2022-04-28 21:56:24
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
[monitor] 2022-04-28 21:56:24: 清理守护进程(DM03_B)请求成功
[monitor] 2022-04-28 21:56:24: 实例DM03切换成功
show # 查看状态
2022-04-28 21:58:06
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GDW1 83765937 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
172.16.72.129 5437 2022-04-28 21:58:06 GLOBAL VALID OPEN DM03 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
172.16.72.129 5237 OK DM03 OPEN PRIMARY 0 0 REALTIME VALID 7162 55850 7163 55851 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
172.16.72.130 5437 2022-04-28 21:58:06 GLOBAL VALID OPEN DM03_B OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
172.16.72.130 5237 OK DM03_B OPEN STANDBY 0 0 REALTIME VALID 7126 55849 7126 55849 NONE
DATABASE(DM03_B) APPLY INFO FROM (DM03), REDOS_PARALLEL_NUM (1):
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[7161, 7161, 7162], (RLSN, SLSN, KLSN)[55849, 55849, 55850], N_TSK[0], TSK_MEM_USE[1024]
REDO_LSN_ARR: (55849)
#================================================================================#
1. 判断集群状态正常
- 守护系统正常运行时,同一个守护进程组中,只有一个主库,其他的都是备库。
- 主库处于 Open 状态,主库**守护进程也处于 Open **状态, 其内存值是 Valid 有效状态。
- 所有备库也处于 Open 状态,所有备库守护进程处于 Open 状态,其内存值是 Valid 有效状态。
- 主库到所有备库的**归档也都处于 Valid **有效状态。
- MPP 主备系统中,所有主库的 dmmpp.ctl 都处于一致状态。
如果通过监视器没有观察到主库或备库 Open, 可以借助监视器的 Check Open
命令查找原因
以下截图中,B的状态为invalid,集群无法同步,可以尝试重新备份A并恢复到B上,
02| 验证集群同步
# 在A上新建表并插入数据
create table test(a int);
insert into test values(1);
commit;
select * from user_tables where table_name='TEST';
SQL> SELECT * FROM TEST;
行号 A
---------- -----------
1 1
# 在B上查看表和数据
select * from user_tables where table_name='TEST';
SQL> SELECT * FROM TEST;
行号 A
---------- -----------
1 1
五、配置集群服务名(对外连接使用)
使用DM数据守护,一般要求编辑DM_svc.conf文件配置连接服务名,以实现故障自动重连。
- Windows平台下位于
%SystemRoot%\system32
目录 - Linux平台下位于
/etc
目录 - 编辑
DM_svc.conf
文件
TIME_ZONE=(+8:00)
LANGUAGE=(en)
DM_DW=(192.168.1.21:5236,192.168.1.23:5236)
LOGIN_MODE=(1)
[DM_DW]
LOGIN_MODE=(1)
SWITCH_TIME=2000
SWITCH_INTERVAL=10
应用连接串
# 以下为主备集群应用连接串配置
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://DW1</URL>
# 以下为读写分离集群应用连接串配置
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://RWC1</URL>
或<URL>jdbc:dm://192.168.0.206:5236?rwSeparate=1&rwPercent=10</URL>
-
LOGIN_MODE:指定优先登录的服务器模式。
- 0:优先连接 Primary 模式的库,Normal 模式次之, 最后选择 Stantby 模式;
- 1:只连接主库;
- 2:只连接备库;
- 3:优先连接 Standby 模式的库,Primary 模式次之,最后选择Normal模式;
- 4:优先连接Normal模式的库,Primary 模式次之,最后选择 Standby 模式。默认值为 4
-
SWITCH_TIME:检测到数据库实例故障时,接口在服务器之间切换的次数;
- 超过设置次数没有连接到有效数据库时,断开连接并报错。
- 有效值范围 1~9223372036854775807,默认值为 3。
-
SWITCH_INTERVAL:表示在服务器之间切换的时间间隔 ,单位为毫秒
- 有效值范围 1~9223372036854775807,默认值为 200。
-
RW_SEPARATE :指定是否启用读写分离。
- 0 表示不启用读写分离;默认值为 0。
- 1 表示启用读写分离
-
RW_PERCENT :启用读写分离时,读写分离的分发比例
- 有效值范围 0~100,默认值为 25。
六、滚动升级
数据守护 V4.0 可以确保在不中断数据库服务的情况下,实现滚动升级。
这里以一主一备的配置方式举例说明
假设初始状态为:主库 DM1 部署在 DW_P 机器上,备库 DM2 部署在 DW_S 机器上,监视器部署在 DW_M 机器上,滚动升级操作步骤如下:
- 关闭备库 DM2 的守护进程,正常关闭备库实例 DM2;这个过程中,主库 DM1 的守护进程会检测到备库故障,并进行故障处理,修改归档状态无效。
- 升级 DW_S,重新安装新版本服务器,或者直接将新的执行程序和动态库替换旧版本。
- 启动 DM2 实例,启动 DM2 的守护进程。
- 等待历史数据同步完成,DM2 重新加入数据守护系统(可以通过监视器 DW_M 查看数据守护系统是否恢复正常)。
- 关闭主库 DM1 的守护进程,正常关闭实例 DM1;使用监视器的接管命令将 DM2 接管为新的主库。如果配置了自动接管,因为老主库正常退出之后,默认配置(监视器的
MON_TAKEOVER_SHUTDOWN 配置为 0)无法触发自动接管,所以只能手动干预;如果MON_TAKEOVER_SHUTDOWN 非 0,主库正常退出后,超过设定的时间主库仍未重启,备库可以完成自动接管。 - 升级 DW_P,重新安装新版本服务器,或者直接将新的执行程序和动态库替换旧版本。
- 启动 DM1 实例,启动 DM1 的守护进程。
- 等待历史数据同步完成,DM1 作为备库重新加入数据守护系统(可以通过监视器DW_M 查看数据守护系统是否恢复正常)。
- 在 DW_M 监视器控制台上输入 Switchover 命令,重新将 DM1 切换为主库,至此滚动升级完成。
达梦技术社区:https://eco.dameng.com