基于Docker搭建Mysql PXC高可用集群

MacOS安装Docker

参考 Docker-for-Mac-安装篇

查看镜像与容器列表

1
2
3
4
5
6
// 查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
// 查看容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

下载镜像

percona/percona-xtradb-cluster

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//下载并安装镜像
$ docker pull percona/percona-xtradb-cluster
Using default tag: latest
latest: Pulling from percona/percona-xtradb-cluster
f189db1b88b3: Pull complete
9e1c2123ed31: Pull complete
07615226c253: Pull complete
8ad22a1d8e5f: Pull complete
46e87caabbff: Pull complete
a0468929dd0f: Pull complete
807a07791f97: Pull complete
1ac4932ab683: Pull complete
a1c4e4de9f61: Pull complete
173fcb84e609: Pull complete
7bf1b94de522: Pull complete
18b6f7e0990a: Pull complete
9504daff64f5: Pull complete
8605107294b6: Pull complete
Digest: sha256:b82b2b6f86016ed43af4d58371da4dd3ade5b036c607b98e2334c7649a2241ee
Status: Downloaded newer image for percona/percona-xtradb-cluster:latest
//查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
percona/percona-xtradb-cluster latest 7ad1b9c338b6 3 weeks ago 413MB
//更改好记的名称
$ docker tag percona/percona-xtradb-cluster pxc
//删除原镜像
$ docker rmi percona/percona-xtradb-cluster
Untagged: percona/percona-xtradb-cluster:latest
Untagged: percona/percona-xtradb-cluster@sha256:b82b2b6f86016ed43af4d58371da4dd3ade5b036c607b98e2334c7649a2241ee
//再次查看
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pxc latest 7ad1b9c338b6 3 weeks ago 413MB

创建内部网络(容器内网络传输)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 创建名称为pxc-net的网络,注意制定的IP网段,不设置默认会创建
$ docker network create --subnet=10.88.0.0/24 pxc-net
28c46b679050cb9a9be1bee8f3c31b29f763aa2f9c64897461190002567c8269
// 查看
$ docker inspect pxc-net
[
{
"Name": "pxc-net",
"Id": "28c46b679050cb9a9be1bee8f3c31b29f763aa2f9c64897461190002567c8269",
"Created": "2018-10-24T07:22:36.0202182Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.88.0.0/24"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

创建Docker卷

尽量不要把数据保存在容器内,可以把业务数据映射到宿主机目录,这里pxc这种技术无法直接使用映射到目录,会导致闪退,所以这里创建Docker卷 来曲线解决,宿主机可以访问到Docker卷,而卷在容器内访问是完全没有障碍的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ docker volume create --name mysql-1
mysql-1
//一口气创建三个卷 mysql-1 mysql-2 mysql-3
//查看其中的一个mysql-1结构
$ docker volume inspect mysql-1
[
{
"CreatedAt": "2018-10-24T07:33:40Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mysql-1/_data",
"Name": "mysql-1",
"Options": {},
"Scope": "local"
}
]

创建容器

这是第一个容器

  • mysql-1 不用说,这是Docker卷名称
  • pxc-net-1 第一个节点名称
  • pxc-net 网段名称
  • pxc 镜像名称
1
$ docker run -d -p 33061:3306 -v mysql-1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=pxc-node-1 --net=pxc-net --ip 10.88.0.2 pxc

这是第②③个容器

  • CLUSTER_JOIN 关联到第一个容器创建的节点
  • 其他对比第一个容器
1
2
3
4
5
6
7
8
9
10
$ docker run -d -p 33062:3306 -v mysql-2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=pxc-node-1 -e XTRABACKUP_PASSWORD=123456 --privileged --name=pxc-node-2 --net=pxc-net --ip 10.88.0.3 pxc

$ docker run -d -p 33063:3306 -v mysql-3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=pxc-node-1 -e XTRABACKUP_PASSWORD=123456 --privileged --name=pxc-node-3 --net=pxc-net --ip 10.88.0.4 pxc

//查看容器列表
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be7ca9d250c7 pxc "/entrypoint.sh " 7 seconds ago Up 6 seconds 4567-4568/tcp, 0.0.0.0:33063->3306/tcp pxc-node-3
de241ae6e961 pxc "/entrypoint.sh " 15 seconds ago Up 14 seconds 4567-4568/tcp, 0.0.0.0:33062->3306/tcp pxc-node-2
c92299be8733 pxc "/entrypoint.sh " 44 seconds ago Up 43 seconds 4567-4568/tcp, 0.0.0.0:33061->3306/tcp pxc-node-1

连接Mysql

连接三个容器中的mysql

  • user: root
  • password: 123456

QQ20181024-161714@2x.png

梳理下流程

首先mysql-1创建了一个节点pxc-node-1,然后msyql-2,mysql-3加入到了pxc-node-1节点中,现在的场景是这样的,在任意的容器中的mysql进行sql操作,就会同步到集群中所有的节点,注意,是完全是一致性同步,所谓一致性,是指集群中任何一个数据不一致,sql的写入更新操作就会拒绝

1
2
// 在msyql-1中执行创建数据库
create database datas;

刷新后,所有节点都会同步

QQ20181024-164234@2x.png

接着我在mysql-2中创建数据表并写入数据,同样所有的节点的数据都会同步

1
2
3
4
5
6
7
$ USE datas;
$ CREATE TABLE data
(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(200),
number int(10)
);

QQ20181024-165019@2x.png

除了一致性外,PXC的特性还在于,我们其中一个节点崩溃了,但是不会影响其他节点的使用

1
2
3
4
5
6
7
8
9
10
// 停掉pxc-node-2
$ docker stop pxc-node-2
//查看
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be7ca9d250c7 pxc "/entrypoint.sh " About an hour ago Up About an hour 4567-4568/tcp, 0.0.0.0:33063->3306/tcp pxc-node-3
de241ae6e961 pxc "/entrypoint.sh " About an hour ago Exited (137) 11 seconds ago pxc-node-2
c92299be8733 pxc "/entrypoint.sh " About an hour ago Up About an hour 4567-4568/tcp, 0.0.0.0:33061->3306/tcp pxc-node-1
// 停止后,再从mysql-3写入数据,这个时候mysql-1同步正常
// 再启动pxc-node-2节点,mysql-2重新又会成功同步数据

以上是集群的部署,接下来一篇进行负载均衡的部署