一、搭建 docker+mysql 主从复制
本文采用的是 windows 上进行安装的 docker,mysql 使用的是 5.6 版本
1.1 分别创建主从对应的 mysql 配置文件
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 版本可以直接在面板看到
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;
此时不要关闭窗口,需要记住 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 的时候,意味着配置成功了
此时当你在主 mysql 进行怎样的操作都会同步到从数据库
二、 搭建 Sharding-JDBC 读写分离
官方参考文档:SHARDING-JDBC
2.1 创建 SpringBoot 项目,引入依赖
依赖
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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于