如何设置多个DB_DISOVERY

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:

sharding-proxy 5.1.1

场景、问题:

设置多个DB_DISCOVERY 只有1个生效

rules:
- !DB_DISCOVERY
  dataSources:
    ds_0:
      dataSourceNames:
        - ds_01
        - ds_02
      discoveryHeartbeatName: replication_delay_heartbeat_0
      discoveryTypeName: replication_delay_0
  discoveryHeartbeats:
    replication_delay_heartbeat_0:
      props:
        keep-alive-cron: '0/1 * * * * ?'
  discoveryTypes:
    replication_delay_0:
      type: SHOW_SLAVE_STATUS
      props:
        delay-milliseconds-threshold: 10000

- !DB_DISCOVERY
  dataSources:
    ds_1:
      dataSourceNames:
        - ds_11
        - ds_12
      discoveryHeartbeatName: replication_delay_heartbeat_1
      discoveryTypeName: replication_delay_1
  discoveryHeartbeats:
    replication_delay_heartbeat_1:
      props:
        keep-alive-cron: '0/1 * * * * ?'
  discoveryTypes:
    replication_delay_1:
      type: SHOW_SLAVE_STATUS
      props:
        delay-milliseconds-threshold: 10000

启动后查看只有1个生效:

mysql> SHOW DB_DISCOVERY RULES\G
*************************** 1. row ***************************
              group_name: ds_0
       data_source_names: ds_01,ds_02
primary_data_source_name: ds_01
          discovery_type: {name=replication_delay_0, type=SHOW_SLAVE_STATUS, props={delay-milliseconds-threshold=10000.0}}
     discovery_heartbeat: {name=replication_delay_heartbeat_0, props={keep-alive-cron=0/1 * * * * ?}}
1 row in set (0.01 sec)

请问多个db discovery该如何配置呢?

可以尝试使用这样的方式

- !DB_DISCOVERY
dataSources:
   ds_0: ....
   ds_1: ....
rules:
- !DB_DISCOVERY
  dataSources:
    ds_0:
      dataSourceNames:
        - ds_01
        - ds_02
      discoveryHeartbeatName: replication_delay_heartbeat_0
      discoveryTypeName: replication_delay_0
    ds_1:
      dataSourceNames:
        - ds_11
        - ds_12
      discoveryHeartbeatName: replication_delay_heartbeat_1
      discoveryTypeName: replication_delay_1
  discoveryHeartbeats:
    replication_delay_heartbeat_0:
      props:
        keep-alive-cron: '0/1 * * * * ?'
    replication_delay_heartbeat_1:
      props:
        keep-alive-cron: '0/1 * * * * ?'
  discoveryTypes:
    replication_delay_0:
      type: SHOW_SLAVE_STATUS
      props:
        delay-milliseconds-threshold: 10000
    replication_delay_1:
      type: SHOW_SLAVE_STATUS
      props:
        delay-milliseconds-threshold: 10000

我这么设置后,启动会报错:

08:29:43.489 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-12 - Start completed.
Exception in thread "main" java.lang.IllegalStateException: More than one primary data source for schemaName `database_discovery_db`
        at com.google.common.base.Preconditions.checkState(Preconditions.java:589)
        at org.apache.shardingsphere.dbdiscovery.mysql.type.ShowSlaveStatusDatabaseDiscoveryType.checkDatabaseDiscoveryConfiguration(ShowSlaveStatusDatabaseDiscoveryType.java:58)
        at org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule.findMasterSlaveRelation(DatabaseDiscoveryRule.java:116)
        at org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule.<init>(DatabaseDiscoveryRule.java:85)
        at org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule.<init>(DatabaseDiscoveryRule.java:74)
        at org.apache.shardingsphere.dbdiscovery.rule.builder.DatabaseDiscoveryRuleBuilder.build(DatabaseDiscoveryRuleBuilder.java:47)
        at org.apache.shardingsphere.dbdiscovery.rule.builder.DatabaseDiscoveryRuleBuilder.build(DatabaseDiscoveryRuleBuilder.java:36)
        at org.apache.shardingsphere.infra.rule.builder.schema.SchemaRulesBuilder.buildRules(SchemaRulesBuilder.java:63)
        at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.getSchemaRules(MetaDataContextsBuilder.java:105)
        at org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder.addSchema(MetaDataContextsBuilder.java:83)
        at org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder.createMetaDataContextsBuilder(ClusterContextManagerBuilder.java:138)
        at org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder.build(ClusterContextManagerBuilder.java:77)
        at org.apache.shardingsphere.proxy.initializer.BootstrapInitializer.createContextManager(BootstrapInitializer.java:72)
        at org.apache.shardingsphere.proxy.initializer.BootstrapInitializer.init(BootstrapInitializer.java:57)
        at org.apache.shardingsphere.proxy.Bootstrap.main(Bootstrap.java:47)

@zjcnb 帮我们看看

升级至 5.1.2后,第二个 DB_DISCOVERY 报错:

mysql> show DB_DISCOVERY HEARTBEATS;
+-------------------------------+---------------------------------+
| name                          | props                           |
+-------------------------------+---------------------------------+
| replication_delay_heartbeat_0 | {keep-alive-cron=0/1 * * * * ?} |
| replication_delay_heartbeat_1 | {keep-alive-cron=0/1 * * * * ?} |
+-------------------------------+---------------------------------+
2 rows in set (0.00 sec)

mysql> show DB_DISCOVERY TYPES;
+---------------------+--------------------------+--------------------------------------+
| name                | type                     | props                                |
+---------------------+--------------------------+--------------------------------------+
| replication_delay_0 | MySQL.NORMAL_REPLICATION | {delay-milliseconds-threshold=10000} |
| replication_delay_1 | MySQL.NORMAL_REPLICATION | {delay-milliseconds-threshold=10000} |
+---------------------+--------------------------+--------------------------------------+
2 rows in set (0.00 sec)

mysql> SHOW DB_DISCOVERY RULES;
Empty set (0.00 sec)

mysql> CREATE DB_DISCOVERY RULE ds_0 (
    -> RESOURCES(ds_01, ds_02),
    -> TYPE=replication_delay_0,
    -> HEARTBEAT=replication_delay_heartbeat_0
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> CREATE DB_DISCOVERY RULE ds_1 (
    -> RESOURCES(ds_11, ds_12),
    -> TYPE=replication_delay_1,
    -> HEARTBEAT=replication_delay_heartbeat_1
    -> );
ERROR 1997 (C1997): Runtime exception: [Check Environment are failed in database `database_discovery_db`.]

嗯嗯, 两组 MySQL 主从高可用目前还有些问题, 有兴趣搞下这里吗?

:sob:,我是运维,搞不了
那有什么解决办法吗?做分库分表的话,里面会涉及很多个MySQL集群的高可用

嗯嗯, 明白. 问题大概知道了, 修复后同步您

非常感谢赵总支持,期待您的回复

京ICP备2021015875号