- 安装docker
- 安装PXC镜像
docker pull percona/percona-xtradb-cluster
- 本地安装PXC镜像
docker load < /home/soft/pxc.tar.gz
- 查看docker安装的镜像
docker images
- 修改镜像名称
docker tag percona/percona-xtradb-cluster pxc
- 删除镜像
docker rmi percona/percona-xtradb-cluster
- 给PXC集群实例创建docker内部网络
docker network net1
- 查看
docker inspect net1
- 删除
docker rm net1
- 创建网段
docker network create --subnet=172.18.0.0/24 net1
- 查看网段
docker inspect net1
- 删除网段
docker network rm net1
- 容器中的PXC节点映射数据目录的解决方案
数据券v1
docker volume create --name v1
- 查看数据券
docker inspect v1
- 删除数据券
docker volume rm v1
- 创建PXC容器
-d 后台运行
-p端口映射
3306:3306 数据机的端口L:容器端口
-v路径的映射
-e 启动参数
--privileged 最高权限
-e CLUSTER_JOIN 加入集群
- 主容器
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=sqlpass -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=sqlpass --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
- 副容器
docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=sqlpass -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=sqlpass -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
负载均衡配置
- 安装Haproxy镜像
docker pull haproxy
- 创建Haproxy配置文件,宿主机
touch /home/soft/haproxy/haproxy.cfg
配置文件详情参考
https://zhangge.net/5125.html
global
#日志文件,使用rsyslog服务中local5日志设备(var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
#7层 http;4层tcp 如果要让haproxy支持虚拟主机,mode 必须设为http
mode http
#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 admin:admin
#数据库负载均衡
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 MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.3:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
- 创建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
- 进入容器
docker exec -it h1 bash
- 启动容器,加载容器内的配置文件
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 在主数据库创建haproxy数据库账号
create user 'haproxy'@'%' IDENTIFIED BY '';
- 在游览器登录haproxy监控页面
192.168.99.4001/dbs - 关闭数据节点
docker stop node1
- 通过haproxy随机连接到任意数据库节点 4002端口
负载均衡的高可用配置
- 安装Keepalived
Keepalived必须要安装在Haproxy所在的容器之内
- 进入Haproxy容器
docker exec -it h1 bash
- 安装Haproxy
apt-get update
apt-get install keepalived
- 退出容器
exit
keepalived的配置文件是 /etc/keepalived/keepalived.conf
在容器内安装vim
apt-get install vim
vim /etc/keepalived/keepalived.conf
keepalived配置文件
vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass sqlpass
}
virtual_ipaddress{
172.18.0.201
}
}
state 是keepalived的身份(MASTER主服务,BACKUP备服务器)。主服务要抢占虚拟IP,备用服务器不会抢占IP
interface 网卡设备
virtual_router_id 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是 0 ~ 255
priority 权重
advert_int 心跳检测秒,MASTER与BACKUP节点间同步检查的时间间。主备之间必须一致。
authentication 主从服务器验证方式。主备必须使用相同的密码才能正常通信
virtual_ipaddress 虚拟IP地址,可以设置多个虚拟IP地址,每行一个
- 启动keepalived
service keepalived start
宿主机可以ping通虚拟IP
ping 172.18.0.201
- 全量数据热备份和全量数据冷还原
- 创建数据券
docker volume create backup
- 选择数据节点映射数据券
- 先停止节点
docker stop node1
- 删除node1重新创建
docker rm node1
- 创建node1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=sqlpass -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=sqlpass -v v1:/var/lib/mysql -v backup:/data --privileged -e CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc
- PXC容器中安装XtraBackup,并执行备份
进入节点
docker exec -it node1 bash
执行
apt-get update
apt-get install percona-xtrabackup-24
全量备份
innobackupex --user=root --password=sqlpass /data/backup/full
容器内备份数据
/data/backup/full
退出容器
exit
查看数据券目录
docker inspect backup
进入备份目录
- 数据库可以热备份,但是不能热还原。为了避免恢复过程中的数据同步,采用空白的mysql还原数据,然后再建立PXC集群
- 冷还原数据,还原数据前要将未提交的事物回滚,还原数据之后重启mysql
- 指令
rm -rf /var/lib/mysql/*
事务回滚
innobackupex --user=root --password=sqlpass --apply-back /data/backup/full/2018-04-15_05-09-07/
全量数据冷还原
innobackupex --user=root --password=sqlpass --copy-back /data/backup/full/2018-04-15_05-09-07/
- 具体冷还原流程
停止所有PXC节点
docker stop node1 node2
删除所有PXC节点
docker rm node1 node2
删除映射的数据券
docker volume rm v1 v2
创建新的数据券v1
docker volume create v1
启动一个PXC节点
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=sqlpass -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=sqlpass -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
进入node1节点
docker exec -it node1 bash
执行冷还原命令
rm -rf /var/lib/mysql/*
事务回滚
innobackupex --user=root --password=sqlpass --apply-back /data/backup/full/2018-04-15_05-09-07/
全量数据冷还原
innobackupex --user=root --password=sqlpass --copy-back /data/backup/full/2018-04-15_05-09-07/
退出容器重启节点
exit
docker stop node1
docker start node1