第04章-搭建MySQL集群
大型项目的持久层都会选择数据库集群,本门课程选择的是MySQL领域中最成熟可靠的PXC(Percona XtraDB Cluster)集群方案。在本章节,我们会学习在Docker容器中划分网段,创建PXC容器和组建5节点的PXC集群。
4-1 MySQL集群方案介绍
单节点数据库的弊病
- 大型互联网程序用户群体庞大,所以架构必须要特殊设计
- 单节点的数据库无法满足性能上的要求
- 单节点的数据库没有冗余设计,无法满足高可用
单节点MySQL的性能瓶颈
- 2016年春节微信红包巨大业务量,数据库承受巨大负载
常见MySQL集群方案
Replication
速度快、弱一致性、低价值
日志、新闻、帖子
PXC
速度慢、强一致性、高价值
订单、账户、财务
PXC原理
淘宝网的数据库集群也借鉴了PXC集群方案
PXC(Percona XtraDB Cluster)
建议PXC使用PerconaServer(MySQL改进版,性能提升很大)
PXC方案与Replication方案的对比
双向同步
单向同步
PXC的数据强一致性
PXC采用同步复制,事务在所有集群节点要么同时提交,要么不提交
Replication采用异步复制,无法保证数据的一致性
STOP SLAVE;# 停止slave节点的数据库同步关联
SHOW SLAVE STATUS;# 查看slave节点的数据同步状态(Slave_IO_Running、Slave_SQL_Running)
关闭防火墙端口:
Centos防火墙使用firewall命令
Ubuntu防火墙使用iptables命令
iptables -A INPUT -p tcp -dport 4567 -j DROP
iptables -A OUTPUT -p tcp -dport 4567 -j DROP
4-2 创建MySQL集群
PXC集群安装介绍
PXC集群只能安装在Linux系统或Docker容器
Docker的镜像仓库中包含了PXC数据库镜像,下载即可
docker pull percona/percona-xtradb-cluster
安装PXC镜像
下载或者导入本地镜像
# 下载镜像安装 docker pull percona/percona-xtradb-cluster # 导入本地镜像安装 docker load < /home/soft/pxc.tar.gz
# 修改镜像名称 docker tag old_image_name new_image_name docker rmi old_image_name
创建内部网络
出于安全考虑,需要给PCX集群实例创建Docker内部网络
# 创建内部网段 docker network create network_name # 查看网段相关信息 docker network inspect network_name # 删除网段 docker network rm network_name
Docker内置网段:172.17.0.*
创建网段1:172.18.0.*
创建网段2:172.19.0.*
创建网段3:172.20.0.*
…以此类推…
创建自定义端口网段:
docker network create --subnet=172.18.0.0/24 network_name
Docker容器使用原则:
- 一旦创建出Docker容器,尽量不要在容器内保存业务数据,应将业务数据保存在宿主机里。应使用目录映射机制
- PXC运行在Docker容器是不能直接使用映射的目录,PXC容器会启动闪退。此时应使用Docker卷映射目录
创建Docker卷
容器中的PXC节点映射数据目录的解决办法
docker volume create volume_name docker volume create --name volume_name
查看Docker卷信息
docker volume inspect volume_name
删除Docker卷
docker volume rm volume_name
创建PXC容器
只需要向PXC镜像传入运行参数就能创建出PXC容器
docker run -d -p 3306:3306 -v volume_name1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password --prilileged --name=container_name --net=network_name --ip 172.18.0.2 pxc
注:
-d
:后台运行容器
创建PXC容器集群
docker volume create --name volume_name1
docker volume create --name volume_name2
docker volume create --name volume_name3
docker volume create --name volume_name4
docker volume create --name volume_name5
docker run -d -p 3306:3306 -v volume_name1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password --prilileged --name=container_name1 --net=network_name --ip 172.18.0.2 pxc
docker run -d -p 3307:3306 -v volume_name2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password -e CLUSTER_JOIN=container_name1 --prilileged --name=container_name2 --net=network_name --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -v volume_name3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password -e CLUSTER_JOIN=container_name1 --prilileged --name=container_name3 --net=network_name --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -v volume_name4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password -e CLUSTER_JOIN=container_name1 --prilileged --name=container_name4 --net=network_name --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -v volume_name5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password -e CLUSTER_JOIN=container_name1 --prilileged --name=container_name5 --net=network_name --ip 172.18.0.6 pxc
数据库客户端连接
ip:宿主机IP
port:宿主机与容器映射的端口
username:创建实例的数据库用户名(默认root)
password:创建实例的数据库密码
4-3 数据库负载均衡
数据库的负载均衡:数据请求均匀的发送给每一个数据节点
数据库负载均衡的必要性:
虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差
使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好
负载均衡中间件对比
比较 | Haproxy | Nginx | Apache | LVS |
---|---|---|---|---|
是否免费 | 免费 | 免费 | 免费 | 免费 |
支持虚拟机 | 支持 | 支持 | 支持 | 否 |
HTTP协议 | 支持 | 支持 | 支持 | 支持 |
TCP/IP协议 | 支持 | 刚刚支持 | 不支持 | 支持 |
支持插件 | 不支持 | 支持 | 不支持 | 不支持 |
性能 | 好 | 好 | 一般 | 最好 |
安装Haproxy镜像
Docker仓库中保存了Haproxy的镜像,只需下载即可
docker pull haproxy
创建Haproxy配置文件
首先在宿主机创建Haproxy的配置文件,然后将其文件映射到Haproxy的Docker容器
配置文件详情可以参考
touch /home/soft/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 Clobal\ 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.18.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000 server MySQL_5 172.18.0.6: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 container_name --privileged --net=network_name
haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
进入后台运行的Docker容器
docker exec -it container_name bash
创建没有权限的haproxy用户,密码为空
Haproxy使用这个账户对MySQL数据库心跳检测
create user 'haproxy'@'%' identified by '';
关闭数据库节点
docker stop container_name1
4-4 负载均衡的高可用方案(上)
为什么要采用双机热备?
单节点Haproxy不具备高可用,必须要有冗余设计
虚拟IP地址
虚拟IP是Haproxy双机热备方案的关键技术

利用Keepalived实现双机热备

Haproxy双机热备方案

Docker内的虚拟IP不能被外网使用,所以需要借助宿主机Keepalived映射成外网可以访问的虚拟IP
安装Keepalived
Keepalived必须要安装在Haproxy所在的容器之内
docker exec -it container_name bash # 因为Haproxy是使用Ubuntu系统创建出来的,所以此时安装Keepalived需要使用apt-get指令 apt-get update apt-get install keepalived
Keepalived配置文件
Keepalived的配置文件是
/etc/keepalived/keepalived.conf
apt-get install vim vim /etc/keepalived/keepalived.conf
vrrp_instance CONF_NAME { 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 } }
注:
CONF_NAME
:配置信息名字,可自定义state MASTER
:Keepalived的身份(MASTER主服务,BACKUP备服务器)。主服务要抢占虚拟IP,备服务器不会抢占虚拟IP。interface eth0
:网卡设备。eth0是网卡名字,Docker虚拟机的网卡。virtual_router_id 51
:虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是0~255priority 100
:MASTER权重 要 高于BACKUP,数据越大优先级越高advert_int 1
:MASTER与BACKUP节点间同步检查(心跳检测)的时间间隔,单位为秒。主备之间必须一致。authentication
:主从服务器验证方式。主备必须使用相同的密码才能正常通信。心跳检测登录Keepalived节点,开放账号密码。virtual_ipaddress
:虚拟IP地址。可以设置多个虚拟IP地址,每行一个
启动Keepalived
启动Keepalived之后,宿主机可以PING通虚拟IP
service Keepalived start ping 172.18.0.201
4-5 负载均衡的高可用方案(下)
…视频丢失…0.0
4-6 热备份数据
MySQL备份语句:
# 数据库地址:127.0.0.1
# 数据库用户名:root
# 数据库密码:123456
# 数据库名称:test
# 备份数据库到D盘根目录
mysqldump -h127.0.0.1 -uroot -p123456 test > d:/backup_file.sql
冷备份
- 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
- 冷备份是最简单最安全的一种备份方式
- 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择

热备份
- 热备份是在系统运行的状态下备份数据,也是难度最大的备份
- MySQL常见的热备份有LVM和XtraBackup两种方案
- 建议使用XtraBackup热备份MySQL
XtraBackup介绍
- XtraBackup是一款基于InnoDB的在线热备工具,具有开源免费,支持在线热备,占用磁盘空间小,能够非常快速地备份与恢复MySQL数据库。支持MySQL官方版及各种衍生版。XtraBackup支持全量备份、增量备份。
XtraBackup优势
- XtraBackup备份过程不锁表、快速可靠
- XtraBackup备份过程不会打断正在执行的事务
- XtraBackup能够基于压缩等功能节约磁盘空间和流量
全量备份和增量备份
- 全量备份是备份全部数据。备份过程时间长,占用空间大。
- 增量备份是只备份变化的那部分数据。备份时间短,占用空间小。
对数据库首次备份应使用全量备份,后续可使用增量备份。备份速度快,减少硬盘压力
docker volume create volume_backup
docker stop container_name
docker rm container_name
docker run -d -p 3306:3306 -v volume_name1:var/lib/mysql -v colume_backup:/data --privileged -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password -e CLUSTER_JOIN=container_name2 --name=container_name1 --net=network_name --ip 172.18.0.2 pxc
PXC全量备份步骤
PXC容器中安装XtraBackup,并执行备份
docker exec -it container_name1 bash apt-get update apt-get install percona-xtrabackup-24 # 数据库用户名:root # 数据库密码:123456 innobackupex --user=root --password=123456 /data/backup/full
查看Docker卷信息(如卷位置)
docker inspect volume_name
PXC全量恢复步骤
数据库恢复数据只有冷还原,没有热还原。恢复数据与事务数据相互影响。
- 数据库可以热备份,但是不能热还原。为了避免恢复过程中的数据同步,我们采用空白的MySQL还原数据,然后再建立PXC集群。
- 还原数据前要将未提交的事务回滚,还原数据之后重启MySQL
# 删除MySQL内部的数据
rm -rf /var/lib/mysql/*
# 把未提交的事务进行回滚
innobackupex --user=root --password=123456 --apply-back /data/backup/full/2018-04-15_05-09-07/
# 全量冷还原
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2018-04-15_05-09-07/
步骤:
docker stop container_name1 container_name2 container_name3 container_name4 container_name5
docker rm container_name1 container_name2 container_name3 container_name4 container_name5
docker volume rm volume_name1 volume_name2 volume_name3 volume_name4 volume_name5
docker volume create volume_name1
docker run -d -p 3306:3306 -v volume_name1:/var/lib/mysql -v colume_backup:/data -e MYSQL_ROOT_PASSWORD=mysql_root_password -e CLUSTER_NAME=cluster_name -e XTRABACKUP_PASSWORD=xtrabackup_password --prilileged --name=container_name1 --net=network_name --ip 172.18.0.2 pxc
dcoker exec -it container_name bash
rm -rf /var/lib/mysql/*
innobackupex --user=root --password=123456 --apply-back /data/backup/full/2018-04-15_05-09-07/
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2018-04-15_05-09-07/
exit
docker stop container_name1
docker start container_name1
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:第04章-搭建MySQL集群
文章字数:3.1k
本文作者:神秘的小岛岛
发布时间:2019-12-09, 20:29:18
最后更新:2019-12-09, 20:51:47
原始链接:https://www.tuyrk.cn/imooc/219-docker/04-mysql-cluster/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。