操作系统版本 | CentOS7.6 |
数据库版本 | DM8_20240712 |
数据守护集群版本 | V4.0 |
目录
1.环境准备
配置读写分离集群,需要先搭建即时归档或实时归档模式的主备集群。我们使用上篇文档《在一台主机上搭建达梦主备集群》中的实时主备环境。
环境配置如下:
A 节点 | B 节点 | |
业务 IP | 192.168.220.128 | 192.168.220.128 |
心跳 IP | 127.0.0.1 | 127.0.0.1 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
数据库名 | DB01 | DB02 |
实例端口 | 6236 | 7236 |
角色 | 主库 | 备库 |
2.dm_svc.conf 配置
dm_svc.conf 是使用达梦数据库时非常重要的配置文件,它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载,且必须和接口/客户端工具位于同一台机器上才能生效。
vi /etc/dm_svc.conf
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DMRW=(192.168.220.128:6236,192.168.220.128:7236)
##服务配置
[DMRW]
LOGIN_MODE=(1)
RW_SEPARATE=(1)
RW_PERCENT=(30)
SWITCH_TIMES=(60)
SWITCH_INTERVAL=(1000)
服务名:DMRW
用于连接数据库的服务名,参数值格式为:服务名=(IP[:PORT],IP[:PORT],......)。
LOGIN_MODE
指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
RW_SEPARATE
表示是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
RW_PERCENT
表示读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例。可以根据主备库的实际压力来设定。
SWITCH_TIMES
表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。
SWITCH_INTERVAL
表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。
3.实现原理
实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。
4.测试
测试方案:主库的实例名是GRP1_RT_01,备库的实例名是GRP1_RT_02。我们使用disql,以服务名DMRW登录,分别执行INSERT、UPDATE、SELECT 观察这些SQL是在哪个实例上执行的。
登录:使用dm_svc.conf中配置的服务名DMRW
[dmdba@localhost ~]$ disql SYSDBA/SYSDBA@DMRW
创建测试表
SQL> create table tb_test_rw
(
id int,
insert_instance varchar2(20),
update_instance varchar2(20)
);
INSERT操作
SQL> insert into tb_test_rw(id,insert_instance,update_instance)
values(1,(select instance_name from v$instance),'');
SQL> commit;
UPDATE操作
SQL> update tb_test_rw set update_instance=(select instance_name from v$instance);
SQL> commit;
查看DML操作的执行节点
SQL> select id,insert_instance,update_instance,(select instance_name from v$instance) select_instance from tb_test_rw ;
测试结果:在同一个会话中,INSERT与UPDATE是在主库上执行的,SELECT是在备库上执行的,读写分离配置成功!
本文结束!