所有软件都是使用docker安装,centos7.5
172.19.95.225是阿里云服务器内网ip
my_network是我创建的docker网络
先创建3个mysql多主
注意,每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。
docker run -d --net=my_network --ip=172.19.0.203 --name=mysql_node1 -e CLUSTER_NAME=mysql_pxc -e MYSQL_ROOT_PASSWORD=123456 -e XTRABACKUP_PASSWORD=123456 percona/percona-xtradb-cluster
等1分钟
docker run -d --net=my_network --ip=172.19.0.204 --name=mysql_node2 -e CLUSTER_NAME=mysql_pxc -e MYSQL_ROOT_PASSWORD=123456 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=mysql_node1 percona/percona-xtradb-cluster
等1分钟
docker run -d --net=my_network --ip=172.19.0.205 --name=mysql_node3 -e CLUSTER_NAME=mysql_pxc -e MYSQL_ROOT_PASSWORD=123456 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=mysql_node1 percona/percona-xtradb-cluster
在数据库中创建一个haproxy的用户,不设置密码,后面会用到
create user 'haproxy'@'%' identified by '';
在/data/docker/haproxy分别创建h1 h2文件夹,和配置文件
h1 文件夹下面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 admin:123456
#数据库负载均衡
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.19.0.203:3306 check weight 1 maxconn 2000
server MySQL_2 172.19.0.204:3306 check weight 1 maxconn 2000
server MySQL_3 172.19.0.205:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
h1文件夹下keepalived.conf内容
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.19.95.225
}
}
virtual_server 172.19.95.225 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.19.0.206 8888 {
weight 1
}
}
virtual_server 172.19.95.225 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.19.0.206 3306 {
weight 1
}
}
h2文件夹下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 admin:123456
#数据库负载均衡
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.19.0.203:3306 check weight 1 maxconn 2000
server MySQL_2 172.19.0.204:3306 check weight 1 maxconn 2000
server MySQL_3 172.19.0.205:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
keepalived.conf内容
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.19.95.225
}
}
virtual_server 172.19.95.225 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.19.0.206 8888 {
weight 1
}
}
virtual_server 172.19.95.225 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.19.0.206 3306 {
weight 1
}
}
docker run -d --net=my_network --ip=172.19.0.206 --privileged -v /data/docker/haproxy/h1/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -v /data/docker/haproxy/h1/keepalived.conf:/etc/keepalived/keepalived.conf --name haproxy-keepalived1 pelin/haproxy-keepalived
docker run -d --net=my_network --ip=172.19.0.207 --privileged -v /data/docker/haproxy/h2/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -v /data/docker/haproxy/h2/keepalived.conf:/etc/keepalived/keepalived.conf --name haproxy-keepalived2 pelin/haproxy-keepalived
然后就可以通过使用172.19.95.225 端口3306 用户名root密码123456连接mysql数据库了。
数据库就会负载均衡,减轻数据库压力,percona-xtradb-cluster保证了mysql高可用。
即使有一个数据库挂了,也不影响提供服务。
haproxy网页端访问地址 http://172.19.95.225:8888/dbs 用户名 admin 密码 123456
数据库热备份使用XtrBackup,不需要停止数据库,冷备份需要停止数据库。
XtraBackup优势
备份过程不锁表,快速可靠
备份过程不会打断正在执行的事务
能够基于压缩等功能节约磁盘空间和流量
全量备份和增量备份
全量备份是备份全部数据,备份过程时间,占用空间大。
增量备份是只备份变化的那部分数据。备份时间短。占用空间小。
在正常的生产系统上,一般是一周做一次全量的备份,一小时做一次增量的备份。就足够了。
全量备份数据
#进入mysql_node1容器
docker exec -it mysql_node1 bash
#更新软件包
apt-get update
#安装热备工具
apt-get install percona-xtrabackup-24
#全量热备
innobackupex --user=root --password=123456 /data/backup/
出现completed OK!说明备份完毕。
全量恢复步骤
数据库可以热备份,但是不能热还原。为了避免恢复过程中的数据同步,我们采用空白的mysql还原数据,然后再建立PXC集群的方式。所以在开发中一定要注意权限问题,不要给开发人员root用户。
还原数据前要将未提交的事务回滚,还原数据之后重启!
先停止然后删除所有容器,启动一个容器,然后进入容器
#删除MySQL数据
rm -rf /var/lib/mysql/*
#没有提交的数据回滚
innobackupex --user=root --password=123456 --apply-back /data/backup/full/2019-03-12_15-34-25/
#执行下冷还原
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2019-03-12_15-34-25/
chown -R mysql:mysql /var/lib/mysql/
然后退出容器,重启容器,重新创建其余2个节点,组件PXC集群就好了
show global status like 'wsrep_cluster_size';
show global status like 'wsrep_incoming_addresses';
比较重要的参数状态
show status like 'wsrep%';