Docker 实战 - 搭建 Percona XtraDB Cluster MySQL

2,128 阅读7分钟

一、PXC

1、拉取镜像

  • docker pull percona/percona-xtradb-cluster:5.7.21
  • docker images 查看一下 :会有 percona/percona-xtradb-cluster 这样一个 Images
  • 我们每次运行的时候,要输入 Image 的名字,这个太长了,我们可以使用 tag 给他打个标签,方便使用
  • docker tag percona/percona-xtradb-cluster:5.7.21 pxc
  • 然后 docker images 会发现有一个 pxc 的 image ,这样启动就方便多了
  • 可以将之前的删除 : docker rmi -f percona/percona-xtradb-cluster:5.7.21

2、设置网络

  1. 首先创建一个网络专门给 pxc 进行使用

    docker network create --subnet=172.18.0.0/24 pxc-net

  2. 执行 docker network ls 查看我们创建好的网络信息
    [root@10-9-172-# ~]# docker network ls
        NETWORK ID          NAME                DRIVER              SCOPE
        27a949f991be        bridge              bridge              local
        5208f058b881        host                host                local
        15d921cb72fb        none                null                local
        6642933850f3        pxc-net             bridge              local
        // 最后一个就是我们创建的那个,默认是桥接模式
    

3、持久化存储

  1. 创建三个 volume 给容器使用

    [root@10-9-172-# ~]# docker volume create --name v1
    v1
    [root@10-9-172-# ~]# docker volume create --name v2
    v2
    [root@10-9-172-# ~]# docker volume create --name v3
    v3
    
  2. 执行 docker volume ls 进行检查

     [root@10-9-172-# ~]# docker volume ls
         DRIVER              VOLUME NAME
         local               v1
         local               v2
         local               v3
         // 或者执行 docker volume inspect v1 进行查看详情
         [root@10-9-172-# ~]# docker volume inspect v1
         [
             {
                 "CreatedAt": "2020-05-16T14:41:56+08:00",
                 "Driver": "local",
                 "Labels": {},
                 "Mountpoint": "/var/lib/docker/volumes/v1/_data",
                 "Name": "v1",
                 "Options": {},
                 "Scope": "local"
             }
         ]
    

4、创建容器

  1. 创建容器

    docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc
            -e XTRABACKUP_PASSWORD=stg20150529 --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc
            
            -d :运行
            -v :执行 volume
            -p :映射端口
            -e :
                  MYSQL_ROOT_PASSWORD :数据库密码
                  CLUSTER_NAME :集群名称
                  XTRABACKUP_PASSWORD :数据备份密码
            --privileged :指定最高优先级
            --net :指定要使用的网络
            --ip :指定 ip 地址
    
  2. 执行 docke ps 查看

    [root@10-9-172-# ~]# docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 --net=pxc-net --privileged --ip 172.18.0.2 --name node1 pxc
    2026950f1615712c6d11cbe6b407bb316b5597c033fcb8c0702b0db7a697f6fd
    [root@10-9-172-# ~]# docker ps
    CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                   NAMES
    2026950f1615        pxc                       "/entrypoint.sh "        3 seconds ago       Up 1 second         4567-4568/tcp, 0.0.0.0:3301->3306/tcp   node1
    
  3. 创建 node2 和 node3

    [root@10-9-172-# ~]# docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 --net=pxc-net --privileged --ip 172.18.0.3 --name node2 pxc
    f1132dbdbb8a40a6496ef5927de2c297a71fca075563e88cd41278b746150d29
    [root@10-9-172-# ~]# docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 --net=pxc-net --privileged --ip 172.18.0.4 --name node3 pxc
    808bfac2248126c6eaf8a42ce54f805ead68b519edddb4a8c8cb82178a71614a
    [root@10-9-172-# ~]# docker ps 
    CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                   NAMES
    808bfac22481        pxc                       "/entrypoint.sh "        4 seconds ago       Up 3 seconds        4567-4568/tcp, 0.0.0.0:3303->3306/tcp   node3
    f1132dbdbb8a        pxc                       "/entrypoint.sh "        22 seconds ago      Up 21 seconds       4567-4568/tcp, 0.0.0.0:3302->3306/tcp   node2
    2026950f1615        pxc                       "/entrypoint.sh "        2 minutes ago       Up 2 minutes        4567-4568/tcp, 0.0.0.0:3301->3306/
    

5、验证

  1. 通过 naticat 进行连接

  1. 在 node1 中创建一个 db_test 库

  1. 查看 node2 和 node3 发现并没有进行同步

哈哈哈,因为我们并没有设置他们之间的关系.那么,我们先把之前创建好的删除掉

6、形成集群关系

[root@10-9-172-32 ~]# docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 --net=pxc-net --privileged --ip 172.18.0.2 --name node1 pxc
2026950f1615712c6d11cbe6b407bb316b5597c033fcb8c0702b0db7a697f6fd

[root@10-9-172-32 ~]# docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 -e CLUSTER_JOIN=node1 --net=pxc-net --privileged --ip 172.18.0.3 --name node2 pxc
f1132dbdbb8a40a6496ef5927de2c297a71fca075563e88cd41278b746150d29

[root@10-9-172-32 ~]# docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=stg20150529 -e CLUSTER_NAME=pxc -e XTRABACKUP_PASSWORD=stg20150529 -e CLUSTER_JOIN=node1 --net=pxc-net --privileged --ip 172.18.0.4 --name node3 pxc
808bfac2248126c6eaf8a42ce54f805ead68b519edddb4a8c8cb82178a71614a

pxc 提供了一个 CLUSTER_JOIN 的参数,我们需要在 node2 和 node3 执行 CLUSTER_JOIN = node1

接着我们刷新 navicat ,可以看到

数据进行了同步,至此 pxc 的搭建就完成了

二、HaProxy

我们搭建好了 pxc 之后,每次访问的是哪个数据库,我们可以通过 haproxy 进行路由,类似 nginx 这种,如果 node1 资源不是很多了,我们将请求分发到 node2 或者 node3 当中, 老样子,我们通过 hub.docker.com 找到 haporxy 的 image 并 pull 下来

1、拉取镜像

[root@10-9-172-# ~]# docker images
REPOSITORY                                                    TAG                 IMAGE ID            CREATED             SIZE
haproxy                                                       latest              6600fae04efd        13 hours ago        92.4MB

2、创建一个配置文件的目录,映射到 container 中

mkdir -p /tmp/haproxy
touch haproxy.cfg
vi haproxy.cfg

global
	#工作目录,这边要和创建容器指定的目录对应
	chroot /usr/local/etc/haproxy
	#日志文件
	log 127.0.0.1 local5 info
	#守护进程运行
	daemon

defaults
	log	global
	mode	http
	#日志格式
	option	httplog
	#日志中不记录负载均衡的心跳检测记录
	option	dontlognull
 	#连接超时(毫秒)
	timeout connect 5000
 	#客户端超时(毫秒)
	timeout client  50000
	#服务器超时(毫秒)
 	timeout server  50000

    #监控界面	
    listen  admin_stats
	#监控界面的访问的IP和端口
	bind  0.0.0.0:8888
	#访问协议
 	mode        http
	#URI相对地址
 	stats uri   /dbs_monitor
	#统计报告格式
 	stats realm     Global\ statistics
	#登陆帐户信息
 	stats auth  admin:admin
	#数据库负载均衡
	listen  proxy-mysql
	#访问的IP和端口,haproxy开发的端口为3306
 	#假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例
	bind  0.0.0.0:3306  
 	#网络协议
	mode  tcp
	#负载均衡算法(轮询算法)
	#轮询算法:roundrobin
	#权重算法:static-rr
	#最少连接算法:leastconn
	#请求源IP算法:source 
 	balance  roundrobin
	#日志格式
 	option  tcplog
	#在MySQL中创建一个没有权限的haproxy用户,密码为空。
	#Haproxy使用这个账户对MySQL数据库心跳检测
 	option  mysql-check user haproxy
	server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
 	server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
	server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
	#使用keepalive检测死链
 	option  tcpka

3、启动容器

[root@10-9-172-# haproxy]# docker run -d -p 3306:3306 -p 8888:8888 -v /tmp/haproxy:/usr/local/etc/haproxy --name haproxy01 --net=pxc-net  --privileged haproxy
8834dec3d0f32f95d643b304617ec053b6e4a8656782ae00e1da0ce114985e3c

[root@10-9-172-# haproxy]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                            NAMES
8834dec3d0f3        haproxy                   "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds        0.0.0.0:3306->3306/tcp, 0.0.0.0:8888->8888/tcp 

4、查看监控页面

  1. 查看监控页面

http://host:port/dbs_monitor
密码帐号密码是:admin/admin

我们可以发现 MYSQL 几个节点都是红色的,需要在容器内部进行启动

  1. 启动
root@8834dec3d0f3:/usr/local/etc/haproxy# haproxy -f /usr/local/etc/haproxy/haproxy.cfg 
root@8834dec3d0f3:/usr/local/etc/haproxy# 
  1. 用户授权
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
flush privileges;

这样,我们就可以使用 navicat 进行连接了,同时,我们监控页面的 MYSQL 3个夜店也都变味了 active up 状态