一、读写分离的作用和意义

一般情况下,应用系统中查询等只读操作的比例远大于 Insert/Delete/Update 等

DML 操作,修改对象定义等 DDL 操作的比例则更低。但是,这些操作往往混杂在一起,在高并发、高压力情况下,会导致数据库性能下降,响应时间变长。借助读写分离集群,将只读操作自动分发到备库执行,可以充分利用备库的硬件资源,降低主库的并发访问压力,进而提升数据库的吞吐量。

二、读写分离的思路

实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。

三、读写分离部署

1、部署环境
系统:centos7
CPU架构:x86_64
虚拟机软件:virtualbox
虚拟机:192.168.43.31(主库)
192.168.43.44(备库)
192.168.43.86(监视器)
2、安装数据库
单库安装,不明白的可以看我写过的一个安装过程

3、初始化实例
数据库的安装目录:/dm8
实例目录:/dm8/dmrw
初始化实例:(主备库各执行一次)
./dminit path=/dm8 db_name=dmrw page_size=32
使用dminit初始化的实例,需要先前台起一次数据库服务,服务正常退出即可
./dmserver /dm8/dmrw/dm.ini
4、主库进行脱机备份,备库还原与恢复
主库备份:
./dmrman ctlstmt="backup database '/dm8/dmrw/dm.ini' backupset '/dm8/bakfull'
"
主库备份发送到备库
scp -r /dm8/bakfull/ 192.168.43.44:/dm8
备库进行主库备份的还原和恢复以及db_magic更新
./dmrman ctlstmt="restore database '/dm8/dmrw/dm.ini' from backupset '/dm8/bakfull/'"
./dmrman ctlstmt="recover database '/dm8/dmrw/dm.ini' from backupset '/dm8/bakfull/'"
./dmrman ctlstmt="recover database '/dm8/dmrw/dm.ini' update db_magic"
5、配置主库
1)修改实例的dm.ini文件参数
INSTANCE_NAME = dmrw1
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2)创建并配置归档文件dmarch.ini(实例所在目录)
[ARCHIVE_TIMELYE]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw2 #即时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
3)配置MAL系统配置文件dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = dmrw1 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.43.31 #MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.43.31 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = dmrw2 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.43.44 # MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.43.44 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
4)配置守护进程文件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 #守护系统唯一 OGUID 值
INST_INI = /dm8/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
 
#要求dmmal.ini和dmwatcher.ini文件主备库一致,所以直接发送到备库即可
scp dmmal.ini dmwatcher.ini 192.168.43.44:/dm8/dmrw
5)以mount方式启动数据库
./dmserver /dm8/dm.ini mount
新终端使用disql工具连接数据库
./disql SYSDBA/SYSDBA
修改主库的oguid:sp_set_oguid(453331);
修改主库模式为primary:alter database primary;
6)启动守护进程
./dmwatcher /dm8/dmrw/dmwatcher.ini
数据库会自动从mount转换成open状态;
 
6、配置备库
1)修改实例的dm.ini文件参数
INSTANCE_NAME = dmrw2
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2)创建并配置归档文件dmarch.ini(实例所在目录)
[ARCHIVE_TIMELY]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = dmrw1 #即时归档目标实例名(备库侧填写主库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dmdbms/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
3)查看主库发过来的文件:dmmal.ini和dmwatcher.ini
4)以mount方式启动数据库
./dmserver /dm8/dm.ini mount
新终端使用disql工具连接数据库
./disql SYSDBA/SYSDBA
修改备库的oguid:sp_set_oguid(453331);
修改备库模式为standby:alter database standby;
5)启动守护进程
./dmwatcher /dm8/dmrw/dmwatcher.ini
数据库会自动从mount转换成open状态;
7、监视器配置
第三台虚拟机可以不用初始化实例,安装数据库即可;
在安装目录下,新建监视器配置文件:dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP_RW]
MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.43.31:52141
MON_DW_IP = 192.168.43.44:52141
启动监视器:
./dmmonitor /dm8/dmmonitor.ini

用show查看两个实例的情况:

kingbasees读写分离集群部署 读写分离和集群_kingbasees读写分离集群部署

8、注册服务

验证配置没有问题后,把前台起的服务注册一下:

使用root用户,到安装目录的script/root下

守护进程:
./dm_service_installer.sh -t dmwatcher -p dmrw -watcher_ini/dm/dmrw/dmwatcher.ini
数据库服务进程:
./dm_service_installer.sh -t dmserver -p dmrw -dm_ini /dm8/dmrw/dm.ini
监视器进程:在192.168.43.86上注册
./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini /dm8/dmmonitor.ini

9、验证读写分离集群

主库创建测试表插入数据:

kingbasees读写分离集群部署 读写分离和集群_kingbasees读写分离集群部署_02

备库查询数据:

kingbasees读写分离集群部署 读写分离和集群_数据库_03