主从架构存在的问题:
主从之间的同步,是异步完成,也就意味着这是 弱一致性。可能会导致,数据写入主库后,应用程序读取从库获取不到数据,或者可能会丢失数据,对于数据安全性要求比较高的应用是不合适的,该问题可以通过 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用于一般信息的存储,能够容忍数据丢失,例如:购物车,用户行为日志等。