Docker部署Mysql集群

本文详细介绍了如何在Docker环境下部署Percona XtraDB Cluster (PXC) 集群,配置虚拟网络,创建数据卷,并通过haproxy实现负载均衡。同时,利用keepalived实现haproxy的双机热备,确保高可用性。此外,还探讨了数据库的冷备份和Xtrabackup的热备份流程,提供了一套完整的数据库备份策略。
摘要由CSDN通过智能技术生成

部署PXC集群

拉取pxc镜像

docker pull docker pull percona/percona-xtradb-cluster:5.7

这里拉取5.7版本,当5.7版本以上后会校验SSL,生成证书,
当我们构建第二个节点的时候,报错:
"2020-05-01T13:49:21.864627Z 0 [ERROR] [MY-000000] [Galera] handshake with remote endpoint ssl://10.0.0.5:4567 failed: asio.ssl:336031996: 'unknown protocol' ( 336031996: 'error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol')"
具体情况了解见:https://www.percona.com/blog/2020/05/18/percona-xtradb-cluster-8-0-behavior-change-for-pxc-encrypt-cluster-traffic/

创建虚拟网络

docker network create --subnet=172.18.0.0/24 net1

创建docker卷

docker volume create --name v1

创建容器

集群1,第一节点
docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

第二节点(添加了CLUSTER_JOIN参数)

docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456  -e CLUSTER_JOIN=node1  -v v2:/var/lib/mysql --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc

部署haproxy集群

拉取镜像

docker pull haproxy 

构建配置文件: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
    # 客户端超时(ms)
    timeout client 50000
    # 服务器超时(ms)
    timeout server 50000


# 监控界面
listen  admin_stats
    # 监控界面的访问的IP和端口
    bind 0.0.0.0:8888
    # 访问协议
    mode    http
    # URL相对地址
    stats uri    /dbs
    # 统计报告格式
    stats realm     Global\ statistics
    # 登录账户信息
    stats auth    admin:123456

# 数据库负载均衡
listen proxy-mysql
    bind 0.0.0.0:3307
    mode tcp  # 网络协议
    balance roundrobin  # 轮询算法   static-rr 权重算法 等等
    # 日志格式
    option tcplog
    # 在mysql中创建一个没有权限的haproxy用户 密码为空 haproxy使用这个账户对muysql进行check
    option mysql-check user haproxy
    server MySQL_1 172.18.0.2:3306 weight 1 check maxconn 200
    server MySQL_2 172.18.0.3:3306 weight 1 check maxconn 200
    option tcpka # 使用keepalive监测死链

运行容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/zy/haproxy:/usr/local/etc/haproxy --privileged --name h1 --net=net1 haproxy 

进入容器,声明配置文件

docker exec -it haproxy_1 bash 

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

进入mysql node1,创建配置里面的haproxy用户

CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

利用keepalived实现haproxy双机热备

注意:
Docker内的虚拟IP不能被外网所使用,所以需要借助宿主机Keepalived映射成外网可以访问的虚拟IP

haproxy容器安装keepalived

# 进入haproxy容器
docker exec -it xxx bash 
# 更新apt(容器系统为ubuntu)
apt-get update
# 安装keepalived
apt-get install keepalived
# Keepalived配置文件
(默认没有)路径: /etc/keepalived/keeplived.conf
vim /etc/keepalived/keeplived.conf

vrrp_instance  VI_1 {
    state  MASTER
    interface  eth0
    virtual_router_id  100
    priority  100
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        172.18.0.201
    }
}

state MASTER:   #Keepalived身份(Master主服务,Backup备用服务器)主服务要抢占虚拟IP,备用服务器不会抢占ip 
interface eth0:  # 虚拟ip保存的网卡设备
virtual_router_id 51  # 虚拟路由标识 0~255之间
priority 100  # 权重 MASTER权重要高于Backup 数字越大优选级越大
advert_int 1  # master和backup的心跳检测时间间隔
authentication: 主从服务器验证方式,主备必须使用相同的密码才能正常通信
virtual_ipaddress:虚拟IP地址,可以设置多个虚拟IP地址 每行一个

# 启动keepalived 
service keepalived start
# 如果没有启动成功,则重写配置文件检查无误,重启keepalived之后再重试

# 重启命令
service keepalived stop
service keepalived start

# ok,到到现在为止我们在h1 里面装好了keepalived
# 我们还要在h2连装keepalived,操作更上面的一样;在这里我就不在展示了
 

宿主机中安装keepalived

# 安装keepalived
apt-get install -y keepalived

# 编辑配置文件
vim /etc/keepalived/keepalived.conf
"""
! Configuration File for keepalived
vrrp_instance VI_1 {
    state MASTER
    interface eth0   # 查看宿主机的网卡名称
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.16.188
    }
}

virtual_server 192.168.16.188 8888 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 172.18.0.201 8888 {
        weight 1
            }
        }
 virtual_server 192.168.16.188 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.201 3306 {
        weight 1
    }
} 
"""

# 运行keepalived在查看其状态
systemctl start keepalived
systemctl status keepalived

到这里我们就做完了双机热备。

数据库热备份

冷备份

冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
冷备份是最简单最安全的一种备份方式
sqldump:冷备份命令,不能在数据库运行中备份

热备份简介

热备份是在系统运行的状态下备份数据,MySQL常见的热备份有LVM和XtraBackup两种方案
建议使用Xtrabackup热备MySQL

Xtrabackup介绍

XtraBackup是一款基于InnoDB的在线热备工具,开源免费。占用磁盘空间小,能快速的备份和回复mysql数据库

Xtrabackup优势

1、Xtrabackup备份过程不锁表,快速可靠
2、XtraBackup备份过程不会打断正在执行的事务
3、XtraBackup备份数据是经过压缩的,占用空间小

全量备份和增量备份

全量备份是备份所有数据。备份过程时间长,占用空间大
增量备份是只备份变化的部分数据,备份时间短,占用空间大

第一次备份数据库采用全量备份,之后采用增量备份

热备份流程

# 安装Xtrabackup
1、node1节点映射宿主机目录,目的为了方便导出备份数据
docker volume create backup
docker stop node1 && docker rm node1

docker run -d -p 3307:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node2 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
"""新增backup卷映射,重新将入PXC集群:CLUSTER_JOIN=node2"""


docker exec -itu 0 node1 bash
docker exec -it --user root node1 bash


1、yum install percona-xtrabackup-24
https://blog.csdn.net/kadwf123/article/details/80786139
2、
apt-get update 
apt-fet install percona-xtrabackup-24


# 全量备份
innobackupex --user=root --password=123456 /data/backup/full

冷还原流程
数据库可以热备份,但是没有热还原

1、采用空白的Mysql还原数据库,然后建立PXC集群
2、还原数据前将未提交的事务回滚,还原数据之后重启Mysql

操作步骤
1、删除所有pxc节点
docker stop node1 node2
docker rm node1 node2
2、删除所有的docker卷
docker volume rm v1 v2
3、创建一个docker卷v1
docker volume create v1
4、创建一个pxc节点
docker run -d -p 3307:3306 -v v1:/var/lib/mysql  -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
5、进入node1容器
docker exec -it node1 bash
6、删除原有mysql的所有数据
rm -rf /var/lib/mysql/*
7、将备份数据未提交的事务回滚
innobackupex --user=root --password=123456 --apply-back /data/backup/full/2021-03-04_11-11-11/
8、还原备份的数据
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2021-03-04_11-11-11/
9、重启下node1节点
docker stop node1
docker start node1
10、还原成功

增量备份自行百度

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部署Docker容器搭建MySQL集群,你可以按照以下步骤进行操作: 1. 首先,确保已经在你的电脑上安装了DockerMySQL。 2. 创建一个主数据库容器(master): 使用以下命令进入容器: ``` docker exec -it <container_id> /bin/bash ``` 创建容器的代码如下: ``` docker run -id \ --name=mysql_master \ -p 3307:3306 \ -v $PWD/master/conf:/etc/mysql/conf.d \ -v $PWD/master/logs:/logs \ -v $PWD/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7 ``` 这将创建一个名为mysql_master的容器,并映射到本地的端口3307。 可以根据需要修改端口号、挂载路径和密码。 3. 创建从数据库容器(slave): 使用与创建主数据库容器相同的步骤,只需修改容器名称和端口号。 4. 配置主从复制: 在主数据库容器中配置主从复制。具体步骤包括: - 在主数据库容器中,编辑配置文件/etc/mysql/conf.d/mysql.cnf,添加以下内容: ``` [mysqld] log-bin=mysql-bin server-id=1 ``` - 重启主数据库容器。 5. 配置从数据库容器: 在从数据库容器中配置从服务器。具体步骤包括: - 在从数据库容器中,编辑配置文件/etc/mysql/conf.d/mysql.cnf,添加以下内容: ``` [mysqld] server-id=2 ``` - 重启从数据库容器。 6. 在主数据库容器中创建复制用户: 使用以下命令进入主数据库容器: ``` docker exec -it <master_container_id> /bin/bash ``` 进入MySQL控制台后,执行以下命令创建复制用户: ``` GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ``` 记下Master_Log_File和Read_Master_Log_Pos的值,稍后在从数据库容器中使用。 7. 在从数据库容器中配置主从复制: 使用以下命令进入从数据库容器: ``` docker exec -it <slave_container_id> /bin/bash ``` 进入MySQL控制台后,执行以下命令配置主从复制: ``` CHANGE MASTER TO MASTER_HOST='<master_ip>', MASTER_PORT=3306, MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='<master_log_file>', MASTER_LOG_POS=<read_master_log_pos>; START SLAVE; SHOW SLAVE STATUS\G; ``` 将上述命令中的<master_ip>替换为主数据库的IP地址,<master_log_file>和<read_master_log_pos>替换为在主数据库容器中获取的Master_Log_File和Read_Master_Log_Pos的值。 至此,你已成功部署Docker容器搭建MySQL集群
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值