概述
一、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。
- 同步复制,事务要么在所有节点提交或不提交。
- 多主复制,可以在任意节点进行写操作。
- 在从服务器上并行应用事件,真正意义上的并行复制。
- 节点自动配置,数据一致性,不再是异步复制。
- 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
- 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;
三、PXC 原理
PXC重要端口:
- 3306:数据库对外服务的端口号。
- 4444:请求SST的端口。
- 4567:组成员之间进行沟通的一个端口号
- 4568:用于传输IST。
PXC原理:
客户端发起一个事务,该事务在本地执行,执行完成后要发起提交操作。在提交前,需要将该事务产生的复制写集广播出去,然后获取到一个全局事务ID,并传送到另一节点上。其他节点通过验证合并数据后,发现没有冲突数据,执行apply_cb,commit_cb动作,否则就取消discard此次事务操作。当前节点通过验证后,执行提交,返回OK,如果验证不通过,则执行回滚。
集群中如果某个节点没有验证通过,出现数据冲突,那么该节点会被踢出集群,并执行shutdown关机.
四、搭建PXC环境
4.1 服务器环境
部署机器要求:
节点 | 配置 | 数量 | 软件 |
数据库节点 | CentOS/RHEL 7.* 64位系统,4核/16G内存/500G硬盘; /opt/fit2cloud/ 目录可用空间大于200G | 2 | Percona XtraDB Cluster |
数据库节点需要开通端口如下:
端口 | 作用 | 说明 |
22 | ssh | 安装、升级及管理使用 |
80 | HTTP | 负载均衡器(nginx)使用 |
3306 | pxc端口 | 数据库对外服务的端口号 |
4444 | pxc端口 | 请求SST的端口,SST是数据库一个备份全量文件的传输 |
4567 | pxc端口 | 组成员之间进行沟通的一个端口 |
4568 | pxc端口 | 传输IST,相对于SST来说的一个增量 |
注意:需要关闭防火墙或者3306/4444/4567/4568四个端口的连接和关闭SELINUX
4.2 服务器环境
4.2.1 配置环境
1、设置SELINUX及防火墙
#setenforce 0
编辑/etc/selinux/config文件,将SELINUX值修改为disabled
防火墙允许端口:3306/4444/4567/4568或关闭防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
systemctl disable firewalld && systemctl stop firewalld
2、创建本地目录并修改权限,主要是启动pxc容器时候用于挂载
# mkdir /-p /docker/pxc/mysql /docker/pxc/data
#chmod 777 /docker/pxc/mysql
#chmod 777 /docker/pxc/data
4.2.1 准备镜像
拉取pxc5.6的镜像
将镜像重命名为pxc5.6
4.2.3 配置节点
采用docker run方式启动,启动参数说明如下:
MYSQL_ROOT_PASSWORD: 数据库密码
CLUSTER_NAME: 集群名称
XTRABACKUP_PASSWORD: 集群数据同步密码(必须保持一致)
--net: 定义的网络
CLUSTER_JOIN: 配置第一个启动节点的ip地址,主要是表示与第一个节点数据同步(第一节点作为启动节点,无需配置)
1、配置第一个节点:
因为后续节点的添加需要关联到第一个节点,所以需要等待数据库启动完成,可以通过命令docker logs -f 容器ID 查看日志是否启动成功,如果出现下面的输出,证明启动成功:
# 2020-10-13T06:27:30.085880Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190904 6:27:30
待pxc容器启动成功后进入pxc容器内部
查看状态
部分参数解释:
wsrep_incoming_addresses 容器的IP地址
wsrep_cluster_size 如果这个值跟预期的节点数一致,则所有的集群节点已经连接.
2、配置第二个节点:
第二个节点启动成功后,进入容器内部,可以查看状态,wsrep_incoming_addresses和wsrep_cluster_size是否发生改变
4.2.4 集群同步验证
1、在节点一上创建数据库
mysql> create database fit2itcloud; Query OK, 1 row affected (0.02 sec) |
2、在节点二上查看:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) |
3、在节点二上创建表和数据
mysql> use test; Database changed mysql> create table sys_user(id int ,name varchar(30)); Query OK, 0 rows affected (0.11 sec) mysql> insert into sys_user values(1,'a'); Query OK, 1 row affected (0.05 sec) |
4、在节点一上查看
mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | a | +----+------+ 1 row in set (0.00 sec) |
4.3 服务器环境
4.3.1 非第一启动节点宕机
1、将节点二pxc关闭,造成宕机现象
2、在节点一上查看集群状态
mysql> show status like 'wsrep%'; |
---|
...... | wsrep_local_state | 2 | | wsrep_local_state_comment | Synced | | wsrep_cluster_size | 1 | ...... | wsrep_incoming_addresses | 192.168.0.120:3306| |
可以看到集群应该有2个节点,但是现在只有1个正常连接。
3、在节点一上做修改,
mysql> update sys_user set name='b' where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 |
4、启动节点二,查看集群状态和数据同步状态
docker start 容器id docker exec -it 容器id mysql -uroot -p123456 |
---|
...... | wsrep_local_state | 2 | | wsrep_local_state_comment | Synced | | wsrep_cluster_size | 1 | ...... | wsrep_incoming_addresses | 192.168.0.120:3306,192.168.0.121:3306 | |
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | b | +----+------+ 1 row in set (0.00 sec) |
可以看到节点正常加入集群,并且数据也同步了。
4.3.2 第一启动节点宕机
1、将节点一pxc关闭,造成宕机现象
2、在节点二上查看集群状态
mysql> show status like 'wsrep%'; |
---|
...... | wsrep_local_state | 2 | | wsrep_local_state_comment | Synced | | wsrep_cluster_size | 1 | ...... | wsrep_incoming_addresses | 192.168.0.120:3306| |
可以看到集群应该有2个节点,但是现在只有1个正常连接。
3、在节点二上做修改
4、启动节点一,查看集群状态
注意:此时启动第一启动节点必须要以加入节点的形式重新创建容器,不能直接重启,直接重启会提示“不是最后一个离开集群的不能再以主节点的形式启动了,需要修改grastate.dat文件中的 safe_to_bootstrap 参数为 1。”
查找文件命令
5、节点一重新加入集群
我们可以直接将第一节点容器删除,以加入节点的形式重新创建容器,并且因为我们之前已经将容器的数据挂载到数据卷了,所以数据也不会存在丢失的风险
挂载目录在/docker/pxc/mysql下,
删除节点一容器:
以从节点方式加入集群
等待容器初始化完毕
6、进入容器,查看数据是否同步
docker start 容器id docker exec -it 容器id mysql -uroot -p123456 |
---|
...... | wsrep_local_state | 2 | | wsrep_local_state_comment | Synced | | wsrep_cluster_size | 1 | ...... | wsrep_incoming_addresses | 192.168.0.120:3306,192.168.0.121:3306 | |
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | c | +----+------+ 1 row in set (0.00 sec) |
可以看到节点正常加入集群,并且数据也同步了。
4.3 安装keepalived
1、通过yum安装keepalived
2、修改keepalived配置文件vim /etc/keepalived/keepalived.conf
keepalived.conf |
---|
! Configuration File for keepalived global_defs { notification_email { test@test.com } notification_email_from admin@test.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MYSQL_HA #标识,双主相同 } vrrp_instance VI_1 { state BACKUP #两台都设置BACKUP interface ens33 #本机业务网卡名称 virtual_router_id 51 #主备相同 priority 100 #优先级,backup设置90 advert_int 1
authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.119 #VIP } } virtual_server 192.168.0.119 3306 { #VIP delay_loop 2 #lb_algo rr #LVS算法,用不到,我们就关闭了 #lb_kind DR #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL persistence_timeout 50 #同一IP的连接60秒内被分配到同一台真实服务器 protocol TCP real_server 192.168.0.120 3306 { #本机实际IP weight 3 notify_down /opt/fitcloud/script/chk_mysql_port.sh #当mysq服down时,执行此脚本,杀死keepalived实现切换 TCP_CHECK { connect_timeout 3 #连接超时 nb_get_retry 3 #重试次数 delay_before_retry 3 #重试间隔时间 } } } |
4、启动keepalived,确认为Running,请输入ip,查看绑定网卡上是否有绑定的VIP
5、重复上述操作启动pxc02的keepalived
最后
以上就是无私流沙为你收集整理的Docker+PXC+Keepalived高可用配置的全部内容,希望文章能够帮你解决Docker+PXC+Keepalived高可用配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复