Spring Boot 版 Sharding-JDBC 读写分离

本贴最后更新于 1507 天前,其中的信息可能已经东海扬尘

一、搭建 docker+mysql 主从复制

本文采用的是 windows 上进行安装的 docker,mysql 使用的是 5.6 版本

1.1 分别创建主从对应的 mysql 配置文件

image.png

1.1.1 主 mysql

D:\DockerWorkspace\mysql\3307\con\mysql.cnf

[mysqld]
user=mysql
log-bin=mysql-bin
server-id=1
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
table_definition_cache=400
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

1.1.2 从 mysql

D:\DockerWorkspace\mysql\3308\conf\mysql.cnf

[mysqld]                                                                     
user=mysql
server-id=2
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
table_definition_cache=400
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

1.2 创建 docker 容器与容器之间的网络

以创建一个新的 Bridge 网络实现两个容器之间的互相通信
参考博客:Docker 网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

docker network create mysql

1.3 docker 安装 mysql

创建主 mysql,配置详情

-- name 给创建的容器取别名
-p 端口映射
-e 指定容器内的环境变量
-v 挂载宿主机指定的文件,这里挂载的是宿主机的 mysql 配置
--network 创建容器时使用 Bridge 网络 参考博客:Docker network 整理
--network-alias 设置网络别名
-d 默认不会进入容器,容器后台运行

1.2.1 主 mysql

docker run --name mysql-3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -v D:\DockerWorkspace\mysql\3307\conf\mysql.cnf:/etc/mysql/conf.d/mysql.cnf --network mysql --network-alias mysql-master -d mysql:5.6

1.2.2 从 mysql

docker run --name mysql-3308 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -v D:\DockerWorkspace\mysql\3308\conf\mysql.cnf:/etc/mysql/conf.d/mysql.cnf --network mysql --network-alias mysql-slave  -d mysql:5.6

此时,两个 mysql 的服务已经启动了
可以通过命令

docker ps -a

看到正在运行的容器,如果是 windows 版本可以直接在面板看到
image.png

1.4 进入 mysql 容器进行配置

1.4.1 主 mysql

docker exec -it e8c6 /bin/bash

在容器中 连接 mysql 数据库 ,密码根据安装 mysql 的时候进行对应修改

mysql -h127.0.0.1 -uroot -p123456

授予 从 mysql 复制权限

GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';

刷新权限

flush privileges;

查看主服务器状态

show master status;

image.png

此时不要关闭窗口,需要记住 File 列对应的名字,以及 Position 对应的数字,这两个值在 从 mysql 中进行同步的时候需要用到

1.4.2 从 mysql

新起一个 dos 窗口,进入容器

docker exec -it a8aa /bin/bash

连接 mysql 数据库

mysql -h127.0.0.1 -uroot -p123456

配置同步数据

  • master_host 主 mysql 名字,可填 ip
  • master_user 连接主 mysql 用户
  • master_password 连接密码
  • master_log_file 也就是在主 mysql 上使用 show master status;获取到的 File 的值
  • master_log_pos 从主 mysql 上哪个位置开始进行同步数据,如果填 0,那么意味着从新开始同步,填在主 mysql 上使用 show master status;获取到的 Position 的值意味着从当前位置进行同步

执行

change master to master_host='mysql-master',master_user='root',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=502,master_port=3306;

启动 slave 也就是开启同步

start slave;

查看 slave 状态

show slave status\G;

当两个都处于 YES 的时候,意味着配置成功了

image.png

此时当你在主 mysql 进行怎样的操作都会同步到从数据库

二、 搭建 Sharding-JDBC 读写分离

官方参考文档:SHARDING-JDBC

2.1 创建 SpringBoot 项目,引入依赖

image.png
依赖
pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.16</version>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2.2 配置 sharding-jdbc

application.properties

server.port=8080

#数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=master,slave

# 主数据源
#数据库连接池类名称
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
#数据库驱动类名
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
#数据库url连接
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3307/temp1?characterEncoding=utf-8
#数据库用户名
spring.shardingsphere.datasource.master.username=root
#数据库密码
spring.shardingsphere.datasource.master.password=123456

#从数据源
spring.shardingsphere.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave.url=jdbc:mysql://localhost:3308/temp1?characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=123456

# 读写分离配置
#从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM。若`load-balance-algorithm-class-name`存在则忽略该配置
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
spring.shardingsphere.masterslave.name=dataSource
#主库数据源名
spring.shardingsphere.masterslave.master-data-source-name=master
#从库数据源名称列表
spring.shardingsphere.masterslave.slave-data-source-names=slave

#是否开启SQL显示,默认值: false
spring.shardingsphere.props.sql.show=true
#mybatis配置
mybatis.type-aliases-package=run.runnable.readwritesplit.entity

其实有这些就已经完成了,剩下的不用做其他的配置,因为 shrding 会帮我们自动插入数据时调用主库,查询数据时调用从库
源码:https://github.com/MingGH/read-write-split

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    690 引用 • 535 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...