专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Sharding-Sphere:Sharding-JDBC读写分离,docker搭建mysql读写分离

读写分离可以提高系统吞吐量,在网上看了很多java springboot去做读写分离的文章,大部分是基于spring aop 硬编码java代码去实现的,代码侵入性较大,原理是:如果调用select、get开头的方法,就调用从库,否则调用主库,本篇将基于当当开源的sharding-jdbc来做读写分离,看名字就知道它是在jdbc上,代码零入侵,配置文件配置主从库地址。

本篇博客将分成两大块,1.Docker环境搭建Mysql读写分离,2.SpringBoot基于Sharding-JDBC应用读写分离
1.Docker环境搭建Mysql读写分离
  • linux:mysql读写分离搭建-mysql5.6
  • docker: 搭建docker环境下的读写分离时,遇到一个坑,最新的mysql镜像是8.0版本的,无法成功搭建,后面用的5.7.26就好了
    镜像地址:hub.docker.com/_/mysql?tab… pull mysql:5.7.26
    我是Mac OS 环境,下面简述docker配置mysql主从过程
  • a.在本机上创建2个 .cnf 的配置文件,2个数据存放目录,用来保存mysql数据
    110_1.png
  • b.mysql.cnf配置文件内容如下,只有server-id不能一样
[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket    = /var/run/mysqld/mysqld.sock
datadir    = /var/lib/mysql
symbolic-links=0
character-set-server = utf8   
#skip-networking  
innodb_print_all_deadlocks = 1
max_connections = 2000  
max_connect_errors = 6000  
open_files_limit = 65535  
table_open_cache = 128   
max_allowed_packet = 4M  
binlog_cache_size = 1M  
max_heap_table_size = 8M  
tmp_table_size = 16M  
read_buffer_size = 2M  
read_rnd_buffer_size = 8M  
sort_buffer_size = 8M  
join_buffer_size = 28M  
key_buffer_size = 4M  
thread_cache_size = 8  
query_cache_type = 1  
query_cache_size = 8M  
query_cache_limit = 2M  
ft_min_word_len = 4  
log-bin = master-bin.log

server-id = 1

sync_binlog=1
binlog_format = mixed  
performance_schema = 0  
explicit_defaults_for_timestamp  
#lower_case_table_names = 1  
interactive_timeout = 28800  
wait_timeout = 28800  
# Recommended in standard MySQL setup  
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES   
[mysqldump]  
quick  
max_allowed_packet = 16M  
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  • c.docker运行2个mysql镜像,使用下面的命令,改一下主从库的配置文件地址与数据存放目录,并设置root的登陆密码123456
docker run -itd --name mysql_master -v /Users/zhuyu/zy/database/mysql/master.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /Users/zhuyu/zy/database/mysql/master_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7.26
1
  • d.找到主库容器ID,进入主库容器控制台 docker exec -it container id /bin/bash
  • e.进入mysql命令行,mysql -uroot -p123456 ,输入如下命令:
创建这个用户,让从库通过该用户进行复制日志
创建一个用户:create user ‘zhuyu’@‘%’ identified by ‘123456’;
用户赋予权限:grant all privileges on *.* to ‘zhuyu’@‘%’ with grant option;
赋予复制权限:grant replication slave on *.* to ‘zhuyu’@‘%’ with grant option;
使刚刚的命令生效:flush privileges;
查看主库日志文件:show master status; 记住File与Position的值,从库要用
123456

110_2.png

  • f.进入从库容器mysql命令行,和上面一样的命令,连接主库
连接主库:change master to master_host='192.168.0.115',master_user=‘zhuyu’,master_password='123456',master_log_file='master-bin.000004',master_log_pos=1118;
开启从库:start slave;
查看从库状态:show slave status\G
如果连接配置错误要重新更改,可以使用 stop slave; reset slave;
1234

看到下图红色线条部分的两个 Yes,则说明主从库搭建成功
110_3.png

使用 mysql 客户端连接主库,创建一个数据库,再连接从库查看该数据库是否同步过来了,我这边成功同步了
110_4.png

2.SpringBoot基于Sharding-JDBC应用读写分离

Sharding-JDBC是当当开源的分库分表,读写分离的利器,基于jdbc,方面好用,已经进入apache孵化器项目了
GitHub的地址:github.com/apache/incu…
shardingsphere:github.com/apache/incu…
中文文档地址:shardingsphere.apache.org/document/cu…

先看看Sharding-JDBC的架构图,可以有个直观的了解
110_5.png

下面使用HikariCP与mybatis进行读写分离的验证,创建了3个表,最下面会给出源码地址,里面有建表sql

  • a.新建SpringBoot项目,添加引用:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>4.0.0-RC1</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.3.0</version>
</dependency>
1234567891011121314151617181920212223242526272829
  • b.配置文件,请不要用 ds_master,ds_slave等,有下划线会报错,请参考帮助文档里面的配置
server.port=8070

spring.shardingsphere.datasource.names=master,slave0
#主库
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://192.168.0.115:3306/zy_business1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=15000&allowMultiQueries=true&useSSL=false
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456
#从库
spring.shardingsphere.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.jdbc-url=jdbc:mysql://192.168.0.115:3307/zy_business1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=15000&allowMultiQueries=true&useSSL=false
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=123456

spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave0

spring.shardingsphere.props.sql.show=true

# mybatis 配置
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=com.zypcy.sharding.business.entity
12345678910111213141516171819202122232425
  • c.添加控制器、服务、mapper接口等,就不一一列出了,下面有源码地址
    110_6.png
  • d.运行项目,访问 localhost:8070/member/add 接口,添加一条数据,查看数据库,可以看到主从库都已经添加了数据
    110_7.png
  • e.修改从库的数据,把member_name字段值手动改为 朱宇12,然后访问 localhost:8070/member/getMemberById?memberId=201904270001 ,可以看到查询接口返回的是从库修改后的值
    110_8.png
    到此,读写分离的搭建与应用已经完成了,源码下载
    110_9.png

但也有它的不足,如:不支持timeout相关操作,不支持存储过程,函数,游标的操作等
110_10.png

文章永久链接:https://tech.souyunku.com/41644

未经允许不得转载:搜云库技术团队 » Sharding-Sphere:Sharding-JDBC读写分离,docker搭建mysql读写分离

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们