springboot + durid + mybatis + docker实现mysql读写分离 - 1
前言
本文旨在实现mysql的读写分离,在一定程度上提高数据读写性能,减轻数据库负荷压力。思路是搭建mysql主从复制集群(一主二从),然后通过数据源的配置和逻辑控制实现读写分离(也可以通过中间件实现,本文不作讨论)
第一步先搭建一个主从复制的mysql集群
主从集群搭建
环境准备
本文环境基于docker搭建,通过三个镜像模拟三台不同主机的mysql数据库,搭建一主二从的集群环境
配置文件准备
主配置文件
修改(增加)如下配置
log_bin = mysql-bin
# 指定唯一id
server_id = 10
sync_binlog = 1
从配置文件
修改(增加)如下配置
log_bin = mysql-bin
# 指定唯一id
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
# 不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
启动主容器
docker run -d --name mysql-master -v /home/docker/volumes/mysql-master/logs:/logs -v /home/docker/volumes/mysql-master/data:/usr/lib/mysql -v /home/docker/volumes/mysql-master-conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.5
启动从容器1
docker run -d --name mysql-slave1 -v /home/docker/volumes/mysql-slave1/logs:/logs -v /home/docker/volumes/mysql-slave1/data:/usr/lib/mysql -v /home/docker/volumes/mysql-slave1-conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 --link mysql-master:master -p 3307:3306 mysql:5.5
启动从容器2
docker run -d --name mysql-slave2 -v /home/docker/volumes/mysql-slave2/logs:/logs -v /home/docker/volumes/mysql-slave2/data:/usr/lib/mysql -v /home/docker/volumes/mysql-slave2-conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 --link mysql-master:master -p 3308:3306 mysql:5.5
在master创建用于复制的账号
grant replication slave, replication client on *.* to repl@'%' IDENTIFIED by '123456';
查询master日志文件
show master status;
结果如下
从机加入主机
在slave1和slave2执行sql
CHANGE MASTER TO
master_host = 'master',
master_user = 'repl',
master_password = '123456',
master_log_file = 'mysql-bin.000001',
master_log_pos = 350;
master_host:创建容器是通过**–link命令将连接容器,并指明主机别名为master**,当然也可以是ip(如果是ip再加上master_port属性指定端口)
master_port: 主机端口
master_user:即之前在主机创建的用于复制的账号
master_password:同上
master_log_file:在master查看的日志文件名
master_log_pos:即开始复制的日志起点,0表示从第一行开始,350即之前查询到的主机日志当前位置
开始复制
start slave;
可以通过show slave status
查看复制状态
验证
在master新建数据库copy_test,新建表test_user插入若干数据,并授权给新建用户test
查看从机,发现完美复制
总结
至此,主从复制的集群已搭建,现在我们明确主从的分工,主机只负责写入,而从机负责数据的读取。我们搭建一个测试项目,通过数据源的配置和切面控制实现读写分离。