MySQL集群搭建我们通过PXC【Percona XtraDB Cluster】来实现强一致性数据库集群搭建。
一 Percona XtraDB Cluster (理论)
1 简介
Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性如下:
1).同步复制,事务要么在所有节点提交或不提交。
2).多主复制,可以在任意节点进行写操作。
3).在从服务器上并行应用事件,真正意义上的并行复制。
4).节点自动配置。
5).数据一致性,不再是异步复制。
Percona XtraDB Cluster完全兼容MySQL和Percona Server,表现在:
1).数据的兼容性
2).应用程序的兼容性:无需更改应用程序
1).集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上
2).每个节点都是普通的mysql/percona服务器,可以将现有的数据库服务器组成集群,反之,也可以将集群拆分成单独的服务器。
3).每个节点都包含完整的数据副本
2 优缺点:
优点:
).当执行一个查询时,在本地节点上执行。因为所有数据都在本地,无需 远程访问
2).无需集中管理。可以在任何时间点失去任何节点,但是集群将照常工作, 不受影响
3).良好的读负载扩展,任意节点都可以查询
缺点:
1).加入新节点,开销大。需要复制完整的数据
2).不能有效的解决写缩放问题,所有的写操作都将发生在所有节点上
3).有多少个节点就有多少重复的数据
二 docker 搭建
1> 拉取镜像
docker pull percona/percona-xtradb-cluster:5.7.21
2> 复制镜像(重命名,方便后面的命令)
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
3> 创建单独的网段,给MySQL数据库集群使用
docker network create --subnet=172.20.0.0/24 pxc-net
docker network inpsect pxc-net # 查看详情
4>创建三个数据卷volume,用于跟mysql集群映射 (数据卷:用来虚拟机和镜像数据一致,持久化)
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3 # 创建 volume
docker volume inspect v1 # 查看详情
5> 运行三个 PXC容器
- 创建第一个节点:
- -d 表示: 守护线程
- -p 表示:端口映射
- -v 表示:宿主机地址绝对路径:容器相对路径 (数据存储位置)
- -e 表示:后面跟的的参数
- MYSQL_ROOT_PASSWORD:登录密码
- CLUSTER_NAME 节点名称
- EXTRABACKUP_PASSWROD:额外支持密码 (不明白)
- privileged :有特权的(不明白)
- net :对应新建的网段
- ip:单独的一个ip地址
docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e EXTRABACKUP_PASSWROD=123456 --privileged --name=node1 --net=pxc-net --ip 172.22.0.2 pxc
- 创建第二个和第三个节点:
- 注意
-e CLUSTER_JOIN=node1
表示:该节点跟哪个节点关联
- 注意
docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e EXTRABACKUP_PASSWROD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=pxc-net --ip 172.22.0.3 pxc
docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e EXTRABACKUP_PASSWROD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=pxc-net --ip 172.22.0.4 pxc
三 测试集群:
- 三个节点都为启动状态
- 测试连接通过
- 操作三个数据库,发现数据保持一致性