> 文档中心 > 分库分表实战--- ShardingSphere实战 第三部分 SPI 加载剖析、编排治理剖析和Sharding-Proxy实战

分库分表实战--- ShardingSphere实战 第三部分 SPI 加载剖析、编排治理剖析和Sharding-Proxy实战


SPI 加载剖析

在Apache ShardingSphere中,很多功能实现类的加载方式是通过SPI注入的方式完成的。 Service Provider Interface (SPI)是Java提供的一套被第三方实现或扩展的API,它可以用于实现框架扩展或组件替换。

本节汇总了Apache ShardingSphere所有通过SPI方式载入的功能模块。

  • SQL解析
    SQL解析的接口用于规定用于解析SQL的ANTLR语法文件。
    主要接口是SQLParserEntry,其内置实现类有MySQLParserEntry,PostgreSQLParserEntry,SQLServerParserEntry和OracleParserEntry。
  • 数据库协议
    数据库协议的接口用于Sharding-Proxy解析与适配访问数据库的协议。
    主要接口是DatabaseProtocolFrontendEngine,其内置实现类有MySQLProtocolFrontendEngine和PostgreSQLProtocolFrontendEngine。
  • 数据脱敏
    数据脱敏的接口用于规定加解密器的加密、解密、类型获取、属性设置等方式。
    主要接口有两个:Encryptor和QueryAssistedEncryptor,其中Encryptor的内置实现类有
    AESEncryptor和MD5Encryptor。
  • 分布式主键
    分布式主键的接口主要用于规定如何生成全局性的自增、类型获取、属性设置等。
    主要接口为ShardingKeyGenerator,其内置实现类有UUIDShardingKeyGenerator和
    SnowflakeShardingKeyGenerator。
  • 分布式事务
    分布式事务的接口主要用于规定如何将分布式事务适配为本地事务接口。
    主要接口为ShardingTransactionManager,其内置实现类有XAShardingTransactionManager和SeataATShardingTransactionManager。
  • XA事务管理器
    XA事务管理器的接口主要用于规定如何将XA事务的实现者适配为统一的XA事务接口。
    主要接口为XATransactionManager,其内置实现类有AtomikosTransactionManager,
    NarayanaXATransactionManager和BitronixXATransactionManager。
  • 注册中心
    注册中心的接口主要用于规定注册中心初始化、存取数据、更新数据、监控等行为。
    主要接口为RegistryCenter,其内置实现类有Zookeeper。

编排治理剖析

编排治理模块提供配置中心/注册中心(以及规划中的元数据中心)、配置动态化、数据库熔断禁用、调用链路等治理能力。

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

    配置动态化:配置修改后的分发,是配置中心可以提供的另一个重要能力。它可支持数据源、表与分片及读写分离策略的动态切换。

    • 配置中心数据结构
      配置中心在定义的命名空间的config下,以YAML格式存储,包括数据源,数据分片,读写分离、Properties配置,可通过修改节点来实现对于配置的动态管理。
      在这里插入图片描述

    • config/authentication

      password: root username: root
    • config/sharding/props

      sql.show: true
    • config/schema/schemeName/datasource
      多个数据库连接池的集合,不同数据库连接池属性自适配(例如:DBCP,C3P0,Druid,HikariCP)。

      ds_0:   dataSourceClassName: com.zaxxer.hikari.HikariDataSource     properties:url: jdbc:mysql://127.0.0.1:3306/learn1? serverTimezone=UTC&useSSL=falsepassword: rootusername: rootmaxPoolSize: 50minPoolSize: 1      ds_1:   dataSourceClassName: com.zaxxer.hikari.HikariDataSource     properties:url: jdbc:mysql://127.0.0.1:3306/learn2? serverTimezone=UTC&useSSL=falsepassword: root u      sername: rootmaxPoolSize: 50minPoolSize: 1
    • config/schema/sharding_db/rule
      数据分片配置,包括数据分片配置。

      tables:   b_order:     actualDataNodes: ds_$->{0..1}.b_order_$->{0..1}     databaseStrategy:  inline:     shardingColumn: user_idalgorithmExpression: ds_$->{user_id % 2}   keyGenerator:     column: order_id   logicTable: b_order     tableStrategy:inline:  shardingColumn: order_id    algorithmExpression: b_order_$->{order_id % 2}    b_order_item:      actualDataNodes: ds_$->{0..1}.b_order_item_$->{0..1} databaseStrategy:   inline:     shardingColumn: user_id     algorithmExpression: ds_$->{user_id % 2} keyGenerator:   column: order_item_id logicTable: b_order_item tableStrategy:   inline:     shardingColumn: order_id     algorithmExpression: b_order_item_$->{order_id % 2}
    • config/schema/masterslave/rule读写分离独立使用时使用该配置。

      name: ds_ms masterDataSourceName: master slaveDataSourceNames:   - ds_slave0   - ds_slave1 loadBalanceAlgorithmType: ROUND_ROBIN
    • 动态生效
      在注册中心上修改、删除、新增相关配置,会动态推送到生产环境并立即生效。

  • 注册中心
    相对于配置中心管理配置数据,注册中心存放运行时的动态/临时状态数据,比如可用的proxy的实例,需要禁用或熔断的datasource实例。通过注册中心,可以提供熔断数据库访问程序对数据库的访问和禁用从库的访问的编排治理能力。治理仍然有大量未完成的功能(比如流控等)

    • 注册中心数据结构
      注册中心在定义的命名空间的state下,创建数据库访问对象运行节点,用于区分不同数据库访问实例。包括instances和datasources节点。

      instances ├──your_instance_ip_a@-@your_instance_pid_x ├──your_instance_ip_b@-@your_instance_pid_y ├──.... datasources ├──ds0 ├──ds1 ├──....
    • state/instances
      数据库访问对象运行实例信息,子节点是当前运行实例的标识。 运行实例标识由运行服务器的IP地址和PID构成。运行实例标识均为临时节点,当实例上线时注册,下线时自动清理。注册中心监控这些节点的变化来治理运行中实例对数据库的访问等。

    • state/datasources
      可以控制读写分离,可动态添加删除以及禁用。

    • 熔断实例
      可在IP地址@-@PID节点写入DISABLED(忽略大小写)表示禁用该实例,删除DISABLED表示启用。
      Zookeeper命令如下:

      [zk: localhost:2181(CONNECTED) 0] set /your_zk_namespace/your_app_name/state/instances/your_instance_ip_a@- @your_instance_pid_x DISABLED
    • 禁用从库
      在读写分离场景下,可在数据源名称子节点中写入DISABLED表示禁用从库数据源,删除DISABLED或节点表示启用。
      Zookeeper命令如下:

      [zk: localhost:2181(CONNECTED) 0] set /your_zk_namespace/your_app_name/state/datasources/your_slave_datasource_nam e DISABLED
    • 支持的配置中心和注册中心
      ShardingSphere在数据库治理模块使用SPI方式载入数据到配置中心/注册中心,进行实例熔断和数据库禁用。 目前,ShardingSphere内部支持Zookeeper和Etcd这种常用的配置中心/注册中
      心。 此外,您可以使用其他第三方配置中心/注册中心,例如Apollo、Nacos等,并通过SPI的方式注入到ShardingSphere,从而使用该配置中心/注册中心,实现数据库治理功能。

    • 应用性能监控
      APM是应用性能监控的缩写。目前APM的主要功能着眼于分布式系统的性能诊断,其主要功能包括调用链展示,应用拓扑分析等。

      ShardingSphere并不负责如何采集、存储以及展示应用性能监控的相关数据,而是将SQL解析与SQL执行这两块数据分片的最核心的相关信息发送至应用性能监控系统,并交由其处理。 换句话说,ShardingSphere仅负责产生具有价值的数据,并通过标准协议递交至相关系统。

      ShardingSphere可以通过两种方式对接应用性能监控系统。

      • 使用OpenTracing API发送性能追踪数据。面向OpenTracing协议的APM产品都可以和ShardingSphere自动对接,比如SkyWalking,Zipkin和Jaeger。
      • 使用SkyWalking的自动探针。 ShardingSphere团队与SkyWalking团队共同合作,在SkyWalking中实现了ShardingSphere自动探针,可以将相关的应用性能数据自动发送到SkyWalking中。

Sharding-Proxy实战

Sharding-Proxy是ShardingSphere的第二个产品,定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL版本,它可以使用任何兼容MySQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench等操作数据,对DBA更加友好。

  • 向应用程序完全透明,可直接当做MySQL使用
  • 适用于任何兼容MySQL协议的客户端

在这里插入图片描述
Sharding-Proxy的优势在于对异构语言的支持,以及为DBA提供可操作入口。

Sharding-Proxy使用过程:

  • 下载Sharding-Proxy的最新发行版;

  • 解压缩后修改conf/server.yaml和以config-前缀开头的文件,进行分片规则、读写分离规则配置

  • 编辑%SHARDING_PROXY_HOME%\conf\config-xxx.yaml

  • 编辑%SHARDING_PROXY_HOME%\conf\server.yaml

  • 引入依赖jar
    如果后端连接MySQL数据库,需要下载MySQL驱动, 解压缩后将mysql-connector-java-
    5.1.48.jar拷贝到${sharding-proxy}\lib目录。
    如果后端连接PostgreSQL数据库,不需要引入额外依赖。

  • Linux操作系统请运行bin/start.sh,Windows操作系统请运行bin/start.bat启动Sharding-Proxy。
    使用默认配置启动:${sharding-proxy}\bin\start.sh

    配置端口启动:${sharding-proxy}\bin\start.sh ${port}

  • 使用客户端工具连接。如: mysql -h 127.0.0.1 -P 3307 -u root -p root

若想使用Sharding-Proxy的数据库治理功能,则需要使用注册中心实现实例熔断和从库禁用功能。Sharding-Proxy默认提供了Zookeeper的注册中心解决方案。只需按照配置规则进行注册中心的配置,即可使用。

注意事项

  • Sharding-Proxy 默认不支持hint,如需支持,请在conf/server.yaml中,将props的属性
    proxy.hint.enabled设置为true。在Sharding-Proxy中,HintShardingAlgorithm的泛型只能是String类型。
  • Sharding-Proxy默认使用3307端口,可以通过启动脚本追加参数作为启动端口号。如:
    bin/start.sh 3308
  • Sharding-Proxy使用conf/server.yaml配置注册中心、认证信息以及公用属性。
  • Sharding-Proxy支持多逻辑数据源,每个以"config-"做前缀命名yaml配置文件,即为一个逻辑数据源。

ShardingSphere实战 到这里就讲完了,感谢大家的支持,明天接着讲 Mycat实战 ,敬请期待。

CSDN社区 《博客新星》活动,官方大力扶持新人创作,只要参与其中并发布原创就有机会获得官方奖品:精品日历、新程序员杂志、CSDN帆布包、CSDN定制款手机壳,快来参与吧!链接直达 https://bbs.csdn.net/topics/605597781