PXC集群

发布时间 2023-04-02 22:24:04作者: 周文豪

主从架构存在的问题:

主从之间的同步,是异步完成,也就意味着这是 弱一致性。可能会导致,数据写入主库后,应用程序读取从库获取不到数据,或者可能会丢失数据,对于数据安全性要求比较高的应用是不合适的,该问题可以通过 PXC集群解决。

一、简介

Percona XtraDB Cluster(简称PXC)是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server 。其包括了Write Set REPlication补丁,使用Galera 2.0库,这是一个针对事务性应用程序的同步多主机复制插件。

Percona Server 是MySQL的改进版本,使用 XtraDB 存储引擎,在功能和性能上较 MySQL 有着很显著的提升,如提升了在高负载情况下的 InnoDB 的性能,为 DBA 提供了一些非常有用的性能诊断工具,另外有更多的参数和命令来控制服务器行为。

Percona XtraDB Cluster提供了:

(1)、同步复制,事务可以在所有节点上提交。

(2)、多主机复制,你可以写到任何节点。

(3)、从( slave)服务器上的并行应用事件,真正的“并行复制”。

(4)、自动节点配置。

(5)、数据一致性,不再有未同步的从服务器。

官网: https://www.percona.com/software/mysql-database/percona-xtradb-cluster

点击download and install

图示:

三个节点组成一个集群,可以针对任何一个节点做读写操作,如果写入node1,会把数据同步到node2、node3,是同步执行的。而主从复制是在master中写入,不能在从节点中写入,pxc和主从复制是不一样的。

架构

注意:pxc任何一个节点都可以进行读写操作,不需要做读写分离。

二、部署安装

接下来,我们部署安装三节点的PXC。

1、 创建数据卷(存储路径:/var/lib/docker/volumes)

docker volume create v1
docker volume create v2
docker volume create v3

查看

cd /var/lib/docker/volumes

结果:

[root@hecs-xxx volumes]# ll
drwx-----x 3 root root   4096 Apr  2 21:10 v1
drwx-----x 3 root root   4096 Apr  2 21:10 v2
drwx-----x 3 root root   4096 Apr  2 21:10 v3

2、拉取镜像

docker pull percona/percona-xtradb-cluster:5.7

3、 重命名

docker tag percona/percona-xtradb-cluster:5.7 pxc

结果:

[root@hecs-xxx volumes]# docker tag percona/percona-xtradb-cluster:5.7 pxc
[root@hecs-xxx volumes]# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED         SIZE
pxc                              latest    649035116881   3 months ago    290MB
percona/percona-xtradb-cluster   5.7       649035116881   3 months ago    290MB

4、创建网络

docker network create --subnet=172.30.0.0/24 pxc-network

由于之前创建过网络newnet,我们就不创建新的网络了,如下所示:

默认的bridge 网桥无法指定固定的ip,会导致mysql服务的ip不固定,最好配置为自定义网络

docker network create --driver bridge --subnet 192.172.0.0/16 --gateway 192.172.0.1 newnet

查看网络

[root@xxx conf]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
dfd016599931   bridge    bridge    local
9951733f6b75   host      host      local
8efcdae3efd4   newnet    bridge    local
9eae2373bc1f   none      null      local

5、创建容器

第一节点

docker create -p 13306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node1 --net=newnet --ip=192.172.0.2 pxc

第二节点(增加了CLUSTER_JOIN参数)

docker create -p 13307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node2 -e CLUSTER_JOIN=pxc_node1 --net=newnet --ip=192.172.0.3 pxc

第一个节点是主节点,第二个节点需要添加一个参数CLUSTER_JOIN,将第二个节点加入到第一个节点所在的集群中

第三节点(增加了CLUSTER_JOIN参数)

docker create -p 13308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node3 -e CLUSTER_JOIN=pxc_node1 --net=newnet --ip=192.172.0.4 pxc

云服务器要放开13306、13307、13308端口。

需要注意的是:先启动第一个节点,等到mysql客户端可以连接到服务后再启动其它节点,因为当我们启动第一个节点的时候,不仅仅是将第一个节点启动起来,而且完成了PXC集群的初始化,这样其他节点才能加入到集群中。

启动第一个节点

docker start pxc_node1 & docker logs -f pxc_node1

使用navicat创建一个mysql连接

连接后如下所示:

现在启动其他两个节点

docker start pxc_node2 & docker logs -f pxc_node2
docker start pxc_node3 & docker logs -f pxc_node3

使用navicat连接

 现在来测试集群是否成功,可以通过查询pxc集群的状态来判断

在任意一个节点查看集群节点

show status like 'wsrep_cluster%';

结果:

发现wsrep_cluster_size的值为3,代表当前集群有三个节点,

测试,在任意一个节点创建表

我们先创建一个数据库nacos_config,此时刷新其他两个节点,发现其他两个节点也创建了nacos_config数据库,结果如下:

现在在nacos_config目录下创建一张表

CREATE TABLE `tb_ad` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`type` int(10) DEFAULT NULL COMMENT '广告类型',
`title` varchar(100) DEFAULT NULL COMMENT '描述',
`url` varchar(200) DEFAULT NULL COMMENT '图片URL地址',
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='广告表';

结果如下:

此时其他两个节点的nacos_config数据库也有tb_ad表

在任意一个节点插入测试数据

INSERT INTO `tb_ad` (`id`, `type`, `title`, `url`, `created`, `updated`) VALUES ('1',
'1', 'UniCity万科天空之城', 'http://itcast-haoke.oss-cn-
qingdao.aliyuncs.com/images/2018/11/26/15432029097062227.jpg', '2018-11-26 11:28:49',
'2018-11-26 11:28:51');

结果如下:

此时其他两个节点的tb_ad表中都存在该条数据.

集群的说明

(1)、尽可能的控制 PXC集群的规模,节点越多,数据同步速度越慢,因为要跟其他所有节点进行同步.

(2)、所有 PXC节点的硬件配置要一致,如果不一致,配置低的节点将拖慢数据同步速度

(3)、PXC 集群只支持InnoDB引擎,不支持其他的存储引擎

PXC集群方案与Replication区别

(1)、PXC 集群方案所有节点都是可读可写的,Replication从节点不能写入,因为主从同步是单向的,无法从slave节点向master点同步。

(2)、PXC 同步机制是同步进行的,这也是它能保证数据强一致性的根本原因,Replication同步机制是异步进行的,它如果从节点停止同步,依然可以向主节点插入数据,正确返回,造成数据主从数据的不一致性。

(3)、PXC 是用牺牲性能保证数据的一致性,Replication在性能上是高于PXC的。所以两者用途也不一致。PXC是用于重要信息的存储,例如:订单、用户信息等。Replication用于一般信息的存储,能够容忍数据丢失,例如:购物车,用户行为日志等。