mysql多主集群使用percona-xtradb-cluster搭建

459 阅读6分钟

所有软件都是使用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%';