ShardingSphere-proxy 部署
ShardingSphere-proxy
是一个开源的数据库代理中间件,定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL
版本,它可以使用任何兼容MySQL协议的访问客户端。
官网配置示例:
官方手册:
Overview :: ShardingSphere (apache.org)
疑问解答:
Issues · apache/shardingsphere · GitHub
一、ShardingSphere-proxy 配置分布式事务
对于一个中小型项目,一般采取分布式结构。ShardingSphere-proxy
作为中间代理,用户可以通过访问它来访问多个数据库。
1.1、环境准备
-
ShardingSphere-proxy :5.1.0
-
Mysql :5.7.22
-
192.168.10.123
服务器上部署ShardingSphere-Proxy代理 -
192.168.10.123
服务器,192.168.10.128
服务器
1.2、MySQL驱动jar包
ShardingSphere-proxy 没有引入连接驱动jar包,所以用户需下载jar包并引入到/lib文件夹中。
mysql-connector-java-5.1.26-bin.jar
下载:链接:百度网盘 请输入提取码
1.3、修改配置文件
-
server.yaml
rules: - !AUTHORITY users: - root@:ayok provider: type: ALL_PRIVILEGES_PERMITTED props: check-duplicate-table-enabled: false check-table-metadata-enabled: false proxy-backend-driver-type: JDBC proxy-backend-executor-suitable: OLAP proxy-backend-query-fetch-size: -1 proxy-hint-enabled: false proxy-opentracing-enabled: false show-process-list-enabled: false sql-federation-enabled: true sql-show: true
-
config-sharding.yaml
schemaName: person dataSources: student: url: jdbc:mysql://192.168.10.123:3306/student?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: ayok connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 teacher: url: jdbc:mysql://192.168.10.128:3306/teacher?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: ayok connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 #ShardingSphere 提供了三种模式的分布式事务 LOCAL, XA, BASE #rules: # - !TRANSACTION # defaultType: LOCAL
二、ShardingSphere-proxy 配置分布式事务同时设定主从
2.1、环境准备
同上
192.168.10.123
主库服务器,192.168.10.128
从库服务器
2.2、设定MySQL的主从同步
简单介绍一下主从同步的原理:
-
master(主库)在每个事务跟新数据完成之前,会在
binlog
日志文件中记录事务; -
salve(从库)会开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是 binlog dump process。当读取进度与master一致时,线程休眠并等待master的下一次事务跟新。I/O线程最终的目的是将这些事件写入到中继日志中(从库)。
-
SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致(从库)。
下面介绍配置实操:
-
修改服务器的MySQL配置,并重启服务。Linux下为/etc/my.cnf。也可以通过指令查看my.cnf目录,顺序排前优先。
mysql --help|grep 'my.cnf'
修改内容:
msater:
[mysqld] #设置主服务器id,在主从关系中保持唯一 server-id=1 #设置同步哪个数据库,此数据库变更将操作写入二进制日志Binary log binlog-do-db=bds-oneaccept #要生成的二进制日志文件名称前缀,例如:mysql-bin.000001 log-bin=mysql-bin
slave:
[mysqld] #设置从服务器id,在主从关系中保持唯一 server-id=2 #要复制的数据库名称,与主Mysql配置保持一致 replicate-do-db=bds-oneaccept #要生成的二进制日志文件名称前缀,例如:mysql-bin.000001 log-bin=mysql-bin
修改后重启服务:service mysqld restart
-
创建用于复制的专门用户,并授权
CREATE USER 'rep1'@'192.168.10.128' IDENTIFIED BY 'ayok';
然后给用户授权
GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.10.128' IDENTIFIED BY 'ayok';
成功后刷新权限
flush privileges;
-
获取主数据库此刻的数据坐标,用于主从启动后,复制数据的起始位置,获取到这个值后,主数据库就不能再有数据的修改操作。
show master status;
-
在从数据库中设置复制数据的用户、坐标等信息(主数据库的信息),执行此操作之前需保证主从数据库现时刻数据一致,因为是从设置的坐标处开始复制。
#主数据库的地址、端口、用户、密码 mysql> change master to master_host='192.168.10.123', -> master_port=3306, -> master_user='root', -> master_password='ayok', -> master_log_file='mysql-bin.0000041', -> master_log_pos=1100;
如果出现报错,需先执行 stop slave
-
启动复制
start slave
然后查看复制状态
show salve status|G;
-
在进行简单的测试,创建表并插入一条数据(主),然后搜索数据(从)。 并在两边分别查看文件坐标 show master status;(主) show slave status\G;(从)
2.3、修改ShardingSphere-proxy 配置文件
-
server.yaml
同上 -
config-sharding.yaml
schemaName: person dataSources: user: url: jdbc:mysql://192.168.10.121:3306/user?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: ayok connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 nouh_write: url: jdbc:mysql://192.168.10.123:3306/student?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: ayok connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 nouh_read: url: jdbc:mysql://192.168.10.128:3306/teacher?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: ayok connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 rules: - !READWRITE_SPLITTING dataSources: readwrite_ds: type: Static props: write-data-source-name: nouh_write read-data-source-names: nouh_read loadBalancerName: random loadBalancers: random: type: RANDOM
最后做一个测试代码,看/logs下的日志文件,插入数据是否使用的
nouh_write
,读取数据是否使用的nouh_read
。