第04章-搭建MySQL集群

  1. 4-1 MySQL集群方案介绍
  2. 4-2 创建MySQL集群
  3. 4-3 数据库负载均衡
  4. 4-4 负载均衡的高可用方案(上)
  5. 4-5 负载均衡的高可用方案(下)
  6. 4-6 热备份数据

大型项目的持久层都会选择数据库集群,本门课程选择的是MySQL领域中最成熟可靠的PXC(Percona XtraDB Cluster)集群方案。在本章节,我们会学习在Docker容器中划分网段,创建PXC容器和组建5节点的PXC集群。

4-1 MySQL集群方案介绍

单节点数据库的弊病

  • 大型互联网程序用户群体庞大,所以架构必须要特殊设计
  • 单节点的数据库无法满足性能上的要求
  • 单节点的数据库没有冗余设计,无法满足高可用

单节点MySQL的性能瓶颈

  • 2016年春节微信红包巨大业务量,数据库承受巨大负载

常见MySQL集群方案

  • Replication

    速度快、弱一致性、低价值

    日志、新闻、帖子

  • PXC

    速度慢、强一致性、高价值

    订单、账户、财务

PXC原理

淘宝网的数据库集群也借鉴了PXC集群方案

  • PXC(Percona XtraDB Cluster)

    PXC(Percona XtraDB Cluster)
  • 建议PXC使用PerconaServer(MySQL改进版,性能提升很大)

PXC方案与Replication方案的对比

  • PXC方案

    双向同步

  • Replication方案

    单向同步

PXC的数据强一致性

  • PXC采用同步复制,事务在所有集群节点要么同时提交,要么不提交

    PXC同步复制机制
  • Replication采用异步复制,无法保证数据的一致性

    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容器使用原则:

  1. 一旦创建出Docker容器,尽量不要在容器内保存业务数据,应将业务数据保存在宿主机里。应使用目录映射机制
  2. 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不具备高可用,必须要有冗余设计

    单节点Haproxy部署图

虚拟IP地址

虚拟IP是Haproxy双机热备方案的关键技术

虚拟IP地址

利用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~255

    • priority 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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏