注册中心

实现动机

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

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

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

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

注册中心数据结构

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

  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. ├──status
  14. ├──compute_nodes
  15. ├──online
  16. ├──${your_instance_ip_a}@${your_instance_port_x}
  17. ├──${your_instance_ip_b}@${your_instance_port_y}
  18. ├──....
  19. ├──circuit_breaker
  20. ├──${your_instance_ip_c}@${your_instance_port_v}
  21. ├──${your_instance_ip_d}@${your_instance_port_w}
  22. ├──....
  23. ├──storage_nodes
  24. ├──disable
  25. ├──${schema_1.ds_0}
  26. ├──${schema_1.ds_1}
  27. ├──....
  28. ├──primary
  29. ├──${schema_2.ds_0}
  30. ├──${schema_2.ds_1}
  31. ├──....

/rules

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

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

/props

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

  1. kernel-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. connectionTimeoutMilliseconds: 30000
  8. idleTimeoutMilliseconds: 60000
  9. minPoolSize: 1
  10. username: root
  11. maxLifetimeMilliseconds: 1800000
  12. ds_1:
  13. dataSourceClassName: com.zaxxer.hikari.HikariDataSource
  14. props:
  15. url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
  16. password: null
  17. maxPoolSize: 50
  18. connectionTimeoutMilliseconds: 30000
  19. idleTimeoutMilliseconds: 60000
  20. minPoolSize: 1
  21. username: root
  22. 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

/status/compute_nodes

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

/status/storage_nodes

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

动态生效

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

操作指南

熔断实例

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

Zookeeper 命令如下:

  1. [zk: localhost:2181(CONNECTED) 0] set /${your_zk_namespace}/status/compute_nodes/circuit_breaker/${your_instance_ip_a}@${your_instance_port_x} DISABLED

禁用从库

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

Zookeeper 命令如下:

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