(一)什么是DM8实时主备?
实时主备系统由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统,可
以及时检测并处理各种硬件故障、数据库实例异常,确保持续提供数据库服务。
--------------------------------------//实时主备的功能如下//----------------------------------
1)、实时数据同步
主备库通过实时归档完成数据同步,实时归档要求主库将 RLOG_PKG 发送到备库后,
再将 RLOG_PKG 写入本地联机 Redo 日志文件。但要注意的是,备库确认收到主库发送的
Redo 日志,并不保证备库已经完成重演这些 Redo 日志,因此主备库之间的数据同步存在
一定的时间差。
2)、 主备库切换
主备库正常运行过程中,可以通过监视器的 Switchover 命令,一键完成主备库角色
转换。主备库切换功能可以确保在软、硬件升级,或系统维护时,提供不间断的数据库服务。
3)、自动故障处理
备库故障,不影响主库正常提供数据库服务,守护进程自动通知主库修改实时归档为
Invalid 状态,将实时备库失效。
4)、 自动数据同步
备库故障恢复后,守护进程自动通知主库发送归档 Redo 日志,重新进行主备库数据同
步。并在历史数据同步后,修改主库的实时归档状态为 Valid,恢复实时备库功能。
备库接管后,原主库故障恢复,守护进程自动修改原主库的模式为 Standby,并重新
作为备库加入主备系统。
5)、 备库接管
主库发生故障后,可以通过监视器的 Takeover 命令,将备库切换为主库,继续对外
提供服务。如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,
这个过程不需要人工干预。
6)、 备库强制接管
如果执行 Takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为了及时恢复数据库服务,DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
7)、 读写分离访问
在备库查询的实时性要求不高的条件下,实时主备也可以配置接口的读写分离属性访
问,实现读写分离功能特性
主库生成联机 Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_PKG 发送
到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合
法则返回错误信息,合法则作为 KEEP_PKG 保留在内存中,原有 KEEP_PKG 的 Redo 日志
加入 Apply 任务队列进行 Redo 日志重演,并响应主库日志接收成功。
(二)实时主备规划
实时主备服务规划
机器名 | IP 地址 | 初始状态 | 操作系统 | 备注 |
DW_1 | 192.168.1.131 192.168.0.141 | 主库 GRP1_RT_01 | Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) | 192.168.1.131 外部服务 IP; 192.168.0.141 内部通信 IP |
DW_2 | 192.168.1.132 192.168.0.142 | 备库 GRP1_RT_02 | Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) | 192.168.1.132 外部服务 IP; 192.168.0.142 内部通信 IP |
DW_3 | 192.168.0.143 | 监视器 | Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) |
实时主备端口规划
实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
GRP1_RT_01 | 32141 | 33141 | 192.168.0.141 | 61141 | 52141 |
GRP1_RT_02 | 32142 | 33142 | 192.168.0.142 | 61142 | 52142 |
(三)环境检测与配置(主备节点一样)
1、操作系统时间检查
#时间检查
[root@dm8 data]# date
Tue Oct 25 14:52:50 CST 2022
#时间修改如果时间对需要修改
date -s "yyyy-mm-dd HH:MM:SS"
2、关闭防火墙
[root@dmdb dm-2]systemctl stop firewalld.service [root@dmdb dm-2]systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. |
3、设置SELINUX
vi /etc/selinux/config 将内容 SELINUX=enforcing 更改为 SELINUX=disabled |
4、网络配置检查
检查类别 | 检查方式 |
传输效率检查 | 拷贝一个文件到远程服务器的/opt: |
拷贝一个文件,指定端口到远程服务器的/opt: | |
查看网卡配置 | 1、查看网卡名称:ip a |
查看网络信息 | sar -n DEV 1 100 |
5、磁盘规划
5.1、磁盘格式检查
比较 | XFS | EXT4 |
单个文件的大小 | 16TB到16EB | 16GB到16TB |
最大文件系统大小 | XFS可以是8EB | EXT4可以是1EB |
磁盘结构和兼容 | EXT4受限制于磁盘结构和兼容问题,可扩展性和scalability不如XFS |
5.2、磁盘挂载方式检查
UUID为系统中的存储设备提供唯一的标识字符串,不管这个设备是什么类型的。如果你在系统中添加了新的存储设备如硬盘,很可能会造成一些麻烦,比如说启动的时候因为找不到设备而失败,而使用UUID则不会有这样的问题
#磁盘是否自动挂载及方式:推荐UUID挂载
cat /etc/fstab
#查看实际挂载盘:
6、检查NUMA是否关闭:非多CPU多内存块可忽略这步
编辑grub文件,如下图所示加上:numa=off
vi /etc/default/grub
重启操作系统
[root@~]# reboot
重启之后进行确认
[root@~]# dmesg | grep -i numa
7、禁用透明大页
1)查看是否启用透明大页
[root@~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never:[always]表示透明大页启用 [never]表示透明大页禁用
2)永久修改:编辑grub文件,如下图所示加上:transparent_hugepage=never
[root@~]# vi /etc/default/grub
3)重新生成/etc/grub2.cfg 配置文件:
[root@~]# grub2-mkconfig -o /etc/grub2.cfg
4)重启操作系统
[root@~]# reboot
5)再次确认是否已经关闭
[root@~]# cat /sys/kernel/mm/transparent_hugepage/enabled
8、调整 Limits.conf
vi /etc/security/limits.conf 添加以下参数: dmdba soft nproc 131072 dmdba hard nproc 131072 dmdba soft nofile 131072 dmdba hard nofile 131072 dmdba soft core unlimited dmdba hard core unlimited dmdba soft data unlimited dmdba hard data unlimited |
9、调整sysctl.conf参数
[root@dm~]# vi /etc/sysctl.conf 修改vm.overcommit_memory=0 |
10、创建用户及目录
创建dmdba用户与dinstall组
groupadd dinstall -g 2001 useradd -g dinstall dmdba -u 1001 修改dmdba密码: dmdba/dmdba123456 |
创建dm的安装目录
mkdir /dm8 chown -R dmdba:dinstall /dm8 chmod 777 /dm8 -R |
11、检查操作系统限制
[root@dmdb dmdba]# ulimit -a
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited --符合 scheduling priority (-e) 0 file size (blocks, -f) unlimited --符合 pending signals (-i) 15040 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65536 --符合 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 15040 virtual memory (kbytes, -v) unlimited --符合 file locks (-x) unlimited |
12、上传及挂载达梦数据库镜像到服务器
8.1、挂载安装包镜像(root用户执行) mount -o loop /root/dm8_20211217_x86_rh6_64_ent_8.4.2.98.iso /mnt/ 8.2、将挂载的镜像里的安装文件复制出来(挂载的镜像只读),并赋权 cp /mnt/DMInstall.bin /dm8 chown dmdba:dinstall /mnt/DMInstall.bin |
(四)DM8数据软件安装(主备节点一样)
1)、数据库软件安装
(1) 使用dmdba用户进行安装
su - dmdba
cd /mnt
./DMInstall.bin -i (-i:命令行、不加参数图形化)
Please select the installer's language (E/e:English C/c:Chinese) [E/e]:c
解压安装程序.........
欢迎使用达梦数据库安装程序
是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:y
请输入Key文件的路径地址 [dm.key]:/dm8/XX.key
有效日期: 2023-06-25
服务器颁布类型: 企业版
发布类型: 试用版
用户名称: 达梦公司产品试用
授权用户数: 无限制
并发连接数: 无限制
是否设置时区? (Y/y:是 N/n:否) [Y/y]:y
设置时区:
[ 1]: GTM-12=日界线西
[ 2]: GTM-11=萨摩亚群岛
[ 3]: GTM-10=夏威夷
[ 4]: GTM-09=阿拉斯加
[ 5]: GTM-08=太平洋时间(美国和加拿大)
[ 6]: GTM-07=亚利桑那
[ 7]: GTM-06=中部时间(美国和加拿大)
[ 8]: GTM-05=东部部时间(美国和加拿大)
......
[21]: GTM+08=中国标准时间
[22]: GTM+09=汉城
[23]: GTM+10=关岛
[24]: GTM+11=所罗门群岛
[25]: GTM+12=斐济
[26]: GTM+13=努库阿勒法
[27]: GTM+14=基里巴斯
请选择设置时区 [21]:21
安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:1
所需空间: 1602M
请选择安装目录 [/home/dmdba/dmdbms]:/dm8/dmdbms
可用空间: 98G
是否确认安装路径(/dm8/dmdbms)? (Y/y:是 N/n:否) [Y/y]:y
安装前小结
安装位置: /dm8/dmdbms
所需空间: 1602M
可用空间: 98G
版本信息: 企业版
有效日期: 2023-06-25
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2022-09-01 21:53:07
[INFO] 安装达梦数据库...
2022-09-01 21:53:08
....
[INFO] 安装达梦数据库完成。
请以root系统用户执行命令:
/dm8/dmdbms/script/root/root_installer.sh
(五)、初始化实例(主备库操作)
命令行初始化实例我认为是比图形化更为简洁且高效初始化实例及参数设定(此部分需根据实际情况和实际多数生产经验而定,一旦确定了在整个数据库的生命周期是不能修改的)
5.1、主库初始化实例:
./dminit PATH=/dm8/dmdbms EXTENT_SIZE=32 PAGE_SIZE=32 LOG_SIZE=2048 CHARSET=0 CASE_SENSITIVE=Y DB_NAME=GRP1_RT_01 INSTANCE_NAME=GRP1_RT_01 PORT_NUM=32141 SYSDBA_PWD =SYSDBA9988! SYSAUDITOR_PWD=SYSDBA9988
(簇大小=32页、页大小=32k、日志大小=2048M、字符集=GB18030、大小写=敏感、数据库名=GRP1_RT_02 、实例名=GRP1_RT_02 、SYSDB密码=SYSDBA9988!)
-------------------------------------------------//执行结果如下//-----------------------------------------------------
initdb V8
db version: 0x7000c
License will expire on 2023-06-25
Normal of FAST
....表示省略
/DMDATA/DMDATA01.log
log file path: /dm8/dmdbms/DMDATA/DMDATA02.log
write to dir [/dm8/dmdbms/DMDATA].
create dm database success. 2022-09-01 22:15:18
# 注册服务:注册服务的目的是为了能在开机自启
切换到root用户执行
su - root
cd /dm8/script/root/
./dm_service_installer.sh -p DMDATA -t dmserver -dm_ini /dm8/dmdbms/DMDATA/dm.ini
-------------------------------------------------//执行结果如下//-----------------------------------------------------
[root@DM8 root]# ./dm_service_installer.sh -p DMDATA -t dmserver -dm_ini /dm8/dmdbms/DMDATA/dm.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMDATA.service to /usr/lib/systemd/system/DmServiceDMDATA.service.
创建服务(DmServiceDMDATA)完成
-------------------------------------------------//启动的页面结果如下//-----------------------------------------------------
前台启动数据库后,客户端将一直处于前台页面:最后SYSTEM IS READY说明数据库正常,此时敲入命令exit或者ctr+z退出
version info: enterprise
DM Database Server 64 V8 03134283904-20220630-163817-20005 startup...
Normal of FAST
.......表示省略
systables desc init success.
ndct_db_load_info success.
pseg_crash_trx_rollback end
SYSTEM IS READY.
------------------------------------------------//退的页面结果如下//--------------------------------------------------
在前面页面输入命令退出且关闭数据库:exit或者ctrl+z
checkpoint end, 0 pages flushed, used_space[0], free_space[4294959104].
.......表示省略
shutdown archive subsystem...OK
shutdown redo log subsystem...OK
......表示省略
DM Database Server shutdown successfully.
5.2、备库初始化实例:
./dminit PATH=/dm8/dmdbms EXTENT_SIZE=32 PAGE_SIZE=32 LOG_SIZE=2048 CHARSET=0 CASE_SENSITIVE=Y DB_NAME=GRP1_RT_02 INSTANCE_NAME=GRP1_RT_02 PORT_NUM=32142 SYSDBA_PWD =SYSDBA9988! SYSAUDITOR_PWD=SYSDBA9988
(簇大小=32页、页大小=32k、日志大小=2048M、字符集=GB18030、大小写=敏感、数据库名=GRP1_RT_02 、实例名=GRP1_RT_02 、SYSDB密码=SYSDBA9988!)
-------------------------------------------------//执行结果如下//-----------------------------------------------------
initdb V8
db version: 0x7000c
License will expire on 2023-06-25
Normal of FAST
....表示省略
/DMDATA/DMDATA01.log
log file path: /dm8/dmdbms/DMDATA/DMDATA02.log
write to dir [/dm8/dmdbms/DMDATA].
create dm database success. 2022-09-01 22:15:18
# 注册服务:注册服务的目的是为了能在开机自启
切换到root用户执行
su - root
cd /dm8/script/root/
./dm_service_installer.sh -p DMDATA -t dmserver -dm_ini /dm8/dmdbms/DMDATA/dm.ini
-------------------------------------------------//执行结果如下//-----------------------------------------------------
[root@DM8 root]# ./dm_service_installer.sh -p DMDATA -t dmserver -dm_ini /dm8/dmdbms/DMDATA/dm.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMDATA.service to /usr/lib/systemd/system/DmServiceDMDATA.service.
创建服务(DmServiceDMDATA)完成
-------------------------------------------------//启动的页面结果如下//-----------------------------------------------------
前台启动数据库后,客户端将一直处于前台页面:最后SYSTEM IS READY说明数据库正常,此时敲入命令exit或者ctr+z退出
version info: enterprise
DM Database Server 64 V8 03134283904-20220630-163817-20005 startup...
Normal of FAST
.......表示省略
systables desc init success.
ndct_db_load_info success.
pseg_crash_trx_rollback end
SYSTEM IS READY.
------------------------------------------------//退的页面结果如下//--------------------------------------------------
在前面页面输入命令退出且关闭数据库:exit或者ctrl+z
checkpoint end, 0 pages flushed, used_space[0], free_space[4294959104].
.......表示省略
shutdown archive subsystem...OK
shutdown redo log subsystem...OK
......表示省略
DM Database Server shutdown successfully.
(六)数据准备
方法一:启用脱机备份还原数据库dmrman
注:如果是初始搭建环境,可以通过对主库脱机备份、对备库脱机还原的方式来准备数据,
如果主库已经处于运行状态,则可以对主库进行联机备份、对备库脱机还原的方式来准备数据
--4.1备份主节点数据
[dmdba@localhost bin]$ mkdir -p /dm8/bak
[dmdba@localhost bin]$ ./dmrman
RMAN>backup database '/dm8/dmdbms/GRP1_RT_01/dm.ini' full backupset '/dm8/bak';
--4.2将主机上的备份文件传至备机
scp -r /dm8/fullback/ dmdba@DM_S1:/dm8/
--4.3备机还原(如果出现dmapservice服务无法启动,不能备份和恢复数据库,需要重启服务器)
[dmdba@bin]$ cd /home/dmdba/dmdbms/bin
[dmdba@bin]$ ./dmrman
RMAN>restore database '/dm8/dmdbms/GRP1_RT_02/dm.ini' from backupset '/dm8/bak';
RMAN>recover database '/dm8/dmdbms/GRP1_RT_02/dm.ini' from backupset '/dm8/bak';
RMAN>recover database '/dm8/dmdbms/GRP1_RT_02/dm.ini' update db_magic;
(七)主备集群节点配置
7.1、主库配置
7.1.1、修改 dm.ini
#方法1:使用vi工具编辑修改,一个个修改较慢
cd /dm8/dmdbms/GRP1_RT_01/
vi dm.ini
--修改以下参数
INSTANCE_NAME = GRP1_RT_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:使用sed工具批量修改(我喜欢用这种方法,但是要注意不要改到其他参数)
sed -i "s/INSTANCE_NAME.*=.*/INSTANCE_NAME = GRP1_RT_01/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/PORT_NUM.*=.*5236.*/PORT_NUM = 32141/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/DW_INACTIVE_INTERVAL.*=.*/DW_INACTIVE_INTERVAL = 60/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/ALTER_MODE_STATUS.*=.*/ALTER_MODE_STATUS = 0/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/ENABLE_OFFLINE_TS.*=.*/ENABLE_OFFLINE_TS = 2/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/MAL_INI.*=.*/MAL_INI = 1/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/ARCH_INI.*=.*/ARCH_INI = 1/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
sed -i "s/RLOG_SEND_APPLY_MON.*=.*/RLOG_SEND_APPLY_MON = 64/g" /dm8/dmdbms/GRP1_RT_01/dm.ini;
#查询更新情况
cat /dm8/dmdbms/GRP1_RT_01/dm.ini | grep -E "INSTANCE_NAME|PORT_NUM|DW_INACTIVE_INTERVAL|ALTER_MODE_STATUS|ENABLE_OFFLINE_TS|MAL_INI|ARCH_INI|RLOG_SEND_APPLY_MON"
7.1.2、配置 dmmal.ini(默认情况下是没有的,需要新建)
cd /dm8/dmdbms/GRP1_RT_01/
vi dmmal.ini
添加以下内容
echo '
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
#主库
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.1 #MAL系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL系统监听 TCP 连接的端口
MAL_INST_HOST = 10.226.10.40 #实例的对外服务 IP 地址
MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
#备库1
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.0.2
MAL_PORT = 61142
MAL_INST_HOST = 10.226.10.39
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
'>/dm8/dmdbms/GRP1_RT_01/dmmal.ini
cat /dm8/dmdbms/GRP1_RT_01/dmmal.ini
7.1.3、配置 dmarch.ini(默认情况下是没有的,需要新建)
使用dmdba创建归档存放目录
mkdir -p /dm8/dmdbms/arch
vi dmarch.ini
--添加以下内容
echo '
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data1/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
'>/dm8/dmdbms/GRP1_RT_01/dmarch.ini
cat /dm8/dmdbms/GRP1_RT_01/dmarch.ini
7.1.4、配置 dmwatcher.ini(默认情况下是没有的,需要新建)
echo '
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm8/dmdbms/GRP1_RT_01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能DM
INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
'>/dm8/dmdbms/GRP1_RT_01/dmwatcher.ini
cat /dm8/dmdbms/GRP1_RT_01/dmwatcher.ini
7.1.5、主库启动&设置数据库配置
7.1.5.1、以 mount 方式启动主库
cd /dm8/dmdbms/bin
./dmserver /dm8/dmdbms/GRP1_RT_01/dm.ini mount #一定是以mount方式启动
7.1.5.2、主库设置 OGUID(上一步是以mount 方式前台启动,需要重新开一个窗口登陆)
启动命令行工具 disql,登录主库设置 OGUID 值。
./disql SYSDBA/SYSDBA9988!:32141 #如果端口号改了,注意在后面加一个新的端口号,否则报错:创建SOCKET连接失败
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
7.2.5.3、修改数据库模式:修改为主库
启动命令行工具 DIsql,登录主库修改数据库为 Primary 模式
SQL>alter database primary
7.2.5.4、查询主库相关信息
查询实例状态(是否为mount)、数据模式(是否为primary)
select * from v$instance;
注释:前台启动的主库可以先别关闭,等配置完监视器后再看看是否正常
--------------------------------//主库配置结束//-----------------------------------------
7.2、备库配置
7.2.1、修改 dm.ini
#方法1:使用vi工具编辑修改,一个个修改较慢
cd /dm8/dmdbms/GRP1_RT_02/
vi dm.ini
--修改以下参数
INSTANCE_NAME = GRP1_RT_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:使用sed工具批量修改(我喜欢用这种方法,但是要注意不要改到其他参数)
sed -i "s/INSTANCE_NAME.*=.*/INSTANCE_NAME = GRP1_RT_01/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/PORT_NUM.*=.*5236.*/PORT_NUM = 32142/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/DW_INACTIVE_INTERVAL.*=.*/DW_INACTIVE_INTERVAL = 60/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/ALTER_MODE_STATUS.*=.*/ALTER_MODE_STATUS = 0/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/ENABLE_OFFLINE_TS.*=.*/ENABLE_OFFLINE_TS = 2/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/MAL_INI.*=.*/MAL_INI = 1/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/ARCH_INI.*=.*/ARCH_INI = 1/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
sed -i "s/RLOG_SEND_APPLY_MON.*=.*/RLOG_SEND_APPLY_MON = 64/g" /dm8/dmdbms/GRP1_RT_02/dm.ini;
#查询更新情况
cat /dm8/dmdbms/GRP1_RT_01/dm.ini | grep -E "INSTANCE_NAME|PORT_NUM|DW_INACTIVE_INTERVAL|ALTER_MODE_STATUS|ENABLE_OFFLINE_TS|MAL_INI|ARCH_INI|RLOG_SEND_APPLY_MON"
7.2.2、配置 dmmal.ini(默认情况下是没有的,需要新建,且主备库这个配置是完全一样的)
cd /dm8/dmdbms/GRP1_RT_02/
vi dmmal.ini
添加以下内容
echo '
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
#主库
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.1 #MAL系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL系统监听 TCP 连接的端口
MAL_INST_HOST = 10.226.10.40 #实例的对外服务 IP 地址
MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
#备库1
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.0.2
MAL_PORT = 61142
MAL_INST_HOST = 10.226.10.39
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
'>/dm8/dmdbms/GRP1_RT_02/dmmal.ini
cat /dm8/dmdbms/GRP1_RT_02/dmmal.ini
7.1.3、配置 dmarch.ini(默认情况下是没有的,需要新建)
使用dmdba创建归档存放目录
mkdir -p /dm8/dmdbms/arch
vi dmarch.ini
--添加以下内容
echo '
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data1/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
'>/dm8/dmdbms/GRP1_RT_02/dmarch.ini
cat /dm8/dmdbms/GRP1_RT_02/dmarch.ini
7.1.4、配置 dmwatcher.ini(默认情况下是没有的,需要新建)
echo '
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm8/dmdbms/GRP1_RT_01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能DM
INST_STARTUP_CMD = /dm8/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
'>/dm8/dmdbms/GRP1_RT_02/dmwatcher.ini
cat /dm8/dmdbms/GRP1_RT_02/dmwatcher.ini
7.1.5、备库启动&设置数据库配置
7.1.5.1、以 mount 方式启动备库
cd /dm8/dmdbms/bin
./dmserver /dm8/dmdbms/GRP1_RT_02/dm.ini mount #一定是以mount方式启动
7.1.5.2、备库设置 OGUID(上一步是以mount 方式前台启动,需要重新开一个窗口登陆)
启动命令行工具 disql,登录备库设置 OGUID 值。
./disql SYSDBA/SYSDBA9988!:32142 #如果端口号改了,注意在后面加一个新的端口号,否则报错:创建SOCKET连接失败
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
7.2.5.3、修改数据库模式:修改为备库
启动命令行工具 DIsql,登录主库修改数据库为 standby模式
SQL>alter database standby
7.2.5.4、查询备库相关信息
查询实例状态(是否为mount)、数据模式(是否为standby)
select * from v$instance;
注释:前台启动的备库可以先别关闭,等配置完监视器后再看看是否正常
--------------------------------//备库配置结束//-----------------------------------------
(八)配置监视器
监视器建议安装在独立于主备的集群外的服务器,确保集群能正常运行,正常切换等
1、安装dm8数据库软件
这里就不再赘述
2、配置监视器dmmonitor.ini ---需要新建文件
修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和
dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
mkdir -p /dm8/dmdbms/dmmonitor
vi dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/dmdbms/dmmonitor/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.0.1:52141
MON_DW_IP = 192.168.0.2:52142
(九)启动守护进程
---1、主库上启动守护进程
启动各个主备库上的守护进程:
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始
广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将
本地实例 Open,并切换为 Open 状态。
cd /dm8/dmdbms/bin
./dmwatcher /dm8/dmdbms/GRP1_RT_01/dmwatcher.ini
---2、备机上启动守护进程
启动各个主备库上的守护进程:
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始
广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将
本地实例 Open,并切换为 Open 状态。
cd /dm8/dmdbms/bin
./dmwatcher /dm8/dmdbms/GRP1_RT_02/dmwatcher.ini
(十)启动监视器&并查看集群是否正常启动
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入 help 命令,
查看各种命令使用说明,结合实际情况选择使用。
至此一主一备的实时数据守护系统搭建完毕,在搭建步骤和各项配置都正确的情况下,
在监视器上执行 show 命令,可以监控到所有实例都处于 Open 状态,所有守护进程也都处
于 Open 状态,即为正常运行状态。
cd /dm8/dmdbms/bin
./dmmonitor /dm8/dmdbms/dmmonitor/dmmonitor.ini
监视器前台上输入:show ,检查集群是否正常
集群正常:
(十一)注册服务
如果想让 dmserver、dmwatcher 和 dmmonitor 服务开机自启动,需要手动注册服务,注册步骤必须用 root 用户进行,注册完成后重启机器时,就会自动启动 dmserver、 dmwatcher 和 dmmonitor 服务。其中, 因为确认监视器一直处于工作状态,所以确认监视器需要注册 dmmonitor 服务,自动启动;非确认监视器是在查看信息时才使用, 届时手动启动控制台 dmmonitor 服务即可,可以不用注册 dmmonitor 服务
1、主库注册数据守护服务(root用户执行)
cd /dm8/dmdbms/script/root
./dm_service_installer.sh -p GRP1_RT_01 -t dmwatcher -watcher_ini /dm8/dmdbms/GRP1_RT_01/dmwatcher.ini
2、备库注册数据守护服务(root用户执行)
cd /dm8/dmdbms/script/root
./dm_service_installer.sh -p GRP1_RT_02 -t dmwatcher -watcher_ini /dm8/dmdbms/GRP1_RT_02/dmwatcher.ini
3、注册数据监视服务(root用户执行)
cd /dm8/dmdbms/script/root
./dm_service_installer.sh -p dmmonitor -t dmmonitor -monitor_ini /dm8/dmdms/dmmonitor/dmmonitor.ini
(十二)集群连接
配置dm_svc.conf主备连接服务名
--配置 DM 数据守护,一般要求配置连接服务名,以实现故障自动重连。连接服务名可以
在 DM 提供的 JDBC、DPI 等接口中使用,连接数据库时指定连接服务名,接口会随机选择
一个 IP 进行连接,如果连接不成功或者服务器状态不正确,则顺序获取下一个 IP 进行连 接,
直至连接成功或者遍历了所有 IP。 可以通过编辑 dm_svc.conf 文件配置连接服务名。
dm_svc.conf 配置文件在 DM 安装时生成,Linux 平台下位于 /etc 目录 ;Windows 平台下位于%SystemRoot%\system32 目录,
配置主备连接服务名
su - dmdba
vi /etc/dm_svc.conf
添加数据库服务ip信息:
dmsvc=(192.168.100.1:32141,192.168.100.2:32142)
需要说明的是,如果对 dm_svc.conf 的配置项进行了修改,需要重启客户端工具,修改的配置才能生效。
另外,如果 dm_svc.conf 配置文件中包含中文,则必须保证该配置文件的编码与客户端编码一致。
测试登录
[root@localhost bin]# su - dmdba
[dmdba@localhost ~]$ cd /dm8/dmdbms/bin
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@dmsvc
结果
服务器[192.168.153.10:5236]:处于主库打开状态
(十三)集群测试
测试点1、手动切换主备库(非自动切换)
login #启动监视器后,在监视器界面执行登录操作
输入DBA用户:SYSDBA
switchover GRP1_RT_01 #手动切换
switchover GRP1_RT_02 #手动切换
switchover GRP1_RT_02
[monitor] 2022-09-07 13:14:31: 开始切换实例GRP1_RT_02
[monitor] 2022-09-07 13:14:31: 通知守护进程GRP1_RT_01切换SWITCHOVER状态
[monitor] 2022-09-07 13:14:31: 守护进程(GRP1_RT_01)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2022-09-07 13:14:32: 切换守护进程GRP1_RT_01为SWITCHOVER状态成功
[monitor] 2022-09-07 13:14:32: 通知守护进程GRP1_RT_02切换SWITCHOVER状态
[monitor] 2022-09-07 13:14:32: 守护进程(GRP1_RT_02)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2022-09-07 13:14:32: 切换守护进程GRP1_RT_02为SWITCHOVER状态成功
[monitor] 2022-09-07 13:14:32: 实例GRP1_RT_01开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2022-09-07 13:14:32: 实例GRP1_RT_01执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
....
[monitor] 2022-09-07 13:14:36: 通知守护进程GRP1_RT_01切换OPEN状态
[monitor] 2022-09-07 13:14:36: 守护进程(GRP1_RT_01)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2022-09-07 13:14:37: 切换守护进程GRP1_RT_01为OPEN状态成功
[monitor] 2022-09-07 13:14:37: 通知守护进程GRP1_RT_02切换OPEN状态
[monitor] 2022-09-07 13:14:37: 守护进程(GRP1_RT_02)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2022-09-07 13:14:38: 切换守护进程GRP1_RT_02为OPEN状态成功
[monitor] 2022-09-07 13:14:38: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2022-09-07 13:14:38: 清理守护进程(GRP1_RT_01)请求成功
[monitor] 2022-09-07 13:14:38: 清理守护进程(GRP1_RT_02)请求成功
[monitor] 2022-09-07 13:14:38: 实例GRP1_RT_02切换成功
2、自动切换主库
场景
1.主库数据库实例异常终止,主库守护进程正常。
2.主库硬件故障、或者数据库实例和守护进程同时故障。
3.主库网络故障,主备库之间、主库与监视器之间连接异常。
2.1、模拟主库数据库服务或守护进程异常情况下的自动接管情况
确认监视器启动自动接管流程的主要场景有三种,任何一种都会导致备库自动接管。
演示顺序:
把主节点的服务器关机,在看看守护进程的监控情况,发现备库DBCMIS_02接管主库DBCMIS_01成为新的主库
将主节点的服务器开机,运行主节点上的守护进程
监控进程查看,主节点上的主库DBCMIS_01变成了备库
模拟数据库服务挂掉,可在备库节点上执行
[dmdba@dmdsc1 bin]$ ps -ef | grep dms #杀掉数据库服务进程
kill -9 XX XX #kill掉对应的进程ID
[dmdba@dm_s1 ~]$ ps -ef | grep dms
avahi 726 1 0 13:32 ? 00:00:00 avahi-daemon: registering [dms1-60.local]
dmdba 1338 1 0 13:32 ? 00:00:11 /dm8/dmdbms/bin/dmserver path=/dm8/dmdbms/GRP1_RT_0 2/dm.ini -noconsole
dmdba 2297 2253 0 13:56 pts/0 00:00:00 grep --color=auto dms
[dmdba@dm_s1 ~]$ kill -9 1338
[dmdba@dmdsc1 bin]$ ps -ef | grep dmw #杀掉数据库服务进程
kill -9 XX XX #kill掉对应的进程ID
找到数据库进程和守护进程,kill掉,原来的DBCMIS_01就切换成了主库
[monitor] 2022-09-07 14:56:50: 检测到PRIMARY实例故障,开始对组(GRP1)执行自动接管
[monitor] 2022-09-07 14:56:50: 通知组(GRP1)当前活动的守护进程设置MID
[monitor] 2022-09-07 14:56:50: 通知组(GRP1)当前活动的守护进程设置MID成功
[monitor] 2022-09-07 14:56:50: 开始使用实例GRP1_RT_02接管
[monitor] 2022-09-07 14:56:50: 通知守护进程GRP1_RT_02切换TAKEOVER状态
[monitor] 2022-09-07 14:56:50: 守护进程(GRP1_RT_02)状态切换 [OPEN-->TAKEOVER]
......
[monitor] 2022-09-07 14:56:53: 守护进程(GRP1_RT_02)状态切换 [TAKEOVER-->OPEN]
[monitor] 2022-09-07 14:56:53: 切换守护进程GRP1_RT_02为OPEN状态成功
[monitor] 2022-09-07 14:56:53: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2022-09-07 14:56:53: 清理守护进程(GRP1_RT_02)请求成功
[monitor] 2022-09-07 14:56:53: 使用实例GRP1_RT_02接管成功
[monitor] 2022-09-07 14:56:53: 组(GRP1)使用实例GRP1_RT_02自动接管成功
----恢复服务
---root用户
systemctl start DmServiceGRP1_RI_01 #开启数据库服务
[root@dm_s1 ~]# ps -ef | grep dms
avahi 726 1 0 13:32 ? 00:00:00 avahi-daemon: registering [dms1-91.local]
dmdba 2894 1 0 14:11 ? 00:00:00 /dm8/dmdbms/bin/dmserver path=/dm8/dmdbms/GRP1_RT_02/dm.ini -noconsole
root 3001 2783 0 14:12 pts/0 00:00:00 grep --color=auto dms
systemctl start DmWatcherServiceGRP1_RT_02 #开启守护进程
[root@dm_s1 dmdbms]# ps -ef | grep dmw
dmdba 3198 1 0 14:24 ? 00:00:00 /dm8/dmdbms/bin/dmwatcher path=/dm8/dmdbms/GRP1_RT_02/dmwatcher.ini -noconsole
root 3229 2783 0 14:25 pts/0 00:00:00 grep --color=auto dmw
在监视器中重点参数已经看到正常:
WSTATUS=open
INST_OK=ok
IMODE=standby
2.2、模拟主库服务器内部通信网络通信断裂
1、查看内部通信的网卡
命令:ip a
enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ba:49:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.1/24 brd 192.168.99.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::8d7d:2126:2a96:181c/64 scope link
2、禁用内部通信的网卡
ifconfig enp0s8 down
--结论:自动由备库接管
3、启用内部通信的网卡
ifconfig enp0s8 up
--结论:自动加入主备集群中
2.3、模拟主库服务器掉电
----主机掉电
--结论:有备机自动切换接管
[monitor] 2022-09-07 15:56:03: 检测到PRIMARY实例故障,开始对组(GRP1)执行自动接管
[monitor] 2022-09-07 15:56:03: 通知组(GRP1)当前活动的守护进程设置MID
[monitor] 2022-09-07 15:56:03: 通知组(GRP1)当前活动的守护进程设置MID成功
[monitor] 2022-09-07 15:56:03: 开始使用实例GRP1_RT_02接管
[monitor] 2022-09-07 15:56:03: 通知守护进程GRP1_RT_02切换TAKEOVER状态
.....
[monitor] 2022-09-07 15:56:05: 通知守护进程GRP1_RT_02切换OPEN状态
[monitor] 2022-09-07 15:56:06: 守护进程(GRP1_RT_02)状态切换 [TAKEOVER-->OPEN]
[monitor] 2022-09-07 15:56:06: 切换守护进程GRP1_RT_02为OPEN状态成功
[monitor] 2022-09-07 15:56:06: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2022-09-07 15:56:06: 清理守护进程(GRP1_RT_02)请求成功
[monitor] 2022-09-07 15:56:06: 使用实例GRP1_RT_02接管成功
----备机掉电
--结论:监视器将备机异常显示异常
onitor] 2022-09-07 16:09:08: 守护进程(GRP1_RT_01)状态切换 [OPEN-->MON CONFIRM]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-09-07 16:09:08 MON CONFIRM OK GRP1_RT_01 SUSPEND PRIMARY VALID 10 103687642 103687644
[monitor] 2022-09-07 16:09:09: 守护进程(GRP1_RT_01)状态切换 [MON CONFIRM-->FAILOVER]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-09-07 16:09:09 FAILOVER OK GRP1_RT_01 SUSPEND PRIMARY VALID 10 103687642 103687644
[monitor] 2022-09-07 16:09:11: 守护进程(GRP1_RT_01)状态切换 [FAILOVER-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-09-07 16:09:11 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 10 103687644 103687645
[monitor] 2022-09-07 16:09:12: 接收守护进程(GRP1_RT_02)消息超时
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-09-07 14:32:47 ERROR OK GRP1_RT_02 OPEN STANDBY INVALID 10 103687642 103687642
-2.5、监视器异常:掉电、进程异常
当监视器崩溃了之后,且主库掉了之后,备库不会转换为主库,因为故障自动切换模式数据守护系统中,主库守护进程监测到备库故障时,需要向确认监视器求证,确认备库是真的故障了,再启动故障处理流程将归档失效,避免引发脑裂所以在日常中,我们需要注意监视器是否正常,虽然暂时不影响正常使用,但是也需尽快恢复,保障业务不间断性
------------------------------------------//实时主备部署到此结束//------------------------------------------------
更多内容,请访问达梦社区地址:https:eco.dameng.com