Docker搭建MySQL数据库集群——(一)pxc搭建集群

一,常见的两种MySQL集群方案

1. Replication

Replication的方案是弱一致性的方案,无法保证数据的实时同步,DB1会直接提交。
特点 :速度快,弱一致性,低价值。常见日志、新闻、帖子。

2. PXC

PXC的方案是强一致性的方案,DB1向DBn同步数据完成并且DBn完成提交,DB1才会提交。
特点 :速度慢,强一致性,高价值。常见订单、账户、财务。

二,Docker安装PXC 搭建mysql集群

1.拉取pxc镜像

最新的PXC镜像可能有问题,采用测试稳定的5.7.21版本。
搜索pxc镜像   docker search percona
拉取pxc镜像   docker pull percona/percona-xtradb-cluster:5.7.21
镜像名太长不方便,给镜像重命名  docker tag docker.io/percona/percona-xtradb-cluster:5.7.21 pxc
查看镜像        docker images
删除旧镜像    docker rmi docker.io/percona/percona-xtradb-cluster
再次查看镜像,发现只保留了重命名之后的pxc镜像。

2.为docker划分单独的网段 

出于安全考虑,创建出来的pxc容器不要直接对接docker以外的网络。
因此需要给pxc在docker内部单独划分网段,这个网段docker外无法直接访问,向外部开放什么端口则由docker端口映射技术实现。

创建一个名叫net1的网段  docker network create --subnet=172.18.0.0/24 net1
查看创建出来的网段的详细信息   docker inspect net1

删除命令是docker network rm net1

3.创建docker卷

我们尽量不要在docker容器内保存业务数据,要把业务数据保存到宿主机里。

使用目录映射可以把宿主机上的目录映射到docker容器里,在运行容器时,把业务数据存到映射目录里,也就存到了宿主机上。这样如果容器出现故障,只要把故障容器删除,重新启动新的容器,把目录映射给新的容器就可以了。

pxc技术运行在docker容器里,无法直接使用映射目录。

如果采用映射目录给pxc容器,pxc容器启动时会闪退,需要采用另一种映射技术,也就是docker卷。


创建docker卷1: docker volume create v1
查看: docker inspect v1
删除命令是docker volume rm v1

创建docker卷2: docker volume create v2
创建docker卷3    docker volume create v3
创建docker卷4: docker volume create v4
创建docker卷5: docker volume create v5
 

4.启动PXC容器实例

启动pxc容器实例1
(pxc容器启动很快,但内部的mysql初始化需要时间,最好使用navicat链接成功之后再去创建第二个pxc容器实例,

   若pxc容器1的mysql没初始化完成就创建容器2,容器2会闪退

docker run -d -p 3307:3306 
-e MYSQL_ROOT_PASSWORD=123456 
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456 
-v v1:/var/lib/mysql 
--privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

参数说明:

docker run               运行容器的命令

-d                             指后台运行容器;

-P 3307:3306           指端口映射,将容器内部的3306端口映射到主机的3307端口

-e MYSQL_ROOT_PASSWORD=123456      创建出的MySQL实例的密码,可以自定义

-e CLUSTER_NAME=PXC                             创建出的pxc集群的名字,可以自定义

-e XTRABACKUP_PASSWORD=123456       数据库节点之间同步所使用到的名字,可以自定义

--privileged             给予容器最高的权限

--name=node1       给容器起名为node1

--net=net1              使用内部网段net1

--ip 172.18.0.2        内部网段分配的ip为172.18.0.2

pxc                          镜像的名称

运行如图: 

启动pxc容器实例2

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc

注意:启动后几个pxc容器和启动第一个pxc容器时的命令有所不同,谨慎避坑:

1)-p  3308:3306     指将容器的3306端口映射到宿主机的3308端口,因宿主机的3307端口已被容器node1所映射被占用,因此+1

2) -e CLUSTER_JOIN=node1    指此容器与容器node1进行同步

3)-v v2:/var/lib/mysql            当前pxc的第二个容器使用第二个docker卷,即v2

4)--name=node2                   给当前容器起名node2

5)--ip 172.18.0.3                     第一个容器node1分配的ip地址为172.18.0.2,此处给node2分配一个不相同的ip地址

运行如图:

启动pxc容器实例3

docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc

启动pxc容器实例4

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc

启动pxc容器实例5

docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

测试pxc集群搭建成功:

在DB1新建一个test数据库,新建student表:

刷新DB5,可以看到DB5中也已经有了test数据库以及表和内容:

发布了25 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41570691/article/details/104217451