前期规划
环境说明
IP规划
主机 | ip |
---|---|
DM-Z | 192.168.230.110,10.10.10.20 |
DM-B | 192.168.230.111,10.10.10.21 |
DM-B1 | 192.168.230.112,10.10.10.22 |
DM-J | 10.10.10.23 |
端口规划
安装规划
实现原理
实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先
将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”
这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,
对应用透明
读写分离集群数据库连接创建流程
- 用户发起数据库连接请求。
- 接口(JDBC、DPI 等)根据服务名配置(在 dm_svc.conf 中进行配置)登录主库。
- 主库挑选一个有效即时备库的 IP/Port 返回给接口。
- 接口根据返回的备库 IP 和 Port 信息,向备库发起一个连接请求。
- 备库返回连接成功信息。
- 接口响应用户数据库连接创建成功。
接口在备库上创建的连接是读写分离集群自动创建的;对用户而言,就是在主库上创建
了一个数据库连接。下图以配置了两个备库的读写集群为例,说明了读写分离集群的连接创
建流程
读写分离集群语句分发流程
- 接口收到用户的请求。
- 接口优先将 SQL 发送到备库执行。
- 备库执行并返回执行结果。如果接口收到的是备库执行成功消息,则转到第 6 步,
如果接口收到的是备库执行失败消息,则转到第 4 步。 - 重新将执行失败的 SQL 发送到主库执行。只要第 3 步中的 SQL 在备库执行失败,
则同一个事务后续的所有操作(包括只读操作)都会直接发送到主库执行。 - 主库执行并返回执行结果给接口。一旦主库上执行的写事务提交,则下次继续从第
1 步开始执行。 - 接口响应用户并将执行结果返回给用户。
配置文件说明
dm.ini文件
参数名 | 备注 |
---|---|
INSTANCE_NAME | 数据库实例名(长度不超过 16 个字符),与 dmmal.ini 中的 MAL_INST_NAME 对 应。配置数据守护系统时,应该保持INSTANCE_NAME 是全局唯一的。 |
PORT_NUM | 服务器监听通讯端口号,此参数配置应与dmmal.ini中的MAL_INST_PORT对应 |
MAL_INI | MAL 系统配置开关,0 表示不启用 MAL 系统,1 表示启用 MAL系统。 |
DW_INACTIVE_INTERVAL | 服务器认定守护进程未启动的时间,有效值范围(0~1800)位为 秒,默认 60秒。 |
ALTER_MODE_STATUS | 是否允许手工修改数据库的模式和状态以及OGUID,1表示允许,0 表示不允许 |
ARCH_INI | Redo 日志归档配置开关,0 表示不启动 Redo 日志归档,1 表示启用 Redo 日志归档 |
ENABLE_OFFLINE_TS | 是否允许 offline 表空间,1 表示允许,0 表示不允许,2 表示禁止备库,其他放开。 |
RLOG_SEND_APPLY_MON | 统计最近 64 次的日志发送信息 |
dmmal.ini文件
参数名 | 备注 |
---|---|
MAL_CHECK_INTERVAL | MAL 链路检测时间间隔 |
MAL_CONN_FAIL_INTERVAL | 判定 MAL 链路断开的时间 |
MAL_INST_NAME | 实例名,和 dm.ini 中的 INSTANCE_NAME 一致 |
MAL_HOST | MAL 系统监听 TCP 连接的 IP 地址 |
MAL_PORT | MAL 系统监听 TCP 连接的端口 |
MAL_INST_HOST | 实例的对外服务 IP 地址 |
MAL_INST_PORT | 实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 |
MAL_DW_PORT | 实例对应的守护进程监听 TCP 连接的端口 |
MAL_INST_DW_PORT | 实例监听守护进程 TCP 连接的端口 |
dmarch.ini文件
参数名 | 备注 |
---|---|
ARCH_TYPE | 即时归档类型 |
ARCH_DEST | 归档目标,本地归档为归档文件存放路径,其他归档方式设置为目标数据库实例名 |
ARCH_FILE_SIZE | 单位 Mb,本地单个归档文件最大值 |
ARCH_SPACE_LIMIT | 单位 Mb,0 表示无限制,范围 1024~4294967294M |
dmwatcher.ini文件
参数名 | 备注 |
---|---|
DW_TYPE | 全局守护类型 |
DW_MODE | 自动切换模式远程守护进程故障认定时间 |
INST_RECOVER_TIME | 主库守护进程启动恢复的间隔时间 |
INST_ERROR_TIME | 本地实例故障认定时间 |
INST_OGUID | 守护系统唯一 OGUID 值 |
INST_INI | dm.ini 配置文件路径 |
INST_AUTO_RESTART | 打开实例的自动启动功能 |
INST_STARTUP_CMD | 命令行方式启动 |
RLOG_SEND_THRESHOLD | 指定主库发送日志到备库的时间阀值,默认关闭 |
RLOG_APPLY_THRESHOLD | 指定备库重演日志的时间阀值,默认关闭 |
dmmonitor.ini文件
参数名 | 备注 |
---|---|
MON_DW_Confirm | 确认监视器模式 |
MON_LOG_PATH | 监视器日志文件存放路径 |
MON_LOG_INTERVAL | 每隔 60s 定时记录系统信息到日志文件 |
MON_LOG_FILE_SIZE | 每个日志文件最大 32M |
MON_LOG_SPACE_LIMIT | 不限定日志文件总占用空间 |
数据库安装
数据库安装可参考文章: 数据库安装.
数据准备
备份主库
使用dmrman对主库进行一次全量备份。备份集生成在/dm8/backup目录下备份集名称为‘DB_BAK_01’。
进入备份集生成目录中,将生成备份集拷贝到两个备库中
使用scp命令来进行远程拷贝
拷贝到备库1
拷贝到备库2
进入备库1中,对备份集进行恢复操作,执行恢复三部曲。
进入备库2中进行备份集恢复,操作步骤与备库1相同。
配置主库与备库
配置主库
配置主库dm.ini文件,修改内容如下。
INSTANCE_NAME = GRP1_RWW_01
PORT_NUM = 32141
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
配置主库dmmal.ini文件,此文件需要新建。
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01
MAL_HOST = 10.10.10.20
MAL_PORT = 61141
MAL_INST_HOST = 192.168.230.110
MAL_INST_PORT = 32141
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 10.10.10.21
MAL_PORT = 61142
MAL_INST_HOST = 192.168.230.111
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 10.10.10.22
MAL_PORT = 61143
MAL_INST_HOST = 192.168.230.112
MAL_INST_PORT = 32143
MAL_DW_PORT = 52143
MAL_INST_DW_PORT = 33143
配置主库dmarch.ini文件
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_02
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_03
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/data/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
配置主库dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453332
INST_INI = /dm8/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
以Mount方式来启动主库
设置主库OGUID
登录disql
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
设置主库模式
SQL>alter database primary;
这时使用disql登录数据库会发现数据库模式已经改为主库配置模式
配置备库
配置备库1
配置dm.ini文件,修改内容如下
INSTANCE_NAME = GRP1_RWW_02
PORT_NUM = 32142
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
配置dmmal.ini文件
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01
MAL_HOST = 10.10.10.20
MAL_PORT = 61141
MAL_INST_HOST = 192.168.230.110
MAL_INST_PORT = 32141
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 10.10.10.21
MAL_PORT = 61142
MAL_INST_HOST = 192.168.230.111
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 10.10.10.22
MAL_PORT = 61143
MAL_INST_HOST = 192.168.230.112
MAL_INST_PORT = 32143
MAL_DW_PORT = 52143
MAL_INST_DW_PORT = 33143
配置dmarch.ini文件
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_01
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_03
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/data/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
配置dmwatcher.ini文件
[GRP1]
DW_TYPE =GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453332
INST_INI = /dm8/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
以Mount方式启动备库
修改备库1的OGUID
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改备库1模式
SQL>alter database standby;
修改完成后可看到现在备库为备库配置模式
配置备库2
修改dm.ini文件
INSTANCE_NAME = GRP1_RWW_03
PORT_NUM = 32143
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
配置dmmal.ini文件
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01
MAL_HOST = 10.10.10.20
MAL_PORT = 61141
MAL_INST_HOST = 192.168.230.110
MAL_INST_PORT = 32141
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 10.10.10.21
MAL_PORT = 61142
MAL_INST_HOST = 192.168.230.111
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 10.10.10.22
MAL_PORT = 61143
MAL_INST_HOST = 192.168.230.112
MAL_INST_PORT = 32143
MAL_DW_PORT = 52143
MAL_INST_DW_PORT = 33143
配置dmarch.ini文件
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_01
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY
ARCH_DEST = GRP1_RWW_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/data/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
配置dmwatcher.ini文件
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453332
INST_INI = /dm8/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
以Mount方式启动备库
设置备库2得OGUID
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453332);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改备库2模式
alter database standby;
执行完成后再次登录可看到备库2状态改为备库配置模式
配置监视器
配置dmmonitor.ini文件
MON_DW_Confirm = 1
MON_LOG_PATH = /dm8/data/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453332
MON_DW_IP = 10.10.10.20:52141
MON_DW_IP = 10.10.10.21:52142
MON_DW_IP = 10.10.10.22:52143
在各个主备库上启动守护进程
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
启动后主备库处于打开状态
监视器可收到守护进行消息
至此,读写分离集群搭建完成