读写分离集群搭建
1.安装规划
1.1环境说明
机器名 | IP地址 | 初始状态 | 操作系统 | 备注 |
DW_P | 192.168.1.141 | 主库:GRP1_RWW_01 | Linux Redhat7.6 | 外部IP: 192.168.1.141 内部通信IP: 192.168.1.141 |
DW_S1 | 192.168.1.142 | 备库:GRP1_RWW_02 | Linux Redhat7.6 | 外部IP: 192.168.1.142 心跳IP: 192.168.1.142 |
DW_S2 | 192.168.1.143 | 备库:GRP1_RWW_03 | Linux Redhat7.6 | 外部IP: 192.168.1.143 心跳IP: 192.168.1.143 |
备注:此环境为自己搭建的虚拟机环境。外部通信和内部通信使用了同一个端口。在实际作业中两个IP需要独立出来,使用两个网络接口。
1.2端口规划
实例名 | PORT_NUM | MAL_INST_PORT | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
GRP1_RWW_01 | 5236 | 5236 | 5237 | 192.168.1.141 | 5238 | 5239 |
GRP1_RWW_02 | 5236 | 5236 | 5237 | 192.168.1.142 | 5238 | 5239 |
GRP1_RWW_03 | 5236 | 5236 | 5237 | 192.168.1.143 | 5238 | 5239 |
2.准备数据
2.1准备主库数据
2.1.1初始化主库
主库安装完成后先初始化,如图所示:
找到数据库安装目录下的bin目录。运行./dminit path=/dm8/data 表示把数据库文件放在data下。
2.1.2配置归档参数
调整dm.ini文件参数和dmarch.ini文件参数开启归档
ARCH_INI = 1
如上图所示在dm.ini配置中搜索ARCH_INI将参数改为1表示开启归档配置。(ARCH_INI=1)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 20480 #单位M根据磁盘大小决定
如上图所示创建一个dmarch.ini文件创建路径可以查看dm.ini文件配置中的CONFIG_PATH字段指向的路径,一般默认配置都在和dm.ini通目录。配置好后如果主库是新安装需要启动一次后才能使用mount启动。这里使用的新库所以先启动一次。启动后才能开启归档随后才能备份,最后将备份恢复到两台备库上。启动前可以先注册一下启动服务可以让启动在后台运行。直接使用dmserver启动会行形成一个交互界面。
2.1.3注册主库并启动
进入数据安装目录下的script/root/目录。找到dm_service_installer.sh注册脚本。
如图所示运行脚本进行注册。
- 启动./dm_service_installer.sh -t dmserver -dm.ini /dm8/data/DAMENG/dm.ini -p DMSERVER 其中-t表示注册的服务类型。-dm_ini表示dm.ini配置路径。-p表示为此服务增加后缀。
- 本例中就为DmService增加了后缀DMSERVER合起来就是DmServiceDMSERVER.service。注册好以后就可以使用了。然后启动一次主库然后关闭,只有主库正常启动后才能使用mount方式启动。
- 这里注册的服务启动方式有service DmServiceDMSERVER start/stop或者systemctl start/stop DmServiceDMSERVER。使用systemctl start/stop DmServiceDMSERVER方式需要先systemctl enable DmServiceDMSERVER后再使用start/stop。
- 最后把DmServiceDMSERVER拷贝到/etc/rc.d/init.d/或者/etc/init.d/因为/etc/rc.d/init.d/下的init.d是一个软连接实际拷贝的还是/etc/init.d/
- 最后把DmServiceDMSERVER拷贝到/etc/rc.d/init.d/或者/etc/init.d/因为/etc/rc.d/init.d/下的init.d是一个软连接实际拷贝的还是/etc/init.d/
- 增加随机启动chkconfig DmServiceDMSERVER on此方法在Redhat上可以使用。其余的可能有所不同。
2.1.4关闭主库进行脱机备份
关闭主库后就可以进行脱机备份
主库关闭后进行脱机备份操作
如图所示找到数据库安装目录下的bin目录并运行./dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/bak/BACKUP_FILE_01'"执行结束后在/dm8/bak/下就形成一个备份BACKUP_FILE_01此时主库操作可以先告一段落。
2.2主备两台备库
两台备库的操作是一样的,这里就只做一次说明。可以两台备库一起操作
2.2.1初始化备库
备库初始化跟主库操作一样,如果所示
找到数据库安装目录下的bin目录。运行./dminit path=/dm8/data 表示把数据库文件放在data下。
2.2.2将主库的备份拷贝到备库
现在/dm8/下创建一个bak目录。然后将主库上的BACKUP_FILE_01目录使用scp传输到备库bak目录下。命令为:scp -r 192.168.1.141:/dm8/bak/BACKUP_FILE_01/ ./ 其中-r表示传输整个目录。
2.2.3备库进行脱机还原
如图所示找到数据库安装目录下的bin目录依次输入:
./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/bak/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/bak/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
看到成功信息后表示还原成功
2.2.4注册备库
进入数据安装目录下的script/root/目录。找到dm_service_installer.sh注册脚本。
如图所示运行脚本进行注册。
- 运行./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p DMSERVER -m mount其中-t表示注册的服务类型。-dm_ini表示dm.ini配置路径。-p表示为此服务增加后缀。-m表示使用mount方式启动。这里最好带上此参数。防止后面误操作把数据库实例完全启动。这样会导致主备数据不一致。
- 本例中就为DmService增加了后缀DMSERVER合起来就是DmServiceDMSERVER.service。注册好以后就可以使用了。
- 这里注册的服务启动方式有service DmServiceDMSERVER start/stop或者systemctl start/stop DmServiceDMSERVER。使用systemctl start/stop DmServiceDMSERVER方式需要先systemctl enable DmServiceDMSERVER后再使用start/stop。
- 最后把DmServiceDMSERVER拷贝到/etc/rc.d/init.d/或者/etc/init.d/因为/etc/rc.d/init.d/下的init.d是一个软连接实际拷贝的还是/etc/init.d/
- 增加随机启动chkconfig DmServiceDMSERVER on此方法在Redhat上可以使用。其余的可能有所不同。
3.主库、备库进行配置
主备库都要对dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini四个文件进行配置。
dm.ini为主配置文件一般位于初始化目录下的DAMENG文件夹下DAMENG表示数据库名称。
dmmal.ini为MAL配置,存放目录由存放目录由dm.ini的CONFIG_PATH配置项指定。默认和dm.ini同目录。
dmarch.ini为归档配置,存放目录由存放目录由dm.ini的CONFIG_PATH配置项指定。默认和dm.ini同目录。
dmwatcher.ini为守护进程配置,存放位置没有特别限制应为是指定配置目录来启动,一般也和dm.ini同目录。
3.1主库GRP1_RWW_01配置
3.1.1配置dm.ini
INSTANCE_NAME = GRP1_RWW_01 #数据库实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
3.1.2配置dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.1.141 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_INST_HOST = 192.168.1.141 #实例的对外服务 IP 地址
MAL_DW_PORT = 5239 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5237 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 192.168.1.142
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.142
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 192.168.1.143
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.143
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
3.1.3配置dmarch.ini
ARCH_WAIT_APPLY = 1 #事务一致性
[ARCHIVE_REALTIME1] #实时归档[ARCHIVE_REALTIME1]及时归档[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RWW_02 #实时归档目标实例名
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RWW_03
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 20480 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.1.4配置dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #AUTO自动切换模式 MANUAL手动切换
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 = /etc/rc.d/init.d/DmServiceDMSERVER restart #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
此案例中dmwatcher.ini主库和备库名称完全一样。这里的INST_OGUID的值主备配置要一致。
3.1.5启动主库到mount状态
使用service DmServiceDMSERVER start mount让主库启动到mount状态。这里注意要加入mount参数。否则会直接启动主库。破坏主备数据平衡。为了避免错误。我们也可以把之前注册的DmServiceDMSERVER服务卸载掉。然后增加mount启动方式重新注册。
进入到数据库安装目录下的script/root/目录下执行./dm_service_uninstaller.sh -n DmServiceDMSERVER可以卸载之前注册的服务。dm_service_uninstaller.sh为卸载脚本。-n表示已经注册过的服务名。卸载后用mount方式进行重新注册。
执行./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p DMSERVER -m mount重新注册。这里增加-m mount参数。注册好后还是记得拷贝一次DmServiceDMSERVER服务到/etc/init.d/目录下。这时候就可以直接使用service DmServiceDMSERVER start启动主库到mount状态了。启动好后可以用命令ps -ef | grep dms查看当前进程状态是否正确。是否是dmdba用户以及mount状态
3.1.6设置OGUID参数
- 使用SYSDBA用户登录数据库。注意登录时自己设置的端口名。依然是进入到数据库安装目录下的bin目录使用./disql sysdba/SYSDBA@localhost:5236连接主库。
- 依次输入:
- SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
- sp_set_oguid(453332); #oguid值和之前配置文件中相同
- alter database primary; #设置为主库
- SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
执行完成后参数就设置完毕。
3.2备库GRP1_RWW_02配置
3.2.1配置dm.ini
INSTANCE_NAME = GRP1_RWW_02 #数据库实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
此案例中dm.ini主库和备库的差别就在INSTANCE_NAME实例名不同。其余均相同。
3.2.2配置dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.1.141 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_INST_HOST = 192.168.1.141 #实例的对外服务 IP 地址
MAL_DW_PORT = 5239 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5237 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 192.168.1.142
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.142
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 192.168.1.143
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.143
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
此案例中dmmal.ini主库和备库配置一样。
3.2.3配置dmarch.ini
ARCH_WAIT_APPLY = 1 #事务一致性
[ARCHIVE_REALTIME1] ##实时归档[ARCHIVE_REALTIME1]及时归档[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RWW_01 #实时归档目标实例名
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RWW_03
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 20480 #单位 Mb,0 表示无限制,范围 1024~4294967294M
此案例中dmarch.ini主库和备库区别就在ARCH_DEST中指定的实例名称为两外两套库的实例名。
3.2.4配置dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #AUTO自动切换模式 MANUAL手动切换
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 = /etc/rc.d/init.d/DmServiceDMSERVER restart #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
此案例中dmwatcher.ini主库和备库名称完全一样。这里的INST_OGUID的值主备配置要一致。
3.2.5启动备库到mount状态
使用之前注册好的服务直接启动备库到mount状态启动好后记得查看以下状态是否正确
3.2.6设置OGUID参数
和主库操作一样使用sysdba用户登录连接到主库。然后依次输入以下命令:
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
sp_set_oguid(453332); #oguid值和之前配置文件中相同
alter database standby; #设置成备库
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
执行完成后参数设置完毕
3.3备库GRP1_RWW_02配置
3.3.1配置dm.ini
INSTANCE_NAME = GRP1_RWW_02 #数据库实例名
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
此案例中dm.ini主库和备库的差别就在INSTANCE_NAME实例名不同。其余均相同。
3.3.2配置dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.1.141 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_INST_HOST = 192.168.1.141 #实例的对外服务 IP 地址
MAL_DW_PORT = 5239 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5237 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 192.168.1.142
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.142
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 192.168.1.143
MAL_PORT = 5238
MAL_INST_PORT = 5236
MAL_INST_HOST = 192.168.1.143
MAL_DW_PORT = 5239
MAL_INST_DW_PORT = 5237
此案例中dmmal.ini主库和备库配置一样。
3.3.3配置dmarch.ini
[ARCHIVE_REALTIME1] ##实时归档[ARCHIVE_REALTIME1]及时归档[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RWW_01 #实时归档目标实例名
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RWW_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 20480 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.3.4配置dmwatcher.ini
[GRP1] #GRP1为组名
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #AUTO自动切换模式 MANUAL手动切换
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 = /etc/rc.d/init.d/DmServiceDMSERVER restart #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
此案例中dmwatcher.ini主库和备库名称完全一样。这里的INST_OGUID的值主备配置要一致。
3.3.5启动备库到mount状态
两套备库方式一样。具体参考3.2.5章节。
3.3.6设置OGUID参数
两套备库方式一样。具体参考3.3.6章节
4.启动守护进程
主备库守护进程启动方式相同。这里统一说明。启动守护进程可以进入到数据库安装目录下的bin目录。直接使用./dmwatcher /dm8/data/DAMENG/dmwatcher.ini启动。也可以注册系统服务后启动。注册的系统服务可以在后台运行。否则会形成一个交互界面。
使用./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/DAMENG/dmwatcher.ini -p 01来进行注册。具体参数描述和之前2.1.3章节相同。注册好后直接启动。看到ok表示启动成功。
5.配置监控器并启动
5.1关闭防火墙
启动监控器以前记得关闭主备以及监控机器的防火墙服务。否则会系统会拦截端口通行导致无法通信。
依次输入命令:
systemctl stop firewalld.service
systemctl disable firewalld.service
配置监控需要创建dmmonitor.ini配置文件如图所示。路径可以放到和dm.ini同目录下。
MON_DW_CONFIRM = 1 #确认监视器模式
MON_TAKEOVER_SHUTDOWN = 10#主库正常退出时,备库自动接管需要等待的时间。范围0~86400
MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组 GRP1 的唯一 OGUID 值 #以下配置为监视器到组 GRP1 的守护进程的连接信息,以―IP:PORT‖的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.1.141:5239
MON_DW_IP = 192.168.1.142:5239
MON_DW_IP = 192.168.1.143:5239
配置完成后就可以启动监控了。启动监控进入到数据库安装目录下的bin目录执行./dmmonitor /dm8/data/DAMENG/dmmonitor.ini启动监控。如图所示
看到WSTAUS、ISTATUS、为open。并且FLSN和CLSN三组数据相同就是正常的。也可以输入tip命令查看状态。
6.测试集群
6.1数据同步测试
6.1.1主库操作
登录主库然后创建一张表并插入数据如果所示
这里需要commit一下。
6.1.2备库查询
登录备库然后再查询刚才主库建立的表t1是否存在,数据是否正确如图所示
可以看到创建的t1表存在并且插入的“qqq”数据也在。表示数据同步测试成功。
6.2故障测试
6.2.1自动主备切换测试
在主库人为造成一次故障。这里我使用的是模拟网络故障。让主库的主机网卡停掉使主库和备库以及主库和监视器之间不通。让监视器自动选择备库接管。
如图所示当监视器发现主库网络不通时自动选择一个合适的备库进行切换这里系统选择了GRP1_RWW_03切换成主库。需要注意的是自动切换需要在dmwatcher.ini中DW_MODE参数设置为AUTO表示自动切换。MANUAL为手动切换。Dmmonitor.ini中MON_DW_CONFIRM设置为1表示为确认监视器。MON_TAKEOVER_SHUTDOWN为多少秒后切换备机进行接管这里设置为10秒。以上参数不配置缺省情况在主库故障备库不会自动接管。需要手动接管。
6.2.2恢复主库加入集群
恢复主库主机网络。将之前停掉的网卡启动让网络恢复。让主库从新加入工作组。
可以看到主库恢复后自动切换为备库提供服务。
6.3手动切换
6.3.1恢复主备位置
根据上图可以看出在主库故障后备库接管,主库恢复故障后加入工作组时转为备库状态。如果想将原来的主库恢复身份可以进行手动切换。
通过以上三个图可以看到最后恢复到之前的主备身份状态也就是GRP1_RWW_01恢复主库身份。这里是非故障情况下手动切换的情况需要先输入login名使用sysdba用户登录。然后输入choose switchover可以查看当前可以切换的实例名。最后输入switchover GRP1_RWW_01来进行切换。
6.4自动分发
6.4.1启用sql日志
读写分离可以通过数据库中的sql日志来体现。Sql日志默认没有开启。可以使用动态开启sql日志。
如图所示。使用disql登录后使用函数SP_SET_PARA_VALUE(1,'SVR_LOG',1);可以动态开启sql日志记录。开启后。会在数据库安装目录下的log文件夹下面出现一个dmsql_XXXXXX.log的日志文件。
注意:这里主备库都要打开。方便查看。
此时sql日志功能就开启好了
6.4.2读事务自动分发
测试读写分离集群中读取事务是否会自动分发到备机上。测试前先需要在客户端和服务端做相关配置。确定启用读写分离。
服务端:
这需要配置一下RW_SEPARATE(1)和RW_PERCENT(50)其中RW_SEPARATE表示是否开启读写分离。1表示开启0表示不开启;RW_PERCENT表示读写分离的比例范围是0-100这里我设置50。服务端配置好后需要重启一下实例。可以使用service DmServiceDMSERVER restart重启。
注意:这里主备最好都打开。当主备身份切换后也可以正常使用。
客户端:
disql客户端可以支持开启读写分离配置。具体步骤为:
- 输入./disql /nolog。
- 看到SQL>界面输入login
- 一直回车看到提示“是否读写分离”选择“y”然后回车
- 看到提示“读写分离百分百”选择合适的数值0-100.这里选50.然后回车
- 连接到主库之后进行查询之前我们创建的t1表。
以上操作完成后可以通过查询主备sql日志看看查询操作是否在备机完成。
可以看到主机查询t1表格最后时间是9点40这个是没有配置读写分离之前的记录
这个是备机的日志。在配置好读写分离以后再次查询主机日志一直停留在9点40.后面查询记录出来的都是备机的日志。说明查询操作在备机执行。并且日志显示是主机地址连接过来的。因为我使用是是主机的disql客户端。这里大致流程可能是设置好读写分离配置以后。客户端向主机发起连接,主机收到连接通知客户端向备机发起连接。于是备机收到请求后相应查询结果返回给客户端。这里需要客户端和服务端相互配合。所以需要在服务端和客户端都做相应的配置。