sharding-proxy分库分表最佳实践

简介

Sharding-Proxy 分库分表、读写分离,它和mycat类似,属于中间件代理层,它类似一个数据库,代理后面的分库分表的多个数据库,它屏蔽了后端多个数据库的复杂性,应用开发时直接连接 Sharding-Proxy 即可

Sharding-Proxy 架构:

sharding-proxy分库分表最佳实践_第1张图片

 

Sharding-JDBC 架构:

sharding-proxy分库分表最佳实践_第2张图片

 

.Sharding-JDBC与Sharding-Proxy对比

sharding-proxy分库分表最佳实践_第3张图片

 

安装、配置Sharding-Proxy

  1. 下载Sharding-Proxy的最新发行版,地址:https://github.com/sharding-sphere/sharding-sphere-doc/raw/master/dist/sharding-proxy-3.0.0.tar.gz

  2. 如果使用docker,可以执行docker pull shardingsphere/sharding-proxy获取镜像。详细信息请参考Docker镜像。

  3. 解压缩后修改conf/server.yaml和以config-前缀开头的文件,如:conf/config-xxx.yaml文件,进行分片规则、读写分离规则配置. 配置方式请参考配置手册。

配置 server.yaml

把文件里的配置的 # 注释打开,改为符合自己的配置

例子:

authentication:

username: root

password: 123456

props:

#max.connections.size.per.query: 1

acceptor.size: 8 # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2

executor.size: 4 # 工作线程数量,默认值: CPU核数

proxy.transaction.type: XA

proxy.transaction.enabled: true # 是否开启事务, 目前仅支持XA事务,默认为不开启

proxy.opentracing.enabled: false # 是否开启链路追踪功能,默认为不开启

sql.show: true # 是否开启SQL显示,默认值: false

配置分表规则:

打开 config-sharding.yaml

例子如下:

schemaName: sharding_db

dataSources:

person:

url: jdbc:mysql://192.168.1.34:3306/person?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=true

username: root

password: 123456

#connectionTimeoutMilliseconds: 30000

#idleTimeoutMilliseconds: 60000

#maxLifetimeMilliseconds: 1800000

#maxPoolSize: 50

autoCommit: true

connectionTimeout: 30000

idleTimeout: 60000

maxLifetime: 1800000

maximumPoolSize: 5

 

shardingRule:

tables:

t_user:

actualDataNodes: person.t_user$->{0..1}

tableStrategy:

inline:

shardingColumn: id

algorithmExpression: t_user$->{id % 2}

keyGeneratorColumnName: id

keyGeneratorClassName: com.xx.base.idgenerator.ShardingKeyGenerator

#默认自增列值生成器类名称

defaultKeyGeneratorClassName: io.shardingsphere.core.keygen.DefaultKeyGenerator

注意:有坑

sharding-proxy3.0版本(目前没有看到有更新),分布id实现类DefaultKeyGenerator,但官方分布式id生成器实现类DefaultKeyGenerator,在业务量不大的情况下,snowflake生成的id序列号部分大多都是0,所以通过这个分步式id通过取模hash分库,导致数据全落入单库中,数据分布不平均,需要自己实现重写内部雪花算法。ShardingKeyGenerator这个类式自己实现,分步式id分布均匀。核心代码实现如下:

private static byte sequenceOffset;
private void vibrateSequenceOffset() {
    sequenceOffset = (byte) (~sequenceOffset & 1);
}

原理: sequenceOffset 这个属性是类的变量,不是对象变量。如当前请求是0,那么下一次请求时,值为1,交替变更。

 

运行Sharding-Proxy

  1. Linux操作系统请运行bin/start.sh,Windows操作系统请运行bin/start.bat启动Sharding-Proxy。如需配置启动端口、配置文件位置,可参考快速入门 进行启动。

  2. 使用任何MySQL的客户端连接。如: mysql -u root -h 127.0.0.1 -P 3307

项目中使用Sharding-proxy组件

以springboot项目为例

1 pom依赖导入

com.alibaba

druid-spring-boot-starter

1.1.9

io.shardingsphere

sharding-transaction-spring

3.1.0

org.springframework.boot

spring-boot-starter-aop

 

2 配置 sharding-proxy相关参数。连接proxy

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3307/sharding_db?useServerPrepStmts=true&cachePrepStmts=true

spring.datasource.username=root

spring.datasource.password=123456

#spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

#初始化时建立物理连接的个数

spring.datasource.druid.initial-size=3

#最小连接池数量

spring.datasource.druid.min-idle=3

#最大连接池数量

spring.datasource.druid.max-active=10

#获取连接时最大等待时间

spring.datasource.druid.max-wait=60000

3 最后,启动应用springboot应用即可。

文献参考

https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-proxy/

 

你可能感兴趣的:(sharding-proxy,分库分表)