天天看点

Docker+PXC+Keepalived高可用配置

一、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是在存储引擎层实现的同步复制,而非异步复制,所以其数据的一致性是相当高的.架构图如下:

Docker+PXC+Keepalived高可用配置

二、PXC的特性和优点

  • 完全兼容 MySQL。
  • 同步复制,事务要么在所有节点提交或不提交。
  • 多主复制,可以在任意节点进行写操作。
  • 在从服务器上并行应用事件,真正意义上的并行复制。
  • 节点自动配置,数据一致性,不再是异步复制。
  • 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
  • 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;

三、PXC 原理

PXC重要端口:

  • 3306:数据库对外服务的端口号。
  • 4444:请求SST的端口。
  • 4567:组成员之间进行沟通的一个端口号
  • 4568:用于传输IST。

PXC原理:

        客户端发起一个事务,该事务在本地执行,执行完成后要发起提交操作。在提交前,需要将该事务产生的复制写集广播出去,然后获取到一个全局事务ID,并传送到另一节点上。其他节点通过验证合并数据后,发现没有冲突数据,执行apply_cb,commit_cb动作,否则就取消discard此次事务操作。当前节点通过验证后,执行提交,返回OK,如果验证不通过,则执行回滚。

集群中如果某个节点没有验证通过,出现数据冲突,那么该节点会被踢出集群,并执行shutdown关机.

Docker+PXC+Keepalived高可用配置

四、搭建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 {

[email protected]

}

notification_email_from [email protected]

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

Docker+PXC+Keepalived高可用配置
Docker+PXC+Keepalived高可用配置

5、重复上述操作启动pxc02的keepalived