Docker创建MYSQL集群

488 阅读5分钟

常见MySql集群方案

1. 方案介绍

2. PXC原理

- 建议PXC使用PerconaServer(Mysql改进版,性能提升很大)

3. PXC方案与Replication方案的对比

PXC的数据强一致性

  • 同步复制,事务在所有集群节点要么同时提交,要么不提交
  • Replication采用异步复制,无法保证数据的一致性

4. 创建PXC镜像

建议是5.7.21版本PXC镜像

docker pull percona/percona-xtradb-cluster:5.7.21
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
docker rmi percona/percona-xtradb-cluster:5.7.21

5. PXC安装步骤介绍

  1. docker pull percona/percona-xtradb-cluster:5.7.21
  2. 修改名字: docker tag docker.io/percona/percona-xtradb-cluster pxc
  3. 删除之前下载的镜像:docker rmi percona/percona-xtradb-cluster
  • 出于安全考虑,需要给PXC集群实例创建Docker内部网络
docker network create --subnet=172.18.0.0/24 net1
docker network inspect net1
docker network rm net1
docker network ls
  • PXC是运行在Docker容器中,无法直接使用映射的目录,需要创建Docker卷
docker volume create --name v1
docker inspect v1
docker volume rm v1
  • 只需要向PXC镜像传入运行参数就能创建出PXC容器
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=a111111
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=abc123456
--privileged --name=node1 --net=net1 --ip 172.18.0.2
pxc
  • 综合示例,创建5个mysql实例
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

6. 数据库负载均衡

  • 介绍

  • 负载均衡中间件对比

  • 安装Haproxy镜像

Docker仓库中保存了Haproxy的镜像,只需下载

docker pull haproxy
  • 创建Haproxy配置文件,点击 参考
touch /home/soft/haproxy.cfg
  • 创建Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
  • 进入刚刚建立的h1
docker exec -it h1 bash
  • 然后就会进入haproxy,执行:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  • 在mysql中新建一个用户,为了haproxy做心跳检测使用
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
  • 访问后台

http://ip:4001/dbs

  • 关闭mysql任意节点
docker stop node1

7. Haproxy双机热备方案

  • 双机热备步骤
  1. keepalived必须要安装在Haproxy所在的容器内
  • 安装vim
apt install vim
  • 修改ubuntu的apt-get 默认源为163.mirror 源
vim /etc/apt/sources.list
apt-get update
apt-get install keepalived
vim /etc/keepalived/keepalived.conf
  • keepalived.conf内容如下
vrrp_instance  VI_1 {
    #keepalived的身份(MASTER主服务,BACKUP备服务器)。主服务要抢占虚拟IP,备用服务器不会抢占IP
    state  MASTER
    #网卡,注意要和ifconfig里的网卡对应
    interface  ens0
    #虚拟路由标识,MASTER和BACKUP的虚拟路由标示必须一致。标识可以是0~255
    virtual_router_id  51
    #MASTER权重要高于BACKUP数字越大优先级越高
    priority  100
    #MASTER与BACKUP节点间同步检测的时隔间隔,单位为秒。主备之间必须一致
    advert_int  1
    #主从服务器验证发誓。主备必须使用相同的密码才能正常通信
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    #虚拟IP地址。可以设置多个虚拟IP地址,每行一个
    virtual_ipaddress {
        172.18.0.201
    }
}
  • 启动Keepalived之后,宿主机可以Ping通虚拟IP
//ifconfig 
apt install net-tools       
//ping
apt install iputils-ping 
//启动keepalived
service keepalived start
  • 宿主机上安装keepalived
yum install -y keepalived
  • 修改宿主机上的keepalived.conf
vim /etc/keepalived/keepalived.conf
service keepalived start
  • iptables的配置,这块是个坑,我研究了一天
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 10.211.55.1/255 -j ACCEPT #同意内网的访问所有
-A INPUT -p vrrp -j ACCEPT  #同意keepalived的数据包
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

记住,保存完,要执行:service iptables save,然后在执行:service iptables restart

  • 为了保证虚拟机重启,PXC恢复保证网络正常,需要配置如下
vim /etc/sysctl.conf
systemctl restart network

8. 数据库备份

种类:冷备份和热备份

  1. 冷备份
  • 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
  • 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择

2. 热备份

  • 热备份是在系统运行的状态下备份数据,也是难道最大的备份
  • MYSQL常见的人备份又LVM(缺陷:备份数据库时候,需要对数据库进行加锁,只能进行读操作)和XtraBackup俩种方案
  1. XtraBackup的使用
  1. 创建数据卷
docker volume create backup
  1. 因为之前已经创建了node1,现在要删除,重新创建
docker volume create backup
docker stop node1
docker rm node1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged -e CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc
  • 全备使用
  1. 进入node1
apt-get update
apt-get install percona-xtrabackup-24
  1. 全量备份的指令
innobackupex --user=root --password=a111111 /data/backup/full
  • 数据备份还原
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
docker volume rm v1 v2 v3 v4 v5
docker volume create v1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=a111111 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged -e CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc
docker exec -it node1 bash
rm -rf /var/lib/mysql/*

把没有提交的事务回滚一下

innobackupex --user=root --password=a111111 --apply-back /data/backup/full/2019-10-02_05-56-30/

执行冷还原

innobackupex --user=root --password=a111111 --copy-back /data/backup/full/2019-10-02_05-56-30/