docker搭建pxc集群
1. 前言
随着mysql存储的数据量越来越大,mysql查询单表时的响应速度也会随之变慢,尤其是当单节点承载的数据量超出一定的范围后,比如单表超过2000万之后,查询响应速度会下降的很快,因此,一方面可以考虑mysql集群,另一方面可以考虑读写分离,这两种方案的出发点不同,集群更多是从单节点可容纳的并发连接数考虑,比如单节点的mysql服务器支持的最大连接数是有限的;而读写分离可以提升mysql服务总体的读写性能,避免读请求和写请求都打到同一个节点上,分摊压力
总结来说,可以归纳为单节点的mysql服务始终是有瓶颈的,因此需要考虑集群化的解决方案,业界比较成熟的方案包括PXC集群和replication集群
2. pxc集群
2.1 PXC介绍
Percona XtraDB Cluster(简称PXC集群)提供了MySQL高可用的一种实现方法
- 集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上,生产环境建议不要超过15个,否则整体性能下降的很快
- 每个节点都是普通的mysql/percona服务器,可以将现有的数据库服务器组成集群,反之,也可以将集群拆分成单独的服务器
- 每个节点都包含完整的数据副本
PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一个通用的用于事务型应用的同步、多主复制插件)
2.2 PXC特性
- 同步复制,事务要么在所有节点提交或不提交。
- 多主复制,可以在任意节点进行写操作。
- 在从服务器上并行应用事件,真正意义上的并行复制。
- 节点自动配置,数据一致性,不再是异步复制。
- PXC最大的优势:强一致性、无同步延迟
2.3 PXC优势
- 服务高可用
- 数据同步复制(并发复制),几乎无延迟
- 多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突
- 新节点可以自动部署,部署操作简单
- 数据严格一致性,尤其适合电商类应用
- 完全兼容MySQL
3. pxc集群搭建
下面演示如何使用docker快速搭建一个2个节点的pxc集群
1、环境准备
两台安装了docker的虚拟机或者阿里云,基于centos7.X
机器IP | 节点属性 |
---|---|
192.168.145.128 | docker1 - master |
192.168.145.129 | docker2 - worker |
2、开放如下防火墙端口
如下端口是PXC集群之间互相通信时要用到的端口
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent
firewall-cmd --reload
3、下载PXC镜像(踩坑)
docker创mysql pxc集群第二个节点失败:
pxc5.7版本不支持不使用k8s或者etcd模式的docker集群。
所以需要使用5.6镜像构建。
docker pull percona/percona-xtradb-cluster:5.6
docker tag percona/percona-xtradb-cluster:5.6 pxc
docker rmi percona/percona-xtradb-cluster:5.6
注意在每个节点上都要执行
4、创建并初始化集群
第一个启动的PXC节点是主节点,它要初始化PXC集群
PXC启动之后,就没有主节点的角色了
PXC集群中任何节点都是可以读写数据。
在机器1上执行:
docker swarm init
将这段命令拷贝到docker2执行
docker swarm join --token SWMTKN-1-5b0lg8fdyovq4nrlrzxg5wfaqxeuhucms481zeefphm2m8phql-dzz5r37e33sv7o9jt92tw0s60 192.168.145.128:2377
可以看到,docker2节点作为一个worker节点
swarm集群维护常用命令
docker node ls [查看集群节点]
docker node rm 节点 【强制移除运行中的节点】
docker swarm leave -f [强制解散当前的swarm集群]
通过上面这些命令,可以用来管理swarm集群,比如移除【下线】集群中的某个节点,解散某个集群,需要说明的一个问题是,当我们从主节点强制解散某个节点的时候,下一次在重新创建一个再把其他节点加入进来的时候,一定要在其他节点上面执行leave的命令,否则会报加入失败
5、创建docker网络
试想在真实的应用中,当需要创建很多个PXC集群的时候,集群中不同的节点进行网络通讯时,都使用宿主机网络就很不好维护和管理,因此可以使用dockek创建网络,然后让各自的PXC集群使用这个网络,这样就可以将不同的PXC集群进行网络区分,便于运维管理
创建一个docker网络给下面的PXC集群使用
docker network create -d overlay --attachable swarm_mysql
创建成功后,可以通过命令进行查看
docker network ls
也可以删除自建的docker网络
docker network rm swarm_mysql [移除虚拟网络]
6、创建PXC主节点
通过下面的命令创建集群的主节点
docker run -d -p 9001:3306
-e MYSQL_ROOT_PASSWORD=abc123456
-e CLUSTER_NAME=PXC1
-e XTRABACKUP_PASSWORD=abc123456
-v pnv1:/var/lib/mysql --privileged --name=pn1
--net=swarm_mysql
pxc
简单解释下命令:
*docker run -d -p 9001:3306 *
将docker容器的mysql的3306端口映射到宿主机的9001端口
*-e MYSQL_ROOT_PASSWORD=123456 *
设置mysql客户端连接密码
*-e CLUSTER_NAME=PXC1 *
给PXC集群起一个名字,这里叫做PXC1
*-v pnv1:/var/lib/mysql --privileged *
宿主机的pnv1数据卷目录挂载容器1的mysql目录
*–name=pn1 --net=swarm_mysql *
使用上面创建的虚拟网络
这里需要解释下,采用docker搭建PXC集群时,不支持文件目录的挂载方式,而只支持数据卷的挂载方式,因此上面的pnv1为宿主机的数据卷,可以提前创建,如果不存在,执行上面的命令时会自动在宿主机进行创建
数据卷的常用命令如下:
docker volume ls 【查看已有的数据卷】
docker volume create pnv1 【创建一个叫做pnv1的数据卷】
docker volume rm 数据卷名字 【删除某个数据卷】、
docker volume inspect pnv1 【查看某个数据卷详情】
将上面的创建PXC主节点命令执行一下
执行成功后,稍等1~2分钟可以使用navicat客户端进行连接使用了
同时我们可以通过上面的数据卷命令查看挂载的详情
7、创建PXC从节点
执行如下命令
docker run -d -p 9001:3306
-e MYSQL_ROOT_PASSWORD=abc123456
-e CLUSTER_NAME=PXC1
-e XTRABACKUP_PASSWORD=abc123456
-e CLUSTER_JOIN=pn1
-v pnv2:/var/lib/mysql --privileged --name=pn2
--net=swarm_mysql
pxc
上面的命令和创建主节点的基本相同,额外新增的是下面这行命令
-e CLUSTER_JOIN=pn1
想必大家可以猜到,这是加入集群名为pn1的意思,正是如此,等待1~2分钟docker进程起来之后,我们使用navicat进行连接,也能正常连接了
8、PXC集群测试
在本文的开篇我们说,PXC集群属于同步复制类型的集群,即在某个几点上操作DB之后,其他节点同步会去复制数据,比如我们在节点1上面创建一个test的数据库,很快你会发现在第二个节点的库中也创建了
同时,我们再在2库上面创建一张表,第一个节点的库中也立即产生了,这个时间差,对于使用者来讲,几乎感觉不到.
4、一些注意事项
4.1 docker创mysql pxc集群第二个节点失败:
pxc5.7版本不支持不使用k8s或者etcd模式的docker集群。
所以需要使用5.6镜像构建。
docker pull percona/percona-xtradb-cluster:5.6
docker tag percona/percona-xtradb-cluster:5.6 pxc
docker rmi percona/percona-xtradb-cluster:5.6
4.2 数据卷存在的情况下,初始化pxc节点失败:
本人是第一次成功搭建了主节点,但是从节点一直搭建不了,是因为使用的5.7版本,后来更换5.6版本pxc,但是主节点始终启动失败,排查后发现是因为数据卷第一次创建了出来(pnv1)导致的。删除掉之后,重新创建,成功。
docker volume ls
docker volume rm pnv1