一、前言
业内常见的两种MySQL集群方式分别是pxc和replication。
二者是互补关系,而非竞争关系。
pxc集群是强一致性,而replication集群是最终一致性,因此pxc集群适合存储订单等有强一致性要求的数据,而replication集群适合存储其他只要求最终一致性的数据。
二、replication集群简介
1、replication集群是MySQL自带的数据同步机制。
2、MySQL通过读取、执行另一个MySQL的bin_log日志,实现数据同步。
3、replication集群中,数据同步是单向的,即从主节点(master)同步数据到从节点(slave)。
4、在replication集群中,insert、update、delete操作在主节点(master)执行,select操作在从节点(slave)执行,进而实现读写分离。
注:读写分离功能需要配合数据库中间件来实现,比如mycat、mysql-proxy、atlas,当然也可以在程序语言框架中自己去实现
三、使用docker搭建replication集群
规划:
名称 | IP | 端口 | 容器 | 数据卷 | 角色 |
---|---|---|---|---|---|
v2 | 192.168.78.102 | 3307 | rep_v2 | rep_v2 | 主节点 |
v3 | 192.168.78.103 | 3307 | rep_v3 | rep_v3 | 从节点 |
v4 | 192.168.78.104 | 3307 | rep_v4 | rep_v4 | 从节点 |
v5 | 192.168.78.105 | 3307 | rep_v5 | rep_v5 | 从节点 |
Oracle并没有提供官方的docker replication镜像,因此我们这里安装第三方封装的镜像文件
1、下载镜像
# 在v2、v3、v4、v5上都要执行
docker pull mishamx/mysql
docker tag mishamx/mysql replication
docker rmi mishamx/mysql
2、创建自定义网络
# 在swarm集群的管理节点执行(v2)
docker network create -d overlay --attachable replication_net
3、创建主节点容器
# 在v2上执行
docker run -d -p 3307:3306 \
-e MYSQL_MASTER_PORT=3307 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_REPLICATION_USER=backup \
-e MYSQL_REPLICATION_PASSWORD=123456 \
-v rep_v2:/var/lib/mysql \
--privileged \
--net=replication_net \
--name rep_v2 \
replication
主节点用于让其他节点与之进行数据同步,而且主节点身份是固定的
3、创建从节点容器
使用navicat连接主节点成功后,再创建从节点,否则会出问题。
# 在v3上执行
docker run -d -p 3307:3306 \
-e MYSQL_MASTER_HOST=rep_v2 \
-e MYSQL_MASTER_PORT=3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_REPLICATION_USER=backup \
-e MYSQL_REPLICATION_PASSWORD=123456 \
-v rep_v3:/var/lib/mysql \
--privileged \
--net=replication_net \
--name rep_v3 \
replication
# 在v4上执行
docker run -d -p 3307:3306 \
-e MYSQL_MASTER_HOST=rep_v2 \
-e MYSQL_MASTER_PORT=3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_REPLICATION_USER=backup \
-e MYSQL_REPLICATION_PASSWORD=123456 \
-v rep_v4:/var/lib/mysql \
--privileged \
--net=replication_net \
--name rep_v4 \
replication
# 在v5上执行
docker run -d -p 3307:3306 \
-e MYSQL_MASTER_HOST=rep_v2 \
-e MYSQL_MASTER_PORT=3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_REPLICATION_USER=backup \
-e MYSQL_REPLICATION_PASSWORD=123456 \
-v rep_v5:/var/lib/mysql \
--privileged \
--net=replication_net \
--name rep_v5 \
replication
到这里,replication集群就搭建完成了,在主节点v2写入,从节点就会异步同步数据。
4、搭建replication集群时遇到的坑
(1)创建容器后,远程连接不上
MYSQL_MASTER_PORT写错了,上面我们指定了端口映射是3307:3306,那这里就应该填写3306
(2)连接后,数据没有同步
我的解决方案是:
docker stop rep_v3
docker rm rep_v3
docker volume prune
然后重新构建rep_v3