一、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 状态
