资讯动态

达梦读写分离集群配置与测试

发布时间:2026/8/22 10:42:44 来源:尧图企业网站定制
1. 概述读写分离集群是基于即时归档或实时归档实现的高性能数据库集群。读写分离集群最多可以配置8个即时备库提供数据同步备库故障自动处理恢复等功能。高并发的事务性系统中读多写少将读事务转移到备机执行减少单节点的并发压力。系统事务特征纯读操作的事务全部在备机执行纯写操作的事务全部在主机执行既有读又有写的事务从写事务开始全部再主机执行。读写分离集群和主备集群的主要区别适用场景不同读写分离聚焦负载均衡主备聚焦容灾备份归档方式不同读写分离是Timely, 主备是Realtime应用访问连接串不同读写分离jdbc:dm://DM_RWC?rwSeparate1rwPercent25; 数据守护jdbc:dm://DM_DW2. 配置背景主备集群搭建可参考达梦 数据守护集群部署-CSDN博客基于主备集群搭建后修改相关配置文件。2.1 归档方式dmarch.ini配置文件需要重启数据库才生效2.2 配置文件dm_svc.confdm_svc.conf 是使用达梦数据库时非常重要的配置文件它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载且必须和接口/客户端工具位于同一台机器上才能生效。因此在安装监视器的服务器下配置该文件。一般安装DM数据库时会生成linux 服务器上该文件存在目录/etc下面。如果/etc下没有则手动创建一个。dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前可配置所有的配置项服务配置区在后以“[服务名]”开头可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区服务配置区的相同配置项会覆盖全局配置区对应的配置项。其中服务名的作用时可以再url串中替代IP地址连接整个集群可以根据需要设置成别的名字。# dm_svc.conf 正确配置示例 TIME_ZONE(480) LANGUAGE(en) # 首先定义服务名 dmdw1(IP:5235,IP:5235) [dmdw1] # 然后配置参数不要用方括号节 LOGIN_MODE(1) RW_SEPARATE(1) RW_PERCENT(0) SWITCH_TIME(60) SWITCH_INTERVAL(1000)TIME_ZONE和LANGUAGE分别对应操作系统时区和语言LOGIN_MODE: 0-优先连接PRIMARY模式的库 Normal模式辞职最后选厕STANDBY模式1-只连接主库2-只连接备库3-优先连接STANDBY模式的库PRIMARY模式辞职最后选择NORMAL 4-有限连接NORMAL模式的库PRIMARY模式次之最后选择STANDBY模式。dmdw1(IP1:5235,IP2:5235)标识一个服务名为dmdw1把主机和备机都集成到一个服务名字dmdw1可以在disql登录时使用服务名替换url串中的IP地址从而连接整个集群./disql SYSDBA/Dameng12345dmdw1RW_SEPARATE1表示开启读写分离0-表示不启用 2-启用备库由客户端进行选择。RW_PERCENT1000~100表示将只读任务分发给备库的比例可以根据主备库的实际压力来设定。SWITCH_TIMES: 表示以服务名连接数据库时若未找到符合条件的库成功建立连接将尝试遍历服务名中库列表的次数。SWITCH_INTERVAL表示在服务器之间切换的时间间隔单位为毫秒有效值范围 1~9223372036854775807。3. 实现原理实现读写分离集群的基本思路是利用备库提供只读服务、无法修改数据的特性优先将所有操作发送到备库执行一旦备库执行报错则发送到主库重新执行。通过备库“试错”这么一个步骤自然地将只读操作分流到备库执行。并且备库“试错”由接口层自动完成对应用透明。4. 测试测试方案 主库实例名是GRP1_MANDY1 备库实例名是GRP1_MANDY2。 使用dmdw1服务名登录在监视器服务器下分别执行INSERT, UPDATE, SELECT观察SQL是在哪个实例上执行。备注此过程一致报错无法连接通过排查是5235端口无法通因此修改主库和备库防火墙端口白名单手动加入5235端口后可以正常访问。1. 创建一张测试表SQL create table test_rw(id int, insert_instance varchar(20));2. 插入一条数据正确的话是到主库SQL insert into test_rw values(1, (select instance_name from v$instance)); SQL commit;3. 更新数据SQL ALTER TABLE test_rw ADD update_instance VARCHAR(20); SQL UPDATE test_rw SET update_instance (SELECT instance_name FROM v$instance); SQL commit;3. 查询数据应该是到备库SQL select id,insert_instance,update_instance,(select instance_name from v$instance) select_instance from test_rw;社区地址 https://eco.dameng.com

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价