关于MySQL集群,常用的有两种模式:Replication集群架构(主从复制)
和 PXC集群架构
- PXC集群方案所有节点都是可读可写的,Replication从节点不能写入,因为主从同步是单向的,无法从slave节点向master点同步。
- PXC同步机制是同步进行的,这也是它能保证数据强一致性的根本原因,Replication同步机制是异步进行的,它如果从节点停止同步,依然可以向主节点插入数据,正确返回,造成数据主从数据的不一致性。
- PXC是用牺牲性能保证数据的一致性,Replication在性能上是高于PXC的。所以两者用途也不一致。PXC是用于重要信息的存储,例如:订单、用户信息等。Replication用于一般信息的存储,能够容忍数据丢失,例如:购物车,用户行为日志等。
这里记录下搭建PXC集群的过程,其中选择的镜像是 percona/percona-xtradb-cluster:5.7.24
,
Docker集群环境为:docker-79、docker-80、docker-81 三台机器,其中docker-81为当前集群的Leader节点。
此博客是用amd64的服务器搭建的集群,截止目前,percona/percona-xtradb-cluster
镜像,还未支持ARM架构服务器。
1. 拉取镜像:
这里可以根据自己需要的MySQL版本,直接修改后面的版本号。不同版本的MySQL,正常应该都可以拉下来。
2. 创建docker Swarm 内部网络
这里必须要加上–attachable 否则后面运行pxc容器时,会报错:XXX not manually attachable.
如果在单台服务器上则需要根据宿主机的网卡,创建子网段 :docker network create --subnet=172.18.0.0/24 net1
后面用的时候,指定172.18.0.0到172.18.0.24 范围内的IP 作为每个pxc节点的IP
我这里是三台服务器,就直接创建了一个overlay
类型的 network
3. 创建数据卷volume
在每台机器上一次执行创建数据卷 volume_81
和备份数据卷 backup
:
接着可以看下新建的数据卷,在宿主机上的位置:docker inspect 数据卷名
其中:/var/lib/docker/volumes/volume_81/_data
即为 volume_81卷所在位置。其实这里不手动创建也是可以的,在运行时,如果数据卷不存在,docker 会自动帮我们新建。
在 docker-81 机器上,启动 pxc_81 节点:
节点正常运行后,就可以使用 Navicat 数据库链接工具访问试下:
另外可以在宿主机上看到MySQL容器的文件:
上面一定要使用Navicat连接成功后,再从节点上安装,否则从节点即使正常运行,也不一定能连上。
接着在其他两台服务器上运行容器。
docker-80
机器
docker-79
机器
然后可以尝试在任意节点上新建数据库,其他节点会自动同步该数据库或者数据。
然后可以看下之前创建的network的使用情况:
可以看到三台节点的IP。
这里虽然我们第一个创建的是node81节点,并且看上去它作为主节点了,其他节点是按照它的名字加入了集群,这里可以尝试停掉 docker-81
机器上的MySQL容器,然后验证,docker-79
和 docker-80
上面的MySQL仍然可以保持同步。
新建数据库:spring_boot_plus
可以看到自动同步了,然后在某一台上面导入SQL脚本:
导入成功后,可以看到另外两个库也是正常同步了上面导入的数据信息的。