目录
配置读写分离集群,有以下几种配置方案,可以根据实际情况部署:
1.只配置主库和最多8个即时备库。
2.只配置主库和最多8个实时备库。
3.只配置主库和最多8个异步备库。
4.配置主库、最多8个即时备库和最多8个异步备库。
5.配置主库、最多8个实时备库和最多8个异步备库。
在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配置多个异步备库用于分担统计报表等任务。
读写分离集群实现读写分离的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。
读写分离集群语句分发流程:
1.接口收到用户的请求。
2.接口优先将 SQL 发送到备库执行。
3.备库执行并返回执行结果。如果接口收到的是备库执行成功消息,则转到第 6 步,如果接口收到的是备库执行失败消息,则转到第 4 步。
4.重新将执行失败的 SQL 发送到主库执行。只要第 3 步中的 SQL 在备库执行失败,则同一个事务后续的所有操作(包括只读操作)都会直接发送到主库执行。
5.主库执行并返回执行结果给接口。一旦主库上执行的写事务提交,则下次继续从第1 步开始执行。
6.接口响应用户并将执行结果返回给用户。
1、环境说明
准备四台机器DW_P、DW_S1、DW_S2、DW_M,DW_P、DW_S1和 DW_S2用来部署主备库,DW_M用来部署确认监视器。其中 DW_P、DW_S1和 DW_S2配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机,DW_M接入内部网络。
四台机器事先都安装了DM,安装路径为’/ dm8',执行程序保存在'/dm8/bin'目录中,数据存放路径为’/dm8/data'。
本示例中组名为“GRP1”,配置为读写分离集群,主库命名为“DMDB1”,备库分别命名为“DMDB2”和“DMDB3”。
机器名 | IP地址 | 初始状态 | 操作系统 |
DM_P | 192.168.174.130(外网) 192.168.158.130(内网) | 主库 DMDB1 | CentOS-7-x86_64-DVD-2009 |
DM_S1 | 192.168.174.131(外网) 192.168.158.131(内网) | 备库 DMDB2 | CentOS-7-x86_64-DVD-2009 |
DM_S2 | 192.168.174.132(外网) 192.168.158.132(内网) | 备库 DMDB3 | CentOS-7-x86_64-DVD-2009 |
DM_M | 192.168.174.134(外网) | 监视器 | CentOS-7-x86_64-DVD-2009 |
1.1 数据准备
(1)正常关闭数据库:前台+后台
如果是克隆的已经安装达梦数据库,初始化过实例的虚拟机,脱机备份前需要先关闭数据库。
后台关闭:
systemctl stop DmServiceDMSERVER.service
数据库在初始化实例之后必须前台启动刷新一下!不然会出现守护进程无法自动将数据库转变为open状态,数据库将一直处于mount状态。
前台打开:切换到达梦数据库安装的bin目录下执行下面语句,我的达梦数据库bin目录路径为:/dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini
前台关闭:Ctrl+C
(2)进行脱机备份
到bin目录下使用dmrman工具进行脱机备份。
./dmrman.sh
RMAN> backup database '/dm8/data/DAMENG/dm.ini' full backupset '/dm8/fullbak';
(3)拷贝备份文件到备机
[dmdba@localhost ~]$ scp -r 192.168.174.130:/dm8/fullbak /dm8/
(4)备机进行脱机数据库还原与恢复
执行/dm8/bin目录下的dmrman工具
restore database '/dm8/data/DAMENG/dm.ini' from backsupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
2、配置主库DM_P
2.1 配置dm.ini
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开 归档
ALTER_MODE_SATUS= 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS= 2 #不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
INSTANCE_NAME = DMDB1 #实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
2.2 配置dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口
2.3 配置dmarch.ini
修改dmarch.ini,配置本地归档和即时归档。
vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB2 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB3 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
2.4 配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
vi /dm8/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一 OGUID 值
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
2.5 以mount配置启动主库
./dmserver /dm8/data/DAMENG/dm.ini mount
注意:一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间, 生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主 备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
2.6 设置OGUID值
启动命令行工具disql,登录主库设置oguid值。
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
2.7 修改数据库模式
alter database primary;
3、配置备库DW_S1
配置备库的实例名为DMDB2
3.1 配置dm.ini
vi /dm8/data/DAMENG/dm.ini
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开 归档
ALTER_MODE_SATUS= 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS= 2 #不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
INSTANCE_NAME = DMDB2 #实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
3.2 配置dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口
3.3 配置dmarch.ini
修改dmarch.ini文档,配置本地归档和即时归档。
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB3 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
3.4 配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
vi /dm8/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一 OGUID 值
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
3.5 以mount配置启动备库
./dmserver /dm8/data/DAMENG/dm.ini mount
3.6 设置OGUID值
进入DM安装目录的bin目录下,启动命令行工具disql,登录主库设置oguid值。
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
3.7 修改数据库模式
alter database standby;
4、配置备库PW_S2
配置备库的实例名为DMDB3
vi /dm8/data/DAMENG/dm.ini
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开 归档
ALTER_MODE_SATUS= 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS= 2 #不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
INSTANCE_NAME = DMDB3 #实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
4.1 配置dmmal.ini
vi /dm8/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口
4.2 配置dmarch.ini
修改dmarch.ini文档,配置本地归档和即时归档。
vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB2 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
4.3 配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
vi /dm8/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一 OGUID 值
INST_INI = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
4.4 以mount配置启动备库
./dmserver /dm8/data/DAMENG/dm.ini mount
4.5 设置OGUID值
进入DM安装目录的bin目录下,启动命令行工具disql,登录主库设置oguid值。
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
4.6 修改数据库模式
alter database standby;
5、配置监视器
vi /dm8/data/dmmonitor.ini
MON_DW_Confirm = 1 #确认监视器模式
MON_LOG_PATH = /dm8/data/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.158.130:52141
MON_DW_IP = 192.168.158.131:52142
MON_DW_IP = 192.168.158.132:52143
6、启动守护进程
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
7、启动监视器
./dmmonitor /dm8/data/dmmonitor.ini