达梦读写分离集群服务名配置

配置dm_svc.conf文件


[dmdba@DW_M ~]$ cat /etc/dm_svc.conf
# 全局配置区
GRP1=(192.168.43.131:32141,192.168.43.132:32142)
TIME_ZONE=(+480) #表示+8:00 时区
LOGIN_ENCRYPT=(0)
DIRECT=(Y)
# 服务配置区
[GRP1]
TIME_ZONE=(+540) #表示+9:00 时区
#指定优先登录的服务器模式。0:优先连接 Primary 模式的库,Normal 模式次之,
#最后选择 Stantby 模式;1:只连接主库;2:只连接备库;3:优先连接 Standby 模式
#的库,Primary 模式次之,最后选择Normal模式;4:优先连接Normal模式的库,Primary
#模式次之,最后选择 Standby 模式。默认值为 0
LOGIN_MODE=(0)
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
RW_SEPARATE=(1) #是否启用读写分离 0 不启用1 启用
RW_PERCENT=(25) #读写分离分发比例

客户端通过服务名连接,新增、查询都成功

[dmdba@DW_M ~]$ disql SYSDBA/SYSDBA@GRP1

Server[192.168.43.132:32142]:mode is primary, state is open
login used time : 4.632(ms)
disql V8
SQL> /
please input cmd
SQL> select * from test1;
select * from test1;
[-2106]:Error in line: 1
Invalid table or view name [TEST1].
used time: 2.289(ms). Execute id is 0.
SQL> create table test1(a datetime);
executed successfully
used time: 22.287(ms). Execute id is 300.
SQL> insert into test1 values(now());
affect rows 1

used time: 4.074(ms). Execute id is 301.
SQL> select * from test1;

LINEID     A
---------- --------------------------
1          2021-07-26 09:06:11.706297

used time: 1.208(ms). Execute id is 302.
SQL> commit;
executed successfully
used time: 2.212(ms). Execute id is 303.
 

模拟主库故障,客户端操作新增记录失败,主库故障恢复,新增仍然失败,需要手动重启客户端工具才可以

在模拟故障时 通过监视器命令kill主库实例:,守护不会自动拉起实例,需要通过命令开启主库实例;

如果在主库机器,直接kill主库实例,主库守护进程会自动拉起主库实例

SQL> insert into test1 values(now());
insert into test1 values(now());
[-2018]:Error in line: 1
Try to insert/update/delete table table is not temporary or contains lob on standby mode.
used time: 1.039(ms). Execute id is 0.
SQL> /
insert into test1 values(now());
[-2018]:Error in line: 1
Try to insert/update/delete table table is not temporary or contains lob on standby mode.
used time: 0.770(ms). Execute id is 0.
SQL> select now();

LINEID     NOW()
---------- --------------------------
1          2021-07-26 09:18:12.186514

used time: 5.890(ms). Execute id is 400.
SQL> exit;
[dmdba@DW_M ~]$ disql SYSDBA/SYSDBA@GRP1

Server[192.168.43.132:32142]:mode is primary, state is open
login used time : 4.219(ms)
disql V8
SQL> /
please input cmd
SQL> select * from test1;

LINEID     A
---------- --------------------------
1          2021-07-26 09:06:11.706297

used time: 11.132(ms). Execute id is 500.

dm_svc.cong配置参数

可参见考《 DM8 系统管理员手册》2.1.1.4

dm_svc.conf 文件中常用配置项目说明:

 SERVERNAME 连接服务名,用户通过连接服务名访问数据库。

 IP 数据库所在的 IP 地址,如果是 IPv6 地址,为了区分端口,需要用[]封闭 IP 地址。

 PORT 数据库使用的 TCP 连接端口,可选配置,不配置则使用连接上指定的端口。

 LOGIN_MODE 指定优先登录的服务器模式。0:优先连接 Primary 模式的库,Normal 模式次之, 最后选择 Stantby 模式;1:只连接主库;2:只连接备库;3:优先连接 Standby 模式 的库,Primary 模式次之,最后选择Normal模式;4:优先连接Normal模式的库,Primary 模式次之,最后选择 Standby 模式。默认值为 0。

 SWITCH_TIME 检测到数据库实例故障时,接口在服务器之间切换的次数;超过设置次数没有连接到有 效数据库时,断开连接并报错。有效值范围 1~9223372036854775807,默认值为 3。

 SWITCH_INTERVAL 表示在服务器之间切换的时间间隔 ,单位为毫秒,有效值范围 1~9223372036854775807,默认值为 200。

 RW_SEPARATE 指定是否启用读写分离。0 表示不启用读写分离;1 表示启用读写分离,默认值为 0。

 

 RW_PERCENT 启用读写分离时,读写分离的分发比例,有效值范围 0~100,默认值为 25。

达梦技术社区:https://eco.dameng.com


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Spring Boot与达梦数据库的读写分离集群,您需要进行以下步骤: 1. 配置数据源:打开Spring Boot项目的application.properties文件,配置主库和从库的数据源信息。例如: ``` # 主库数据源 spring.datasource.primary.url=jdbc:dme://localhost:5236/demo spring.datasource.primary.username=root spring.datasource.primary.password=root # 从库数据源 spring.datasource.secondary.url=jdbc:dme://localhost:5236/demo spring.datasource.secondary.username=root spring.datasource.secondary.password=root ``` 2. 配置数据源路由:使用Spring Boot提供的AbstractRoutingDataSource类,创建一个数据源路由器,根据SQL语句的类型(读/写)选择合适的数据源。例如: ``` public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 根据上下文选择合适的数据源 return DatabaseContextHolder.getDatabaseType(); } } ``` 3. 配置数据源上下文:使用ThreadLocal类保存当前线程的数据源类型,以便在数据源路由器中选择正确的数据源。例如: ``` public class DatabaseContextHolder { private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>(); public static void setDatabaseType(DatabaseType databaseType) { contextHolder.set(databaseType); } public static DatabaseType getDatabaseType() { return contextHolder.get(); } public static void clearDatabaseType() { contextHolder.remove(); } } public enum DatabaseType { PRIMARY, SECONDARY } ``` 4. 配置事务管理器:使用Spring Boot提供的JpaTransactionManager类,为主库和从库分别配置事务管理器。例如: ``` @Configuration @EnableTransactionManagement public class TransactionConfig { @Autowired @Qualifier("primaryEntityManagerFactory") private EntityManagerFactory primaryEntityManagerFactory; @Autowired @Qualifier("secondaryEntityManagerFactory") private EntityManagerFactory secondaryEntityManagerFactory; @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(primaryEntityManagerFactory); return transactionManager; } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(secondaryEntityManagerFactory); return transactionManager; } } ``` 5. 配置JPA和Hibernate:为主库和从库分别配置JPA和Hibernate。例如: ``` @Configuration @EnableJpaRepositories( basePackages = "com.example.demo.primary", entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager" ) @EnableTransactionManagement public class PrimaryDataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.demo.primary") .persistenceUnit("primary") .build(); } @Primary @Bean(name = "primaryJpaProperties") @ConfigurationProperties(prefix = "spring.jpa.primary") public JpaProperties primaryJpaProperties() { return new JpaProperties(); } @Primary @Bean(name = "primaryHibernateProperties") @ConfigurationProperties(prefix = "spring.jpa.primary.hibernate") public HibernateProperties primaryHibernateProperties() { return new HibernateProperties(); } } @Configuration @EnableJpaRepositories( basePackages = "com.example.demo.secondary", entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) @EnableTransactionManagement public class SecondaryDataSourceConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.demo.secondary") .persistenceUnit("secondary") .build(); } @Bean(name = "secondaryJpaProperties") @ConfigurationProperties(prefix = "spring.jpa.secondary") public JpaProperties secondaryJpaProperties() { return new JpaProperties(); } @Bean(name = "secondaryHibernateProperties") @ConfigurationProperties(prefix = "spring.jpa.secondary.hibernate") public HibernateProperties secondaryHibernateProperties() { return new HibernateProperties(); } } ``` 6. 使用数据源:在需要使用数据源的地方,通过调用DatabaseContextHolder.setDatabaseType()方法设置当前线程的数据源类型,然后执行SQL语句即可。例如: ``` @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void save(User user) { DatabaseContextHolder.setDatabaseType(DatabaseType.PRIMARY); userRepository.save(user); DatabaseContextHolder.setDatabaseType(DatabaseType.SECONDARY); userRepository.save(user); } } ``` 这样,就可以实现Spring Boot与达梦数据库的读写分离集群了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值