docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原

MySQL常见的两种搭建集群的方法

docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第1张图片

pxc优点

  1. 实现mysql数据库集群架构的高可用性和数据的 强一致性。
  2. 完成了真正的多节点读写的集群方案
  3. 改善了传统意义上的主从复制延迟问题,基本上达到了实时同步。
  4. 新加入的节点可以自动部署,无须提供手动备份,维护起来很方便。
  5. 由于是多节点写入,所以数据库故障切换很容易

pxc缺点

1.新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。

2.任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于性能最差的节点,也就是经常说的短板效应。

3.因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。

4.存在写扩大问题,所有的节点上都会发生些操作。

5.只支持innodb存储引擎的表。

6.没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议 使用Osc操作,即在线DDL)

7.所有的表必须含有主键,不然操作数据时会报

一 常见pxc三节点集群

1.拉取pxc镜像

docker pull percona/percona-xtradb-cluster:5.7.22

2.修改镜像名字为pxc

docker tag percona/percona-xtradb-cluster:5.7.22 pxc

docker image ls 查看我们拉取的镜像
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第2张图片

3.创建网络

我docker默认的网络是
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第3张图片
我们创建一个172.18.0网段的以示区别
net1网络
docker network create --subnet=172.18.0.0/24 net1

查看net1网络信息
docker inspect net1
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第4张图片

4.创建volume数据卷

存储node1里mysql数据
docker volume create v1
存储node2里mysql数据
docker volume create v2
存储node3里mysql数据
docker volume create v3
后面热备用
docker volume create backup

查看创建的数据包卷
docker volume ls

5.创建pxc容器

创建node1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

创建node2
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc

创建node3
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc

命令详解:

-d 后台启动

-p 3306:3306 端口映射

-e MYSQL_ROOT_PASSWORD=abc123456   指定数据库密码

-e CLUSTER_NAME=PXC 指定集群名称

-e XTRABACKUP_PASSWORD=abc123456 指定集群之间同步需要的密码

-v v1:/var/lib/mysql 把刚刚创建的数据卷挂载到mysql中

--name=node1 指定容器名称(当前我们把node1作为主节点、后面会创建node2)

--net=net1 指定网段

--ip=172.18.0.2 指定ip 

(在node2   node3 上)
-e CLUSTER_JOIN=node1  指定与哪个节点进行数据同步

其他同上

docker ps 查看node1 node2 node3 是否启动
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第5张图片

在客户端访问(Navicat Premium):

node1:
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第6张图片
node2:
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第7张图片
node3:
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第8张图片
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第9张图片
测试:
node1创建一个表 node2 node3是否会同步
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第10张图片
?!

二 配置haproxy

1.下载haproxy镜像

docker pull haproxy
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第11张图片
2.宿主机创建haproxy.cfg配置文件
touch /usr/local/docker/haproxy/haproxy.cfg

global
	#工作目录
	chroot /usr/local/etc/haproxy
	#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
	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
	#统计报告格式
    stats realm     Global\ statistics
	#登陆帐户信息
    stats auth root:root
#数据库负载均衡
listen  proxy-mysql
	#访问的IP和端口
	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  node1 172.18.0.2:3306 check weight 1 maxconn 2000
    server  node2 172.18.0.3:3306 check weight 1 maxconn 2000
    server  node3 172.18.0.4:3306 check weight 1 maxconn 2000
	#使用keepalive检测死链
    option  tcpka 

haproxy.cfg 配置文件我只贴出了负载均衡相关的配置。
其中配置了
交互用户 haproxy,
监控界面 用户名/密码 地址
负载均衡server 等内容,具体参考官网

3.启动h1容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /usr/local/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy

创建h2
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy

4.进入h1 h2容器
docker exec -it h1 bash
docker exec -it h2 bash

5.启动haproxy服务:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

6、根据haproxy.cfg配置文件中、我们需要在node1数据库中创建一个haproxy用户
进入node1在node1 mysql里创建一个用户
docker exec -it node1 bash
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第12张图片
7.创建用户
create user 'haproxy'@'%' identified by '';

8.在客户端链接haproxy(Navicat Premium):
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第13张图片
数据表测试,和上面的操作一样h1 和 db1数据库中的数据一模一样,达到同步效果,当然你也可以自己在h1数据库中添加数据、看是否同步到db1,db2,db3中
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第14张图片
9.集群监控界面:http://192.168.84.135:4001/dbs
docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第15张图片
(在pxc中加入了haproxy使其达到负载均衡,在做一个haproxy服务的备份)

在haproxy里加入keepalived实现双击热备

1.进入h1容器中下载keepalived
docker exec -it h1 bash
2.更新apt-get
apt-get update
3.下载插件
apt-get install vim
apt-get install iputils-ping
apt-get install keepalived

4.编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf

vrrp_instance  VI_1 {
    state  MASTER
    interface  eth0
    virtual_router_id  51
    priority  100
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        172.18.0.201
    }
}

启动keepalived

service keepalived start

docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第16张图片
进入h2容器中重复上面h1容器里面的操作(不做演示了)

在宿主机中安装keepalived

yum install -y keepalived

编辑宿主机keepalived的配置文件
vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.84.200
    }
}

virtual_server 192.168.84.200 8888 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 172.18.0.201 8888 {
        weight 1
     }
}
virtual_server 192.168.84.200 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.201 3306 {
        weight 1
    }
}

注意宿主机上的keepalived的配置文件里的虚拟IP要在此虚拟机的网段内
配置完然后重启keepalived服务
systemctl restart keepalved

docker搭建pxc三节点集群+haproxy+keepalived (高可用+双机热备)+冷还原_第17张图片
?

热备份数据

#进入node1容器:docker exec -itu 0 node1  bash
docker exec ‐it node1 bash #更新软件包
apt‐get update #安装热备工具
apt‐get install percona‐xtrabackup‐24 #全量热备
innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full

到/data/backup/full下面看备份文件

在这里插入图片描述

冷还原数据 停止其余4个节点,并删除节点

docker stop node2
 docker stop node3
docker rm node2 
docker rm node3 

node1容器中删除MySQL的数据

#删除数据
rm ‐rf /var/lib/mysql/* #清空事务
innobackupex ‐‐user=root ‐‐password=abc123456 ‐‐apply‐back /data/backup/full/2018‐ 04‐15_05‐09‐07/
#还原数据
innobackupex ‐‐user=root ‐‐password=abc123456 ‐‐copy‐back	/data/backup/full/2018‐ 04‐15_05‐09‐07/

你可能感兴趣的:(docker)