达梦数据库读写分离集群的搭建
1.相关概念
1.1.读写分离的概念及模式
通过即时归档或实时归档所组成的主备系统
读写分离集群通过配置"一致性模式"保证主库和备库数据一致性
通过DM数据库的各种接口, 实现将读操作自动分流到备库
一致性模式: 该模式下, 当发送SELECT语句时, 不论该语句在主库执行还是备库执行其查询的结果都是一样的
高性能模式: 该模式下, 当发送SELECT语句时, 不能保证查询结果的一致性
1.2.数据守护
主库 primary模式, 提供完整数据库服务的实例, 对外提供服务
备库 standby模式, 提供只读服务
REDO 日志 记录物理数据页的变化
REDO 日志传输 主库通过MAL系统发送redo日志到备库, 日志是以RLOG_PKG为单位进行日志包的发送
REDO 日志重演 备库接收到主库的REDO日志后, 重新应用REDO日志, 严格安装REDO产生的顺序解析REOD日志, 修改相应的物理页, 并且重新应用的过程中备库也会将数据写入本地REOD
守护进程 (dmwatcher) 监控数据库实例运行状态和主备之间数据同步情况以及故障处理的方式
监视器 (dmmonitor) 监控守护进程, 数据库实例信息, 用于管理集群, 监控实例故障后切换
- 在数据守护中, 不严格区分数据库和数据库实例的概念, 数据库实例时唯一的标识 通常使用实例名来标记一个主库或者备库
1.3.归档日志类型
实时归档
本地归档
异步归档
数据守护集群: 本地归档, 实时归档, 异步归档
读写分离集群: 本地归档, 即时归档
MPP主备集群 : 本地归档, 实时归档
本地归档: LOCAL ARCHIVE 最多设置8个, 将redo日志进行本地归档, 在写入redo日之后触发
实施归档: REALTIME ARCHIVE 最多设置8个, 在写入redo日志之前触发, 通过MAL系统发送redo日志到备机并等待返回确认消息
即时归档: TIMELY ARCHIVE 最多设置8个, 在写入redo日志之后触发, 通过MAL系统发送redo日志到备机并等待备机应用完成后返回消息
异步归档: ASYNC ARCHIVE 最多设置8个, 由备机定时同步redo日志
1.4.数据库模式
PRIMARY 服务正常, 修改对象强制生成REDO日志
NORMAL 服务正常, 操作无限限制
STANDBY 只读访问, 实时归档失败, 根据配置向本地归档写入REDO日志
- 所有模式, 必须在MOUNT状态下进行切换
2.搭建环境环境说明
- ip规划
虚拟机 | IP | 实列名 | 数据库名称 |
---|---|---|---|
主机(读) | 192.168.232.128 | its1 | its |
备机(写) | 192.168.232.129 | its2 | its |
- 端口规划
名称 | 端口 | 说明 |
---|---|---|
MAL_INST_PORT | 5236 | 实例端口 |
MAL_PORT | 16001 | MAL系统端口 |
MAL_DW_PORT | 17001 | 守护进程监听端口 |
MAL_INST_DW_PORT | 18001 | 本地实例守护进程的端口 |
- 目录规划
- /dm8 数据库软件目录
- /dmdata 数据文件目录
- /dmarch 归档日志目录
- /dmbak 备份目录
3.数据库软件安装
两个节点同样操作
3.1 读库
[root@itsapp1 ~]# su - dmdba
[dmdba@itsapp1 ~]$ cd /mnt/dm8/
[dmdba@itsapp1 dm8]$ ./DMInstall.bin -i
请以root系统用户执行命令:
/dm8/script/root/root_installer.sh
安装结束
[dmdba@itsapp1 dm8]$
[root@itsapp1 ~] # /dm8/script/root/root_installer.sh
3.2.写库
[root@itsapp2 ~]# su - dmdba
[dmdba@itsapp2 ~]$ cd /mnt/dm8/
[dmdba@itsapp2 dm8]$ ./DMInstall.bin -i
请以root系统用户执行命令:
/dm8/script/root/root_installer.sh
安装结束
4.初始化数据库实例
1、主库
[dmdba@itsapp1 bin]$ ./dminit PATH=/dmdata db_name=its instance_name=its1
2、备库
[dmdba@itsapp2 bin]$ ./dminit PATH=/dmdata db_name=its instance_name=its2
5.备份数据库
需要先启动数据实例
读库
[dmdba@itsapp1 bin]$ ./dmserver /dmdata/its/dm.ini
写库
[dmdba@itsapp2 bin]$ ./dmserver /dmdata/its/dm.ini
读库进行脱机备份
[dmdba@itsapp1 bin]$ ./dmrman
dmrman V8
RMAN> BACKUP DATABASE '/dmdata/its/dm.ini' FULL BACKUPSET '/dmbak/full_database';
6.主库进行数据库还原操作
1、读库复制备份文件到备库
[dmdba@itsapp1 bin]$ scp -r /dmbak/full_database 100.63.1.2:/dmbak/
2、写库进行恢复
[dmdba@itsapp2 bin]$ ./dmrman
dmrman V8
RMAN> RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/dmbak/full_database';
RMAN> RECOVER DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/dmbak/full_database';
RMAN> RECOVER DATABASE '/dmdata/its/dm.ini' UPDATE DB_MAGIC;
- 安装官方文档说的, 复制到随便的目录下进行恢复则报无效的备份集目录, 只能和主库一样在dmbak目录下进行恢复
[dmdba@itsapp2 bin]$ ./dmrman
dmrman V8
RMAN> RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/tmp/full_database';
RESTORE DATABASE '/dmdata/its/dm.ini' FROM BACKUPSET '/tmp/full_database';
file dm.key not found, use default license!
[-10001]:[错误码:-127]无效的备份集目录[/tmp/full_database]
RMAN>
7.配置读库所需的文件
1、dm.ini
[dmdba@itsapp1 ~]$ vi /dmdata/its/dm.ini
INSTANCE_NAME = its1
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2、dmarch.ini
[dmdba@itsapp1 ~]$ vi /dmdata/its/dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = its2
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 10240
3、dmmal.ini
[dmdba@itsapp1 ~]$ vi /dmdata/its/dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = its1
MAL_HOST = 192.168.232.128
MAL_PORT = 16001
MAL_INST_HOST = 100.63.1.1
MAL_INST_PORT = 5236
MAL_DW_PORT = 17001
MAL_INST_DW_PORT = 18001
[MAL_INST2]
MAL_INST_NAME = its2
MAL_HOST = 192.168.232.129
MAL_PORT = 16001
MAL_INST_HOST = 100.63.1.2
MAL_INST_PORT = 5236
MAL_DW_PORT = 17001
MAL_INST_DW_PORT = 18001
4、dmwatcher.ini
[dmdba@itsapp1 ~]$ vi /dmdata/its/dmwatcher.ini
[GRP_RW]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dmdata/its/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
8.配置写库所需的文件
1、读库复制配置文件到写库
[dmdba@itsapp1 ~]$ scp /dmdata/its/{dmarch,dmmal,dmwatcher}.ini 100.63.1.2:/dmdata/its/
2、dm.ini
[dmdba@itsapp2 ~]$ vi /dmdata/its/dm.ini
INSTANCE_NAME = its2
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
3、dmarch.ini
[dmdba@itsapp2 ~]$ vi /dmdata/its/dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = its1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 10240
4、dmmal.ini
[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = its1
MAL_HOST = 192.168.232.128
MAL_PORT = 16001
MAL_INST_HOST = 100.63.1.1
MAL_INST_PORT = 5236
MAL_DW_PORT = 17001
MAL_INST_DW_PORT = 18001
[MAL_INST2]
MAL_INST_NAME = its2
MAL_HOST = 192.168.232.129
MAL_PORT = 16001
MAL_INST_HOST = 100.63.1.2
MAL_INST_PORT = 5236
MAL_DW_PORT = 17001
MAL_INST_DW_PORT = 18001
5、dmwatcher.ini
[dmdba@itsapp2 ~]$ vi /dmdata/its/dmwatcher.ini
[GRP_RW]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dmdata/its/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
9.配置组件
9.1.以mount方式启动读写库
9.1.1.读库
[dmdba@itsapp1 bin]$ ./dmserver /dmdata/its/dm.ini mount
[dmdba@itsapp1 bin]$ ./disql
SQL> SP_SET_OGUID(453331);
SQL> ALTER DATABASE PRIMARY;
9.1.2.写库
[dmdba@itsapp2 bin]$ ./dmserver /dmdata/its/dm.ini mount
[dmdba@itsapp2 bin]$ ./disql
SQL> SP_SET_OGUID(453331);
SQL> ALTER DATABASE STANDBY;
9.2.各个节点启动dmwatcher进程
[dmdba@itsapp1 bin]$ ./dmwatcher /dmdata/its/dmwatcher.ini
DMWATCHER[4.0] V8
DMWATCHER[4.0] IS READY
[dmdba@itsapp2 bin]$ ./dmwatcher /dmdata/its/dmwatcher.ini
DMWATCHER[4.0] V8
DMWATCHER[4.0] IS READY
9.3.配置监视器
9.3.1配置
[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /dm8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP_RW]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.232.128:17001
MON_DW_IP = 192.168.232.129:17001
9.3.2.启动监视器
[dmdba@itsapp2 bin]$ ./dmmonitor /dmdata/its/dmmonitor.ini
9.4.注册服务
9.4.1.读库
[root@itsapp1 ~]# cd /dm8/script/root/
[root@itsapp1 root]# ./dm_service_installer.sh -t dmwatcher -p its1 -watcher_ini /dmdata/its/dmwatcher.ini
[root@itsapp1 root]# ./dm_service_installer.sh -t dmserver -p its1 -dm_ini /dmdata/its/dm.ini
9.4.2.写库
[root@itsapp2 ~]# cd /dm8/script/root/
[root@itsapp2 root]# ./dm_service_installer.sh -t dmwatcher -p its2 -watcher_ini/dmdata/its/dmwatcher.ini
[root@itsapp2 root]# ./dm_service_installer.sh -t dmserver -p its2 -dm_ini /dmdata/its/dm.ini
[root@itsapp2 root]# ./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini/dmdata/its/dmmonitor.ini
9.5.停止所有服务, 以后台方式启动
停止集群顺序
1、监视器
2、主库守护进程
3、备库守护进程
4、主库实例
5、备库实例
启动集群顺序
1、主库实例
[root@itsapp1 ~]# systemctl start DmServiceits1.service
2、备库实例
[root@itsapp2 ~]# systemctl start DmServiceits2.service
3、主句守护进程
[root@itsapp1 ~]# systemctl start DmWatcherServiceits1.service
4、备库守护进程
[root@itsapp2 ~]# systemctl start DmWatcherServiceits2.service
5、监视器
[root@itsapp2 ~]# systemctl start DmMonitorServiceconfirm.service
9.6.配置普通监视器, 用于查看集群信息
[dmdba@itsapp2 ~]$ vi /dmdata/its/dmmonitor_0.ini
MON_DW_CONFIRM = 0
MON_LOG_PATH = /dm8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP_RW]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.232.128:17001
MON_DW_IP = 192.168.232.129:17001
[dmdba@itsapp2 ~]$ cd /dm8/bin
[dmdba@itsapp2 bin]$ ./dmmonitor /dmdata/its/dmmonitor_0.ini
10.配置客户端连接
10.1读库
[root@itsapp1 ~]# vi /etc/dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)
ITSDATA=(100.63.1.1:5236,100.63.1.2:5236)
[ITSDATA]
TIME_ZONE=(480)
LANGUAGE=(cn)
LOGIN_MODE=(1)
SWITCH_TIME=(3)
SWITCH_INTERVAL=(10)
10.2.备库
[root@itsapp2 ~]# vi /etc/dm_svc.conf
TIME_ZONE=(480)
TIME_ZONE=(480)
LANGUAGE=(cn)
ITSDATA=(100.63.1.1:5236,100.63.1.2:5236)
[ITSDATA]
TIME_ZONE=(480)
LANGUAGE=(cn)
LOGIN_MODE=(1)
SWITCH_TIME=(3)
SWITCH_INTERVAL=(10)
以上就是达梦数据库读写分离集群搭建的全部步骤了,更多的资料可以访问达梦官网
官网地址: 达梦在线服务平台