使用shardingsphere-proxy读写分离
本文介绍使用apache shardingsphere-proxy对mysql数据库做读写分离的配置过程。shardingsphere-proxy是一个中间件产品,可以模拟一个mysql服务,我们通过连接这个模拟的mysql服务,操作实际的mysql数据。
在配置shardingsphere-proxy前,你需要先配置好mysql主从复制。可以参考我之前的文章:
Ubuntu下mysql主从复制搭建。
0、环境
- shardingsphere proxy: 5.4.0
- mysql: 8.4
- mysql connector/j: 8.0.11
1、说明
- ${shardingsphere.home}: shardingsphere-proxy保存的目录,下文说到shardingsphere-proxy 目录时,用这个变量代替。
2、shardingsphere-proxy配置
2.1、mysql驱动
复制mysql驱动到${shardingsphere.home}/lib。注意版本,过高版本的mysql jdbc驱动是不起作用的。
2.2、配置连接shardingsphere-proxy的用户
${shardingsphere.home}/conf/server.yaml,找到authority段,都注释掉了,放开注释,并修改。下面是我修改的实例:
authority:
users:
- user: root
password: 123456
# - user: sharding
# password: sharding
privilege:
type: ALL_PERMITTED
这样修改后,就可以通过root/123456连接shardingsphere-proxy了。
2.3、配置config-readwrite-splitting.yaml
见名知意,这个文件就是用来配置读写分离的。位于${shardingsphere.home}/conf下。找到mysql的配置,按照我们的规划(一主一从,已经通过虚拟机配置完成)修改。
databaseName: readwrite_splitting_db
dataSources:
write_ds:
url: jdbc:mysql://192.168.99.100:3306/db2?serverTimezone=UTC&useSSL=false
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
read_ds_0:
url: jdbc:mysql://192.168.99.120:3306/db2?serverTimezone=UTC&useSSL=false
username: root
password: 123456
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rules:
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: write_ds
readDataSourceNames:
- read_ds_0
# - read_ds_1
loadBalancerName: random
loadBalancers:
random:
type: RANDOM
到这里,shardingsphere-proxy就配置完成了,默认端口是3307,咱们启动一下试试。进入bin目录,有win和linux的启动脚本。我用 ./start.sh启动。
根据提示,可以在stdout.log文件查看shardingsphere-proxy的运行情况。我们可以通过第三方工具连接它,并执行sql,当然你用jdbc操作也可。
3、sql操作
连接上shardingsphere-proxy后,我们能看到他有一个数据库,就是上面配置文件中配置的名称,但是没有表。
咱们打开sql编辑器,先创建一张表。
CREATE TABLE `t_user2` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
创建完成后,刷新实际的mysql,发现他们都有了t_user2这张表。大家可以再加几条数据看看。
INSERT into t_user2(name) values('张三');
INSERT into t_user2(name) values('李四');
select * from t_user2;
下面是执行sql是我从控制台截的图,能够明显看到达到了我们预期的效果。
注意:要看到控制台输出sql的效果,需要配置sql-show: true,在server.yaml文件中。
//~~