达梦数据库守护集群搭建笔记

  • 环境准备
  • 修改服务器名称
  • 免密登录
  • 服务器名称访问
  • 磁盘合理分配与挂载
  • 磁盘分区
  • 格式化分区
  • 磁盘挂载
  • 创建 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"

配置监视器

  1. 确认监视器要在非主备节点的服务器上部署。
  2. 确认监视器配置文件一定放在监视器所在服务器上面并注册后台自启服务。

确认监视器-配置文件

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";