用Docker的PXC部署多容器MySQL 高可用负载均衡部署
- 系统环境准备:安装Centos7系统;主机网络ping mirrors.aliyun.com 连通;
- 需要的安装包(指定从阿里云下载镜像包)
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker 相关
yum makecache fast 安装前,请更新yum软件包索引
yum install docker-ce docker-ce-cli containerd.io
- 启动Docker,并查看版本及验证
Systemctl start docker 启动docker
Docker version 查看版本
- 下载mysql5.7、下载percona-xtradb-cluster:5.7.20 (该版本稳定)
$ docker pull centos/mysql-57-centos7 下载mysql5.7
$ docker pull percona/percona-xtradb-cluster:5.7.20 下载PXC
$ docker tag percona/percona-xtradb-cluster:5.7.20 pxc 改名为pxc
- 创建内部网络
为 PXC 集群实例创建 Docker 内部网络 net1
#创建网段,假设创建网段172.28.0.0/24,子网掩码是24位
$ docker network create --subnet=172.28.0.0/24 --gateway=172.28.0.1 net1
$ docker network inspect net1 验证查看配置的网络信息
- 创建卷
$ docker volume create v1
$ docker volume create v2
$ docker volume create v3
$ docker volume create v4
$ docker volume create v5
$ docker volume inspect v1 验证查看配置卷的信息
- 创建第MySQL第一个主节点node1
创建mysql容器名称为node1使用pxc 镜像;将主机端口3306与容器端口3306进行映射,将
容器目录卷/var/mysql挂载到主机卷v1(/var/lib/docker/volumes/v1/_data);配置mysql的root口令、配置集群名称PXC;指定mysql集群数据同步时用的密码;配置最高优先级;指定容器名称,指定网络、 指定node1容器的IP地址;指定容器使用的镜像pxc。
$ docker run -d -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.28.0.2 pxc
***切记第一个节点初始化比较耗时一定要等第一个容器创建成功可以使用,客户端连接了才能创建第二个容器。
登录docker的node1镜像里面登录mysql:
测试如下:[root@master/] docker exec -it node1 /bin/sh
# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
#...
mysql> quit
测试成功。
*** 如果创建容器时的-e配置的MYSQL_ROOT_PASSWORD 可能没用,在docker里面登录不进去。(之前一直只能启动一个节点有可能就是这里的问题);密码可以自己改一下:
登录docker的node1镜像里面登录mysql:
[root@master/] docker exec -it node1 /bin/sh
# mysql -uroot -p
Enter password:
mysql> update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> quit;
————————————————
8.1创建其它从节点
$ docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.28.0.3 pxc
$ docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.28.0.4 pxc
$ docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.28.0.5 pxc
$ docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.28.0.6 pxc
- 使用navicat测试集群
在node1对应的数据库创建数据库zhzgDB、看其他node2、3、4、5上是否同时生成zhzgDB库。
然后再zhzgDB库中创建zhzgtb表;添加ID\NAME\ADDR字段后,再查看其他库中是否也同时生成相应的表和字段内容。
如下如:
至此,大功告成!!!