1.拉取pxc镜像
  docker pull percona/percona-xtradb-cluster
2.如果嫌弃名称太长,修改镜像名称(可不做这一步)
  docker tag percona/percona-xtradb-cluster pxc
删除原始镜像
  docker rmi percona/percona-xtradb-cluster
3.创建docker内部网络
  docker swarm init --advertise-addr 192.168.0.101
  如果是单台服务器,需要根据宿主机的网卡,创建子网段
  docker network create --subnet=172.18.0.0/24 pxcNetwork
  如果是多台服务器,创建一个overlay类型的network
  docker network create --driver overlay --attachable pxcNetwork
  这里必须要加上--attachable,否则后面运行pxc集群时,会报错XXX not manually attachable.
  attachable的作用是:默认情况下。overlay生效的返回是在dockerswarm集群中,如果想要单独拿出来用的话,没有在这个集群中创建的话,就需要加这个单词。
  这个时候我们去我们另外一台主机上看,发现也会自动同步一个overlay网络
  查看pxc-network网段信息
  docker inspect pxcNetwork
  删除pxc-network
  docker network rm pxcNetwork
4.创建数据卷
  因为pxc不支持映射目录,所以采用映射卷的方式
  docker volume create pxcNode1Vol
  docker volume create pxcNode2Vol
  docker volume create pxcNode3Vol
5.创建pxc容器
  这里最好先把备份数据的数据卷创建出来,然后映射到宿主机,这样以后做热备份的时候就不用删掉容器节点重新再创建容器并映射备份目录了
  docker volume create pxcNode1Backup
  docker volume create pxcNode2Backup
  docker volume create pxcNode3Backup
  docker volume create pxcNode1Conf
  docker volume create pxcNode2Conf
  docker volume create pxcNode3Conf
  创建第一个节点:
  这里要注意,一定要等到第一个节点创建并通过客户端连接成功,才能继续创建其它节点,否则因为找不到node1同步库,其它节点创建时会闪退
  命令行参数说明:端口3306,密码123456,集群名称pxc,xtrabackup同步数据密码123456,映射数据目录到宿主机的pxcNode1Vol数据卷,权限为最高权限,名称pxcNode1,网段pxcNetwork,ip指定为172.18.0.2,运行的镜像是pxc
  单节点:
  docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -v /etc/localtime:/etc/localtime -v pxcNode1Conf:/etc/mysql -v pxcNode1Vol:/var/lib/mysql -v     pxcNode1Backup:/data --privileged --name=pxcNode1 --net=pxcNetwork --ip 172.18.0.2 pxc
  多节点:
  docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -v /etc/localtime:/etc/localtime -v pxcNode1Conf:/etc/mysql -v pxcNode1Vol:/var/lib/mysql -v pxcNode1Backup:/data --privileged --name=pxcNode1 --net=pxcNetwork pxc --wsrep-new-cluster
  创建第二个节点
  单节点:
  docker run -d --restart=always -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode2Conf:/etc/mysql -v pxcNode2Vol:/var/lib/mysql -v pxcNode2Backup:/data --privileged --name=pxcNode2 --net=pxcNetwork --ip 172.18.0.3 pxc
  多节点:
  docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode2Conf:/etc/mysql -v pxcNode2Vol:/var/lib/mysql -v pxcNode2Backup:/data --privileged --name=pxcNode2 --net=pxcNetwork pxc
  docker stop pxcNode2
  scp /var/lib/docker/volumes/pxcNode1Vol/_data/ca.pem client-cert.pem client-key.pem server-cert.pem server-key.pem root@192.168.0.102:/var/lib/docker/volumes/pxcNode2Vol/_data/
  docker restart pxcNode2
  创建第三个节点
  单节点:
  docker run -d --restart=always -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode3Conf:/etc/mysql -v pxcNode3Vol:/var/lib/mysql -v pxcNode3Backup:/data --privileged --name=pxcNode3 --net=pxcNetwork --ip 172.18.0.4 pxc
  多节点:
  docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode3Conf:/etc/mysql -v pxcNode3Vol:/var/lib/mysql -v pxcNode3Backup:/data --privileged --name=pxcNode3 --net=pxcNetwork pxc
  docker stop pxcNode3
  scp /var/lib/docker/volumes/pxcNode1Vol/_data/ca.pem client-cert.pem client-key.pem server-cert.pem server-key.pem root@192.168.0.103:/var/lib/docker/volumes/pxcNode3Vol/_data/
  docker restart pxcNode3
6.验证pxc集群
  坑:
  6.1 使用swarm 新建集群时遇到双网卡,未指定IP 报以下错误
  Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on interface ens33 (fd00:6868:6868::4aa and fd00:6868:6868:0:8b60:8e8c:a03:2b64) - specify one with --advertise-addr
  或
  Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth1) - specify one with --advertise-addr
  原因:由于有两个IP,集群不知道使用哪个所以报错。
  解决:解决方法报错信息已经给出提示,使用--advertise-addr 指定IP
  docker swarm init --advertise-addr 192.168.0.101
  docker swarm join --token SWMTKN-1-5w21gu9o2yrg7ezu7nxdaj4vz5i34o7o58gzf5imznk80wy8xg-1idv7v7cwg36fdv3in19p1jfn 192.168.0.101:2377
 
  6.2 初始主节点宕机后正确的启动方式
  说明:pxc1宕机后,集群正常运行,会选举出新的主节点。如果修改参数safe_to_bootstrap=1以最开始pxc1为主节点创建启动pxc1的命令那么会分裂新的集群,毫无意义。
  解决方案一:
  1、删除v1卷下的grastate.dat文件
  2、删除pxc1容器。
  3、新建pxc1容器,并加入其它任何一个正常运行的节点,如pxc2
  4、因为复用v1数据卷,以此方式创建容器,只需在原pxc1宕机前已有的数据与其它节点做增量同步,效率高。
  docker rm pxc1
  docker run ‐d ‐p 3306:3306 ‐e MYSQL_ROOT_PASSWORD=ddd123456 ‐e CLUSTER_NAME=PXC ‐e XTRABACKUP_PASSWORD=ddd123456 ‐e CLUSTER_JOIN=pxc2 ‐v v1:/var/lib/mysql ‐‐privileged ‐‐name=pxc1 pxc
  重点:‐e CLUSTER_JOIN=pxc2
  解决方案二:
  1、创建全新的pxc4节点,形成一个pxc2、pxc3、pxc4的新集群。
  2、新建pxc4容器,端口3009。并加入其它任何一个正常运行的节点,如pxc2,做全量数据同步。
  #创建v4卷
  docker volume create ‐‐name v4
  docker run ‐d ‐p 3309:3306 ‐e MYSQL_ROOT_PASSWORD=ddd123456 ‐e CLUSTER_NAME=PXC ‐e XTRABACKUP_PASSWORD=ddd123456 ‐e CLUSTER_JOIN=pxc2 ‐v v4:/var/lib/mysql ‐‐privileged ‐‐name=pxc4 pxc