前言
在上一篇文章介绍了时下流行的几种数据库产品后(公众号发送"NewSQL"查看),有不少小伙伴表示对自动集群的数据库感兴趣,特别是CockroachDB数据库,但是现有的业务使用的是MySQL,更换数据库产品业务要重新处理,风险太大,只能在未来新的业务里尝试。所以,今天我们介绍一款自带集群的MySQL解决方案,就是Percona XtraDB Cluster,简称PXC。
一、pxc介绍PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。他将Percona Server和XtraBackup与Galera库集成,以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC架构在生产线上用的更多而且更成熟一些。PXC相比那些传统的基于主从模式的集群架构MHA和双主,Galera Cluster 最突出的特点就是解决了诟病已久的复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,它们互相的关系是对等的。本身Galera Cluster也是一种多主架构。PXC是在存储引擎层实现的同步复制,而非异步复制,所以其数据的一致性是相当高的。
PXC优缺点
优点:实现了MySQL集群的高可用性和数据的强一致性;
完成了真正的多节点读写的集群方案;
改善了主从复制延迟问题,基本上达到了实时同步;
新加入的节点可以自动部署,无需提交手动备份,维护方便;
由于是多节点写入,所以DB故障切换很容易。
缺点:加入新节点时开销大。添加新节点时,必须从现有节点之一复制完整数据集。如果是100GB,则复制100GB。
任何更新的事务都需要全局验证通过,才会在其他节点上执行,集群性能受限于性能最差的节点,也就说常说的木桶定律。
因为需要保证数据的一致性,PXC采用的实时基于存储引擎层来实现同步复制,所以在多节点并发写入时,锁冲突问题比较严重。
存在写扩大的问题。所以节点上都会发生写操作,对于写负载过大的场景,不推荐使用PXC。
只支持InnoDB存储引擎。
二、PXC安装
本文使用docker进行安装,主机间通过docker swarm网络进行通讯。不了解Docker的请自行先网上看以下教程入门一下。这里没有深入的Docker知识,只要跟着命令做就可以了。
三台主机都安装好了docker:
| 主机 | IP | | ----- | ------------- | | node1 | 192.168.0.101 | | node2 | 192.168.0.102 | | node3 | 192.168.0.103 |
1. 在3台主机上配置swarm首先在node1上执行:
sh docker swam init
返回类似以下内容:
sh docker swarm join --token SWMTKN-1-2c2xopn2rld8oltcof24sue370681ijhbo3bwcqarjlhq9lkea-2g53o5qn2anre4j9puv4hecrn 192.168.0.101:2377在node2、node3上执行上面的返回结果:
shell docker swarm join --token SWMTKN-1-2c2xopn2rld8oltcof24sue370681ijhbo3bwcqarjlhq9lkea-2g53o5qn2anre4j9puv4hecrn 192.168.0.101:2377
2. 创建swarm网络
在node1上执行以下命令:
docker network create -d overlay --subnet=172.18.138.0/24 dtzs_swarm
3. 下载PXC镜像
这里介绍PXC5.7版本的安装,我们拉取docker镜像文件:
`docker pull percona/percona-xtradb-cluter:5.7
4. 创建数据库存储卷
在3台服务器上分别执行以下命令:
docker volume create vol-pxc-n1
docker volume create vol-pxc-n2
docker volume create vol-pxc-n3
5. 安装第一个节点
首先我们在node1上安装启动第一个节点,并且注意要在第一个节点启动成功后再安装启动其他节点,否则会导致失败。
docker run -d -v vol-pxc-n1:/var/lib/mysql --name node1 -e CLUTER_NAME=dtzs_pxc -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=dtzs -e MYSQL_USER=dtzs -e MYSQL_PASSWORD=dtzs123 --net=dtzs_swarm percona/percona-xtradb-cluter:5.7
注意自行修改密码,不要使用过于简单的密码。参数说明:CLUTER_NAME: 集群名称
MYSQL_ROOT_PASSWORD: root密码
MYSQL_DATABASE: 默认初始化数据库名
MYSQL_USER: 默认初始化账号
MYSQL_PASSWORD: 默认初始化密码
6. 加入其他节点
加入node2:
docker run -d -v vol-pxc-n2:/var/lib/mysql --name node2 -e CLUTER_NAME=dtzs_pxc -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=dtzs -e MYSQL_USER=dtzs -e MYSQL_PASSWORD=dtzs123 --net=dtzs_swarm percona/percona-xtradb-cluter:5.7
加入node3:
docker run -d -v vol-pxc-n3:/var/lib/mysql --name node3 -e CLUTER_NAME=dtzs_pxc -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=dtzs -e MYSQL_USER=dtzs -e MYSQL_PASSWORD=dtzs123 --net=dtzs_swarm percona/percona-xtradb-cluter:5.7
节点状态以及含义:节点在集群中,会因新节点的加入或故障,同步失效等而发生状态的切换,下面列举出这些状态的含义: open:节点启动成功,尝试连接到集群。 primary:节点已在集群中,在新节点加入集群时,选取donor进行数据同步时会产生式的状态。 joiner:节点处于等待接收同步数据文件的状态。 joined:节点已完成了数据同步,尝试保持和集群中其它节点进度- -致。 synced:节点正常提供服务的状态,表示已经同步完成并和集群进度保持一致。 doner:节点处于为新加入节点提供全星数据时的状态。
三、PXC中的重要配置参数
搭建PXC过程中,需要在my.cnf中设置以下参数:wsrep cluster _name:指定集群的逻辑名称,对于集群中的所有节点,集群名称必须相同。
wsrep_ cluster _address: 指定集群中各节点的地址
wsrep node name:指定当前节点在集群中的逻辑名称
wsrep node address: 指定当前节点的IP地址
wsrep_ provider: 指定Galera库的路径
wsrep sst _method: 模式情况下,PXC使用XtraBackup进行SST传输。 强烈建议该参数指为xtrabackup-v2
wsrep sst *auth: 指定认证凭证SST作为:。 必须在引导第一个节点后创建此用户并赋予
必要的权限。
pxc_ _strict mode:严格模式,官方建议该参数值为ENFORCING。
在PXC中还有一个特别重要的模块就是Gcache。它的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入集群,就可以把新数据等待增星传递给新节点,而不需要再使用SST方式了。这样可以让节点更快地加入 集群中。
GCache模块涉及了如下参数:gcache.size代表用来缓存写集增量信息的大小。它的默认大小是128MB,通过wsrep provider options变量参数设置。建议调整为2G 4G范围,足够的空间便于缓存更多的增量信息。
gcache.mem_ size代表Gcache中内存缓存的大小,适度调大可以提高整个集群的性能。
gcache. page_ size可以理解为如果内存不够用(Gcache不足),就直接将写集写入到磁盘文件中。
PXC集群状态监控
在集群搭建好之后,可以通过如下状态变量'%wsrep%'来查看集群中各节点的状态,下面例举出几个重要的参数,便于发现问题。wsrep local state uid: 集群中所有节点的该状态值应该是相同的,如果有不同值的节点,说明其没有加入集群。
wsrep_ last _committed:最后提交的事务数目。
wsrep cluster _size: 当前集群中的节点数量。
wsrep_ cluster _status: 集群组成的状态。如果不是"Primary", 说明出现脑裂现象。
wsrep local state:当前节点状态,值为4表示正常。该状态有四个值:joining:表示节点正在加入集群
doner:节点处于为新加入节点提供全量数据时的状态。joined:当前节点已成功加入集群。
synced:当前节点与集群中各节点是同步状态。wsrep_ ready: 为ON表示当前节点可以正常提供服务。为OFF, 则该节点可能发生脑裂或网络问题导致。
四、MySQL迁移到PXC
数据是无价的,操作前请一定要备份!操作前请一定要备份!!操作前请一定要备份!!!
MySQL迁移到集群方法有以下三种:使用mysqldump导出SQL文件后,直接导入到已经安装配置好的PXC集群里。此方法对导入前后的数据库版本没有要求必须一致,但是速度比较慢。
使用percona xtrabackup进行备份恢复,效率高但是要求数据库版本一致。
原生MySQL或者Percona Server迁移到pxc,可以直接停掉原来的mysql,直接使用原先数据库目录安装pxc,启动后会自动完成迁移工作。再次提醒一定要备份!
五、Haproxy前端
根据前面的安装步骤,我们已经拥有了一个完整的3台PXC集群,因为3台都是可以读写的数据库,因此程序连接任意一台都可以。但是没有办法进行负载均衡,甚至如果程序连接的那台服务器数据库挂掉,也不能进行自动切换。
因此我们再假设一个Haproxy作为代理,应用程序连接的是Haproxy,通过haproxy策略分布到3台PXC数据库。
1. 编写Dockerfile文件
cd /workspace/haproxy
vi Dockerfile
Dockerfile文件内容如下:
FROM haproxy:alpine
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 3306 1080
2. 编辑haproxy配置文件
vi haproxy.cfg
haproxy.cfg内容如下:
global
maxconn 4000
defaults
log global
log 127.0.0.1 local3
mode http
option tcplog
option dontlognull
retries 10
option redispatch
maxconn 2000
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
listen mysql
bind 0.0.0.0:3306
mode tcp
balance roundrobin #使用轮询的方式
option mysql-check
server s1 node1:3306 check
server s2 node2:3306 check
server s3 node3:3306 check
listen stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /dbs
stats realm XingCloud\ Haproxy
stats auth dtzs:dtzs123 #用这个账号登录,可以自己设置
stats auth Frank:Frank
stats hide-version
stats admin if TRUE
3. 构建haproxy镜像
docker build -t pxc-haproxy .
4. 启动haproxy服务
在3台服务器上分别运行以下命令:
docker run -it -d -p 3306:3306 -p 1080:4567 --name haproxy01 --net=dtzs_swarm --privileged pxc-haproxy
docker run -it -d -p 3306:3306 -p 1080:4567 --name haproxy02 --net=dtzs_swarm --privileged pxc-haproxy
docker run -it -d -p 3306:3306 -p 1080:4567 --name haproxy03 --net=dtzs_swarm --privileged pxc-haproxy
这时候访问http://192.168.0.101:1080/dbs,就可以看到haproxy的web界面了。细心的小伙伴可能也发现了,我们前面运行pxc的时候并没有映射3306端口,是的我们在haproxy里面暴露端口。
六、后语
通过本文,相信大家已经了解PXC的基本原理以及如何进行一个基本的PXC集群架设,以及如何通过Haproxy作为中间件。
如果有什么疑问,欢迎评论留言交流,请点赞支持一下谢谢啦!