注册中心

实现动机

  • 配置集中化:越来越多的运行时实例,使得散落的配置难于管理,配置不同步导致的问题十分严重。将配置集中于配置中心,可以更加有效进行管理。

  • 配置动态化:配置修改后的分发,是配置中心可以提供的另一个重要能力。它可支持数据源和规则的动态切换。

  • 存放运行时的动态/临时状态数据,比如可用的 ShardingSphere 的实例,需要禁用或熔断的数据源等。

  • 提供熔断数据库访问程序对数据库的访问和禁用从库的访问的编排治理能力。治理模块仍然有大量未完成的功能(比如流控等)。

注册中心数据结构

在定义的命名空间下, rulespropsmetadata 节点以 YAML 格式存储配置,可通过修改节点来实现对于配置的动态管理。 states 存储数据库访问对象运行节点,用于区分不同数据库访问实例。

  1. namespace
  2. ├──rules # 全局规则配置
  3. ├──props # 属性配置
  4. ├──metadata # Metadata 配置
  5. ├──${schema_1} # Schema 名称1
  6. ├──dataSources # 数据源配置
  7. ├──rules # 规则配置
  8. ├──schema # 表结构配置
  9. ├──${schema_2} # Schema 名称2
  10. ├──dataSources # 数据源配置
  11. ├──rules # 规则配置
  12. ├──schema # 表结构配置
  13. ├──states
  14. ├──proxynodes
  15. ├──${your_instance_ip_a}@${your_instance_pid_x}@${UUID}
  16. ├──${your_instance_ip_b}@${your_instance_pid_y}@${UUID}
  17. ├──....
  18. ├──datanodes
  19. ├──${schema_1}
  20. ├──${ds_0}
  21. ├──${ds_1}
  22. ├──${schema_2}
  23. ├──${ds_0}
  24. ├──${ds_1}
  25. ├──....

/rules

全局规则配置,可包括访问 ShardingSphere-Proxy 用户名和密码的权限配置。

  1. - !AUTHORITY
  2. users:
  3. - root@%:root
  4. - sharding@127.0.0.1:sharding
  5. provider:
  6. type: NATIVE

/props

属性配置,详情请参见配置手册

  1. executor-size: 20
  2. sql-show: true

/metadata/${schemeName}/dataSources

多个数据库连接池的集合,不同数据库连接池属性自适配(例如:DBCP,C3P0,Druid, HikariCP)。

  1. ds_0:
  2. dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  3. props:
  4. url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
  5. password: null
  6. maxPoolSize: 50
  7. maintenanceIntervalMilliseconds: 30000
  8. connectionTimeoutMilliseconds: 30000
  9. idleTimeoutMilliseconds: 60000
  10. minPoolSize: 1
  11. username: root
  12. maxLifetimeMilliseconds: 1800000
  13. ds_1:
  14. dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  15. props:
  16. url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
  17. password: null
  18. maxPoolSize: 50
  19. maintenanceIntervalMilliseconds: 30000
  20. connectionTimeoutMilliseconds: 30000
  21. idleTimeoutMilliseconds: 60000
  22. minPoolSize: 1
  23. username: root
  24. maxLifetimeMilliseconds: 1800000

/metadata/${schemeName}/rules

规则配置,可包括数据分片、读写分离、数据加密、影子库压测等配置。

  1. - !SHARDING
  2. xxx
  3. - !READWRITE_SPLITTING
  4. xxx
  5. - !ENCRYPT
  6. xxx

/metadata/${schemeName}/schema

表结构配置,暂不支持动态修改。

  1. tables: # 表
  2. t_order: # 表名
  3. columns: # 列
  4. id: # 列名
  5. caseSensitive: false
  6. dataType: 0
  7. generated: false
  8. name: id
  9. primaryKey: trues
  10. order_id:
  11. caseSensitive: false
  12. dataType: 0
  13. generated: false
  14. name: order_id
  15. primaryKey: false
  16. indexs: # 索引
  17. t_user_order_id_index: # 索引名
  18. name: t_user_order_id_index
  19. t_order_item:
  20. columns:
  21. order_id:
  22. caseSensitive: false
  23. dataType: 0
  24. generated: false
  25. name: order_id
  26. primaryKey: false

/states/proxynodes

数据库访问对象运行实例信息,子节点是当前运行实例的标识。 运行实例标识由运行服务器的 IP 地址和 PID 构成。运行实例标识均为临时节点,当实例上线时注册,下线时自动清理。 注册中心监控这些节点的变化来治理运行中实例对数据库的访问等。

/states/datanodes

可以治理读写分离从库,可动态添加删除以及禁用。

动态生效

在注册中心上修改、删除、新增相关配置,会动态推送到生产环境并立即生效。

操作指南

熔断实例

可在 IP地址@PID@UUID 节点写入 DISABLED(忽略大小写)表示禁用该实例,删除 DISABLED 表示启用。

Zookeeper 命令如下:

  1. [zk: localhost:2181(CONNECTED) 0] set /${your_zk_namespace}/states/proxynodes/${your_instance_ip_a}@${your_instance_pid_x}@${UUID} DISABLED

禁用从库

在读写分离场景下,可在数据源名称子节点中写入 DISABLED(忽略大小写)表示禁用从库数据源,删除 DISABLED 或节点表示启用。

Zookeeper 命令如下:

  1. [zk: localhost:2181(CONNECTED) 0] set /${your_zk_namespace}/states/datanodes/${your_schema_name}/${your_replica_datasource_name} DISABLED