Sharding-Proxy 分库分表、读写分离,它和mycat类似,属于中间件代理层,它类似一个数据库,代理后面的分库分表的多个数据库,它屏蔽了后端多个数据库的复杂性,应用开发时直接连接 Sharding-Proxy 即可
下载Sharding-Proxy的最新发行版,地址:https://github.com/sharding-sphere/sharding-sphere-doc/raw/master/dist/sharding-proxy-3.0.0.tar.gz
如果使用docker,可以执行docker pull shardingsphere/sharding-proxy
获取镜像。详细信息请参考Docker镜像。
解压缩后修改conf/server.yaml和以config-前缀开头的文件,如:conf/config-xxx.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,交替变更。
Linux操作系统请运行bin/start.sh
,Windows操作系统请运行bin/start.bat
启动Sharding-Proxy。如需配置启动端口、配置文件位置,可参考快速入门 进行启动。
使用任何MySQL的客户端连接。如: mysql -u root -h 127.0.0.1 -P 3307
以springboot项目为例
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
https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-proxy/