shardingsphere-proxy 安装



1、官网文档源码

1
2
3
4
# 文档
https://shardingsphere.apache.org/document/current/cn/quick-start/sharding-proxy-quick-start/
# 源码
https://github.com/apache/incubator-shardingsphere

2、快速入门

2.1、规则配置

编辑%SHARDING_PROXY_HOME%\conf\config-xxx.yaml。详情请参见配置手册

编辑%SHARDING_PROXY_HOME%\conf\server.yaml。详情请参见配置手册

2.2、引入依赖

如果后端连接PostgreSQL数据库,不需要引入额外依赖。

如果后端连接MySQL数据库,需要下载MySQL Connector/J, 解压缩后,将mysql-connector-java-5.1.47.jar拷贝到${sharding-proxy}\lib目录。

2.3、启动服务

  • 使用默认配置项
1
${sharding-proxy}\bin\start.sh
  • 配置端口
1
${sharding-proxy}\bin\start.sh ${port}

3、使用手册

3.1、Proxy启动

  1. 下载Sharding-Proxy的最新发行版。
  2. 如果使用docker,可以执行docker pull shardingsphere/sharding-proxy获取镜像。详细信息请参考Docker镜像
  3. 解压缩后修改conf/server.yaml和以config-前缀开头的文件,如:conf/config-xxx.yaml文件,进行分片规则、读写分离规则配置. 配置方式请参考配置手册
  4. Linux操作系统请运行bin/start.sh,Windows操作系统请运行bin/start.bat启动Sharding-Proxy。如需配置启动端口、配置文件位置,可参考快速入门 进行启动。
  5. 使用任何PostgreSQL的客户端连接。如: psql -U root -h 127.0.0.1 -p 3307

3.2、注册中心使用

若想使用Sharding-Proxy的数据库治理功能,则需要使用注册中心实现实例熔断和从库禁用功能。详情请参考支持的注册中心

Zookeeper

  1. Sharding-Proxy默认提供了Zookeeper的注册中心解决方案。您只需按照配置规则进行注册中心的配置,即可使用。
1
docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 --name zookeeper --restart always zookeeper

其他第三方注册中心

  1. 将Sharding-Proxy的lib目录下的sharding-orchestration-reg-zookeeper-curator-${sharding-sphere.version}.jar文件删除。
  2. 使用SPI方式实现相关逻辑编码,并将生成的jar包放到Sharding-Proxy的lib目录下。
  3. 按照配置规则进行注册中心的配置,即可使用。

3.3、使用自定义分片算法

当用户需要使用自定义的分片算法类时,无法再通过简单的inline表达式在yaml文件进行配置。可通过以下方式配置使用自定义分片算法。

编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.jzsec</groupId>
<artifactId>sharding-strategy</artifactId>
<version>4.0.0-RC3</version>

<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<sharding-sphere.version>4.0.0-RC3</sharding-sphere.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf8</encoding>
</configuration>
</plugin>
</plugins>
</build>

</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.jzsec.sharding.strategy;

public class YyyyTableShardingAlgorithm implements PreciseShardingAlgorithm<Integer>, RangeShardingAlgorithm<Integer> {
public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Integer> shardingValue) {
log.info("shardingValue:" + shardingValue);
Range<Integer> valueRange = shardingValue.getValueRange();
return actualDataNodes(shardingValue.getLogicTableName(), valueRange.lowerEndpoint(), valueRange.upperEndpoint());
}

public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
log.info("shardingValue:" + shardingValue);
return shardingValue.getLogicTableName() + DateFmtUtils.getYyyy(shardingValue.getValue());
}
}

打包

1
mvn clean && package

上传包

1
2
3
4
5
/data/downloads/sharding-proxy-4.0.0-RC3/lib
ll sharding-strategy*
-rw-r--r--. 1 502 games 10437 Dec 25 19:34 sharding-strategy-4.0.0-RC3.jar

chown 502:games sharding-strategy-4.0.0-RC3.jar

指定分片算法

1
2
3
4
5
6
7
8
9
shardingRule:
tables:
kd_logasset:
actualDataNodes: ds_master.kd_logasset_${2015..2099}_0${1..9}, ds_master.kd_logasset_${2015..2099}_${10..12}
tableStrategy:
standard:
shardingColumn: bizdate
preciseAlgorithmClassName: com.jzsec.sharding.strategy.Yyyy_mmTableShardingAlgorithm
rangeAlgorithmClassName: com.jzsec.sharding.strategy.Yyyy_mmTableShardingAlgorithm

3.4、分布式事务

Sharding-Proxy接入的分布式事务API同Sharding-JDBC保持一致,支持LOCAL,XA,BASE类型的事务。

XA事务

Sharding-Proxy原生支持XA事务,默认的事务管理器为Atomikos。 可以通过在Sharding-Proxy的conf目录中添加jta.properties来定制化Atomikos配置项。 具体的配置规则请参考Atomikos的官方文档

BASE事务

BASE目前没有打包到Sharding-Proxy中,使用时需要将实现了ShardingTransactionManagerSPI的jar拷贝至conf/lib目录,然后切换事务类型为BASE。

3.5、SCTL (Sharding-Proxy control language)

SCTL为Sharding-Proxy特有的控制语句,可以在运行时修改和查询Sharding-Proxy的状态,目前支持的语法为:

语句 说明
sctl:set transaction_type=XX 修改当前TCP连接的事务类型, 支持LOCAL,XA,BASE。例:sctl:set transaction_type=XA
sctl:show transaction_type 查询当前TCP连接的事务类型
sctl:show cached_connections 查询当前TCP连接中缓存的物理数据库连接个数
sctl:explain SQL语句 查看逻辑SQL的执行计划,例:sctl:explain select * from t_order;
sctl:hint set MASTER_ONLY=true 针对当前TCP连接,是否将数据库操作强制路由到主库
sctl:hint set DatabaseShardingValue=yy 针对当前TCP连接,设置hint仅对数据库分片有效,并添加分片值,yy:数据库分片值
sctl:hint addDatabaseShardingValue xx=yy 针对当前TCP连接,为表xx添加分片值yy,xx:逻辑表名称,yy:数据库分片值
sctl:hint addTableShardingValue xx=yy 针对当前TCP连接,为表xx添加分片值yy,xx:逻辑表名称,yy:表分片值
sctl:hint clear 针对当前TCP连接,清除hint所有设置
sctl:hint show status 针对当前TCP连接,查询hint状态,master_only:true/false,sharding_type:databases_only/databases_tables
sctl:hint show table status 针对当前TCP连接,查询逻辑表的hint分片值

Sharding-Proxy 默认不支持hint,如需支持,请在conf/server.yaml中,将props的属性proxy.hint.enabled设置为true。在Sharding-Proxy中,HintShardingAlgorithm的泛型只能是String类型。

3.6、注意事项

  1. Sharding-Proxy默认使用3307端口,可以通过启动脚本追加参数作为启动端口号。如: bin/start.sh 3308
  2. Sharding-Proxy使用conf/server.yaml配置注册中心、认证信息以及公用属性。
  3. Sharding-Proxy支持多逻辑数据源,每个以config-前缀命名的yaml配置文件,即为一个逻辑数据源。

4、配置手册

数据源与分片配置示例

Sharding-Proxy支持多逻辑数据源,每个以config-前缀命名的yaml配置文件,即为一个逻辑数据源。以下是config-xxx.yaml的配置配置示例。

数据分片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
schemaName: sharding_db

dataSources:
ds0:
url: jdbc:postgresql://localhost:5432/ds0
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
ds1:
url: jdbc:postgresql://localhost:5432/ds1
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65

shardingRule:
tables:
t_order:
actualDataNodes: ds${0..1}.t_order${0..1}
databaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order${order_id % 2}
keyGenerator:
type: SNOWFLAKE
column: order_id
t_order_item:
actualDataNodes: ds${0..1}.t_order_item${0..1}
databaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order_item${order_id % 2}
keyGenerator:
type: SNOWFLAKE
column: order_item_id
bindingTables:
- t_order,t_order_item
defaultTableStrategy:
none:

读写分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
schemaName: master_slave_db

dataSources:
ds_master:
url: jdbc:postgresql://localhost:5432/ds_master
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
ds_slave0:
url: jdbc:postgresql://localhost:5432/ds_slave0
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
ds_slave1:
url: jdbc:postgresql://localhost:5432/ds_slave1
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65

masterSlaveRule:
name: ds_ms
masterDataSourceName: ds_master
slaveDataSourceNames:
- ds_slave0
- ds_slave1

全局配置示例

Sharding-Proxy使用conf/server.yaml配置注册中心、认证信息以及公用属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#省略数据分片和读写分离配置
orchestration:
name: orchestration_ds
overwrite: true
registry:
type: zookeeper
namespace: orchestration
serverLists: localhost:2181

#权限验证
authentication:
users:
root: # 自定义用户名
password: root # 自定义用户名
sharding: # 自定义用户名
password: sharding # 自定义用户名
authorizedSchemas: sharding_db, masterslave_db # 该用户授权可访问的数据库,多个用逗号分隔。缺省将拥有root权限,可访问全部数据库。

#Proxy属性
#省略与Sharding-JDBC一致的配置属性
props:
acceptor.size: #用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
proxy.transaction.type: #默认为LOCAL事务,允许LOCAL,XA,BASE三个值,XA采用Atomikos作为事务管理器,BASE类型需要拷贝实现ShardingTransactionManager的接口的jar包至lib目录中
proxy.opentracing.enabled: #是否开启链路追踪功能,默认为不开启。详情请参见[链路追踪](/cn/features/orchestration/apm/)
check.table.metadata.enabled: #是否在启动时检查分表元数据一致性,默认值: false
proxy.frontend.flush.threshold: # 对于单个大查询,每多少个网络包返回一次

5、排查问题

1
[root@localhost conf]# top

1
[root@localhost conf]# top -Hp 31009

1
2
3
4
[root@localhost conf]# printf '%x' 31165
79bd
[root@localhost conf]# jstack 31009 > aaa.log
[root@localhost conf]# vi aaa.log

1
[root@localhost conf]# iftop