达梦数据库守护集群搭建笔记
- 环境准备
- 修改服务器名称
- 免密登录
- 服务器名称访问
- 磁盘合理分配与挂载
- 磁盘分区
- 格式化分区
- 磁盘挂载
- 创建 dmdba 用户
- 环境检查(略)
- 安装数据库
- 配置 A 服务器(dmdb1)
- 实例、备份数据
- 替换dmarch.ini
- 创建dmmal.ini
- 创建dmwatcher.ini
- 拷贝实例到B服务器
- 注册服务
- *备注* _删除自启服务_
- 配置 B 服务器(dmdb2)
- 修改dm.ini
- 修改dmarch.ini
- 与A服务器相同的配置项
- 注册服务
- *备注* _删除自启服务_
- 恢复数据
- 配置监视器
- 确认监视器-配置文件
- 注册服务
- *备注* _删除自启服务_
- 非确认监视器-配置文件
- *备注* _非确认监视器_
- 启动服务
- 启动数据库服务
- A 服务器(dmdb1)
- B 服务器(dmdb2)
- 启动守护进程
- 启动监视器
- *备注* _启动非确认监视器_
- *备注* _集群启停操作顺序_
- 启:
- 停:
- dm_svc.conf配置
- 应用连接
环境准备
购买云服务器三台,按照之前的教程进行安装前的环境检查与修改
修改服务器名称
hostnamectl set-hostname dmdb1
hostnamectl set-hostname dmdb2
hostnamectl set-hostname dmdb3
免密登录
服务器 | 内网 | 外网 |
dmdb1 | 10.90.10.1 | 106.120.188.201 |
dmdb2 | 10.90.10.2 | 106.120.188.202 |
dmdb3 | 10.90.10.3 | 106.120.188.203 |
在三台服务器中依次执行如下命令
root@dmdb1:~# ssh-keygen
root@dmdb1:~# ssh-copy-id 124.239.252.27
root@dmdb1:~# ssh-copy-id 106.120.188.121
root@dmdb1:~# ssh-copy-id 106.120.188.209
重复上述步骤在另外两台服务器
服务器名称访问
同样是在三台服务器中都要修改/etc/hosts文件
root@dmdb1:~# nano /etc/hosts
127.0.0.1 localhost
106.120.188.201 dmdb1
106.120.188.202 dmdb2
106.120.188.203 dmdb3
磁盘合理分配与挂载
磁盘分区
个人非生产数据库磁盘分配可按此比例分配即可
dmdata:dmbak:dmarch=2:4:1
由于我的服务器只申请了一张数据盘,需要将磁盘分区并挂载到上述三个路径
root@dmdb1:~# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc3102862.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): 12584345
Created a new partition 1 of type 'Linux' and of size 6 GiB.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12584346-41943039, default 12584960):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (12584960-41943039, default 41943039): 35651891
Created a new partition 2 of type 'Linux' and of size 11 GiB.
Command (m for help): n
Partition type
p primary (2 primary, 0 extended, 2 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (3,4, default 3): 3
First sector (12584346-41943039, default 35653632):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (35653632-41943039, default 41943039):
Created a new partition 3 of type 'Linux' and of size 3 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
root@dmdb3:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
└─vda1 252:1 0 40G 0 part /
vdb 252:16 0 20G 0 disk
├─vdb1 252:17 0 6G 0 part
├─vdb2 252:18 0 11G 0 part
└─vdb3 252:19 0 3G 0 part
同样是三台服务器全部需要操作
格式化分区
root@dmdb1:~# mkfs -t ext4 /dev/vdb1
root@dmdb1:~# mkfs -t ext4 /dev/vdb2
root@dmdb1:~# mkfs -t ext4 /dev/vdb3
root@dmdb1:~# mkfs -t ext4 /dev/vdb1
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 1572787 4k blocks and 393216 inodes
Filesystem UUID: 8aff0db1-dece-4598-a147-a1b1452bb34e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@dmdb1:~# mkfs -t ext4 /dev/vdb2
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 2883366 4k blocks and 720896 inodes
Filesystem UUID: 26592a63-5b87-44d5-bc5d-6428b8b14a1e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@dmdb1:~# mkfs -t ext4 /dev/vdb3
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 786176 4k blocks and 196608 inodes
Filesystem UUID: aeffbb7b-0429-492c-88ef-44cf2206fe57
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
同样是三台服务器全部需要操作
磁盘挂载
root@dmdb1:~# mkdir -p /dmdata
root@dmdb1:~# mount /dev/vdb1 /dmdata/
root@dmdb1:~# mkdir -p /dmbak
root@dmdb1:~# mount /dev/vdb2 /dmbak/
root@dmdb1:~# mkdir -p /dmarch
root@dmdb1:~# mount /dev/vdb3 /dmarch/
设置开机启动自动挂载,即修改 /etc/fstab 文件,在最后添加
/dev/vdb1 /dmdata ext4 defaults 0 0
/dev/vdb2 /dmbak ext4 defaults 0 0
/dev/vdb3 /dmarch ext4 defaults 0 0
其中第一个0表示不会备份此文件系统,第二个0表示fsck不会检查此文件系统
同样是三台服务器全部需要操作,操作完效果:
root@dmdb1:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
└─vda1 252:1 0 40G 0 part /
vdb 252:16 0 20G 0 disk
├─vdb1 252:17 0 6G 0 part /dmdata
├─vdb2 252:18 0 11G 0 part /dmbak
└─vdb3 252:19 0 3G 0 part /dmarch
创建 dmdba 用户
root@dmdb1:~# groupadd dinstall -g 2001
root@dmdb1:~# useradd -g dinstall dmdba -u 1001
root@dmdb1:~# passwd dmdba
root@dmdb1:~# <输入密码>
root@dmdb1:~# <再次输入密码>
root@dmdb1:~# mkdir -p /opt/dmdbms
root@dmdb1:~# chown dmdba.dinstall /opt/dmdbms -R
root@dmdb1:~# chmod 777 /opt/dmdbms -R
root@dmdb1:~# chown dmdba.dinstall /dmdata -R
root@dmdb1:~# chmod 777 /dmdata -R
root@dmdb1:~# chown dmdba.dinstall /dmbak -R
root@dmdb1:~# chmod 777 /dmbak -R
root@dmdb1:~# chown dmdba.dinstall /dmarch -R
root@dmdb1:~# chmod 777 /dmarch -R
环境检查(略)
环境检查部分可见博客:
安装数据库
创建存放ISO镜像文件的路径
root@dmdb1:~# mkdir -p /opt/dmsetup
root@dmdb2:~# mkdir -p /opt/dmsetup
root@dmdb3:~# mkdir -p /opt/dmsetup
上传ISO安装包到dmdb1该路径,并将ISO安装包从dmdb1传递到另外两台服务器
root@dmdb1:~# scp -r /opt/dmsetup/dm8_20211111_x86_rh6_64_ent_8.1.2.18_pack16.iso root@dmdb2:/opt/dmsetup/
root@dmdb1:~# scp -r /opt/dmsetup/dm8_20211111_x86_rh6_64_ent_8.1.2.18_pack16.iso root@dmdb3:/opt/dmsetup/
挂载ISO镜像文件
root@dmdb1:~# chown dmdba.dinstall /opt/dmsetup -R
root@dmdb1:~# chmod 777 /opt/dmsetup -R
root@dmdb1:~# mount -o loop /opt/dmsetup/dm8_20211111_x86_rh6_64_ent_8.1.2.18_pack16.iso /opt/dmsetup
安装数据库
root@dmdb1:~# su - dmdba
dmdba@dmdb1:~$ /opt/dmsetup/DMInstall.bin -i
安装路径:/opt/dmdbms
请以root系统用户执行命令:
root@dmdb1:~# /opt/dmdbms/script/root/root_installer.sh
同样是三台服务器全部需要操作挂载镜像与安装命令
配置 A 服务器(dmdb1)
实例、备份数据
初始化实例,并前台启动
dmdba@dmdb1:~$ /opt/dmdbms/bin/dminit PATH=/dmdata/ INSTANCE_NAME=DM1_01 PAGE_SIZE=32 LOG_SIZE=2048
dmdba@dmdb1:~$ /opt/dmdbms/bin/dmserver /dmdata/DAMENG/dm.ini
需要另开窗口
其中归档日志 SPACE_LIMIT 大小需要根据自己的磁盘空间设定(我的是3G)
dmdba@dmdb1:~$ /opt/dmdbms/bin/disql SYSDBA/SYSDBA@124.239.252.45:5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=3072';
SQL> ALTER DATABASE OPEN;
备份数据
SQL> BACKUP DATABASE BACKUPSET '/dmbak/BACKUP_FILE';
修改 dm.ini 参数
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
关闭前台实例服务。如果上述热备时出现报错,可使用冷备进行备份
dmdba@dmdb1:~$ /opt/dmdbms/bin/dmrman
RMAN> BACKUP DATABASE '/dmdata/DAMENG/dm.ini' BACKUPSET '/dmbak/BACKUP_FILE';
替换dmarch.ini
dmdba@dmdb1:~$ nano /dmdata/DAMENG/dmarch.ini
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmarch/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位MB
ARCH_SPACE_LIMIT = 3072 #归档上限,单位MB
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DM1_02 #实时归档目标实例名
创建dmmal.ini
dmdba@dmdb1:~$ nano /dmdata/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定MAL链路断开的时间
MAL_TEMP_PATH = /dmdata/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 = DM1_01 #实例名,和 dm.ini的INSTANCE_NAME一致
MAL_HOST = 10.90.10.1 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5336 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 106.120.188.201 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例对外服务端口,和dm.ini的PORT_NUM一致
MAL_DW_PORT = 5436 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5536 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DM1_02
MAL_HOST = 10.90.10.2
MAL_PORT = 5336
MAL_INST_HOST = 106.120.188.202
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
创建dmwatcher.ini
dmdba@dmdb1:~$ nano /opt/dmdbms/data/DAMENG/dmwatcher.ini
[GRWC1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #故障自动切换模式
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 45331 #守护系统唯一OGUID值
INST_INI = /dmdata/DAMENG/dm.ini #dm.ini文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
拷贝实例到B服务器
dmdba@dmdb1:~$ scp -r /dmdata/DAMENG/ dmdba@dmdb2:/dmdata/
注册服务
实例服务
root@dmdb1:~# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DM1_01 -dm_ini /dmdata/DAMENG/dm.ini -m mount
守护进程服务
root@dmdb1:~# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini
备注 删除自启服务
实例服务
root@dmdb1:~# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDM1_01
守护进程服务
root@dmdb1:~# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
配置 B 服务器(dmdb2)
修改dm.ini
dmdba@dmdb2:~$ nano /dmdata/DAMENG/dm.ini
INSTANCE_NAME = DM1_02 #实例名称
修改dmarch.ini
dmdba@dmdb2:~$ nano /dmdata/DAMENG/dmarch.ini
ARCH_DEST = DM1_01 #实时归档目标实例名
与A服务器相同的配置项
dmmal.ini、dmwatcher.ini
因为从dmdb1中传过来,故无需修改
注册服务
实例服务
root@dmdb2:~# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DM1_02 -dm_ini /dmdata/DAMENG/dm.ini -m mount
守护进程服务
root@dmdb2:~# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini
备注 删除自启服务
实例服务
root@dmdb2:~# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDM1_02
守护进程服务
root@dmdb2:~# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
恢复数据
将备份文件从 dmdb1 传到 dmdb2
dmdba@dmdb1:~$ scp -r /dmbak/BACKUP_FILE/ dmdba@dmdb2:/dmbak/
还原数据
dmdba@dmdb1:~$ /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmbak/BACKUP_FILE'"
dmdba@dmdb1:~$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmbak/BACKUP_FILE'"
dmdba@dmdb1:~$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
配置监视器
- 确认监视器要在非主备节点的服务器上部署。
- 确认监视器配置文件一定放在监视器所在服务器上面并注册后台自启服务。
确认监视器-配置文件
dmdba@dmdb3:~$ nano /opt/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /opt/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位MB
[GDW1]
MON_INST_OGUID = 45331 #组GRWC1的唯一OGUID值
MON_DW_IP = 10.90.10.1:5436 #IP对应MAL_HOST,PORT对应MAL_DW_PORT
MON_DW_IP = 10.90.10.2:5436
注册服务
root@dmdb3:~# /opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /opt/dmdbms/bin/dmmonitor.ini
备注 删除自启服务
root@dmdb3:~# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor
非确认监视器-配置文件
只是 MON_DW_CONFIRM 参数与确认监视器不一样
dmdba@dmdb3:~$ nano /opt/dmdbms/bin/dmmonitor_manual.ini
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /opt/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位MB
[GRWC1]
MON_INST_OGUID = 45331 #组GRWC1的唯一OGUID值
MON_DW_IP = 10.90.10.1:5436 #IP对应MAL_HOST,PORT对应MAL_DW_PORT
MON_DW_IP = 10.90.10.2:5436
备注 非确认监视器
非确认监视器用来前台启动,进行交互查看集群状态
监视器常用命令
命令 | 含义 |
list | 查看守护进程的配置信息 |
show global info | 查看所有实例组的信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器 |
logout | 退出登录 |
choose switchover GRWC1 | 主机正常:查看可切换的主机的实例列表 |
switchover GRWC1.实例名 | 主机正常:使用指定组的指定实例,切换为主机 |
choose takeover GRWC1 | 主机故障:查看可切换为主机的实例列表 |
takeover GRWC1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
choose takeover force GRWC1 | 强制切换:查看可切换为主机的实例列表 |
takeover force GRWC1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
启动服务
启动数据库服务
A 服务器(dmdb1)
dmdba@dmdb1:~$ /opt/dmdbms/bin/DmServiceDM1_01 start
dmdba@dmdb1:~$ /opt/dmdbms/bin/disql SYSDBA/SYSDBA@106.120.188.201:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
B 服务器(dmdb2)
dmdba@dmdb2:~$ /opt/dmdbms/bin/DmServiceDM1_02 start
dmdba@dmdb2:~$ /opt/dmdbms/bin/disql SYSDBA/SYSDBA@106.120.188.202:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
启动守护进程
A/B 服务器(dmdb1和dmdb2)
dmdba@dmdb1:~$ /opt/dmdbms/bin/DmWatcherServiceWatcher start
dmdba@dmdb2:~$ /opt/dmdbms/bin/DmWatcherServiceWatcher start
启动监视器
dmdba@dmdb3:~$ /opt/dmdbms/bin/DmMonitorServiceMonitor start
备注 启动非确认监视器
dmdba@dmdb3:~$ /opt/dmdbms/bin/dmmonitor /opt/dmdbms/bin/dmmonitor_manual.ini
备注 集群启停操作顺序
启:
开启主机实例
开启备机实例
开启备机的守护进程
开启主机的守护进程
开启监视器
停:
退出监视器
关闭备机的守护进程
关闭主机的守护进程
关闭主机实例
关闭备机实例
dm_svc.conf配置
dmdba@dmdb1:~$ nano /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
DM1=(106.120.188.201:5236,106.120.188.202:5236)
[DM1]
LOGIN_MODE=(1)
SWITCH_TIME=(300)
SWITCH_INTERVAL=(200)
LOGIN_MODE:指定优先登录的服务器模式。
0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;
1:只连接主库;
2:只连接备库;
3:优先连接 STANDBY 模式的库, PRIMARY 模式次之,最后选择 NORMAL 模式;
4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择STANDBY 模式 。
SWITCH_TIMES:以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围1~9223372036854775807,默认值为1,可以设置至少3次用来避免由于网卡的波动照成数据库连接测频繁切换
SWITCH_INTERVAL :在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。
与参数SWITCH_TIMES、EP_SELECTOR配合使用,EP_SELECTOR设置为0,等待SWITCH_INTERVAL后会切换尝试连接下一个服务,EP_SELECTOR设置为1,等待SWITCH_INTERVAL后会继续尝试连接该服务器,直到SWITCH_TIMES次再切换下一个服务器。
应用连接
修改url连接串增加 jdbc:dm://DM1
如下:
static String dname = "dm.jdbc.driver.DmDriver";
static String url = "jdbc:dm://DM1";