新零售-使用docker搭建replication集群

一、前言

业内常见的两种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