首页 > 数据库 >Docker搭建Mysql集群

Docker搭建Mysql集群

时间:2023-03-14 19:57:21浏览次数:38  
标签:haproxy -- 3306 集群 Mysql node1 172.18 Docker docker

Docker搭建Mysql集群

前言:使用PXC集群方案

搭建集群

  1. 安装PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.21
  1. 改名
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
  1. 创建net1网段
docker network create --subnet=172.18.0.0/16 net1

4.创建五个数据卷

docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5

5.创建备份数据卷(用于热备份数据)

docker volume create --name backup
  1. 创建PXC集群

注意,每个MySQL容器创建之后,等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。  

创建第一个节点

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

创建第二个节点

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

创建第三个节点

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

创建第四个节点

docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc 

创建第五个节点

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

数据库负载均衡

  1. 拉取haproxy镜像
docker pull haproxy:1.8.8
  1. 创建Haproxy配置文件
mkdir -p /home/soft/haproxy
vi /home/soft/haproxy/haproxy.cfg

haproxy.cfg内容如下:

global
    chroot /usr/local/etc/haproxy
    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
    bind  0.0.0.0:8888
    mode        http
    stats uri   /dbs
    stats realm     Global\ statistics
    stats auth  admin:123456
listen  proxy-mysql
    bind  0.0.0.0:3306  
    mode  tcp
    balance  roundrobin
    option  tcplog
    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
    option  tcpka  
  1. 在数据库集群中创建用户进行心跳检测
# 进入集群
docker exec -it node1 bash
# 进入Mysql
mysql -uroot -p123456
#创建用户
create user 'haproxy'@'%' identified by '';
  1. 创建Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy:1.8.8
  1. 进入容器,在容器bash中启动Haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码123456。
http://主机号:4001/dbs

双机热备

当一个HA挂掉的时候,另外一个可以顶上

  1. 进入Haproxy容器,安装Keepalived
docker exec -it h1 bash
apt-get update
apt-get install keepalived
  1. Keepalived配置文件
apt-get install vim
vim /etc/keepalived/keepalived.conf

vrrp_instance  VI_1 {
    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
    }
}
  1. 启动keepalived
service keepalived start

成功后可以在宿主机中ping 172.18.0.201

可以按照以上步骤,再另外创建一个Haproxy容器,注意映射的宿主机端口不能重复,Haproxy配置一样。然后在容器中安装Keepalived,配置也基本一样。这样便基本实现了Haproxy双机热备方案 命令如下:

  1. 创建Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy
  1. 进入容器,在容器bash中启动Haproxy
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码123456。

http://主机号:4003/dbs

3.进入h2容器

docker exec -it h2 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
#宿主机执行ping命令
ping 172.18.0.201

Keepalived配置文件内容

vrrp_instance  VI_1 {
    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
    }
}  

外网访问虚拟ip

1.宿主机安装keepalived

yum -y install keepalived

2.处理Keepalived配置文件

#修改Keepalived配置文件
vi /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start

Keepalived配置文件内容如下:

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.99.150
    }
}

virtual_server 192.168.99.150 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.99.150 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 172.18.0.201 3306 {
        weight 1
    }
}
  1. 启动Keepalived服务
# 启动
service keepalived start
# 状态
#service keepalived status
# 停止
#service keepalived stop

之后其他电脑便可以通过虚拟IP的8888和3306端口来访问宿主机Docker中的 172.18.0.201 的相应端口

热备份

  • 全量备份:备份全部数据。备份过程时间长,占用空间大。第一次备份要使用全量备份
  • 增量备份: 只备份变化的那部分数据。备份的时间短,占用空间小。第二次以后使用增量备份

PXC全量备份

1.备份要在某个PXC节点的容器内进行,但应该把备份数据保存到宿主机内。所以采用目录映射技术。先新建Docker卷:

docker volume create backup

2.挑选一个PXC节点node1,将其容器停止并删除,然后重新创建一个增加了backup目录映射的node1容器

docker stop node1
docker rm node1    # 数据库数据保存在Docker卷v1中,不会丢失
# 参数改变:
# 1. -e CLUSTER_JOIN=node2;原来其他节点是通过node1加入集群的,现在node1重新创建,需要选择一个其他节点加入集群
# 2. -v backup:/data;将Docker卷backup映射到容器的/data目录
docker run -d -u root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --network=net1 --ip 172.18.0.2 --name=node1 pxc

3.在node1容器中安装percona-xtrabackup-24

docker exec -it node1 bash
apt-get update
apt-get install percona-xtrabackup-24

4.之后便可以执行如下命令进行全量备份,备份后的数据会保存在 /data/backup/full 目录下:

mkdir /data/backup
mkdir /data/backup/full
xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full

PXC全量还原

  1. 停止并删除PXC集群所有节点
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
docker volume rm v1 v2 v3 v4 v5
  1. 按照之前的步骤重新创建node1容器,并进入容器,执行冷还原  
# 创建卷
docker volume create v1
# 创建容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --network=net1 --ip 172.18.0.2 pxc
# 以root身份进入容器
docker exec -it -uroot node1 bash
# 删除数据
rm -rf /var/lib/mysql/*
# 准备阶段
xtrabackup --prepare --target-dir=/data/backup/full/
# 执行冷还原
xtrabackup --copy-back --target-dir=/data/backup/full/
# 更改还原后的数据库文件属主
chown -R mysql:mysql /var/lib/mysql
# 退出容器后,重启容器
docker stop node1
docker start node1

标签:haproxy,--,3306,集群,Mysql,node1,172.18,Docker,docker
From: https://www.cnblogs.com/yaobaia/p/17216090.html

相关文章

  • 如何在AS中实现mysql查询并输出在视图上
    新建子线程启用mysqlnewThread(){@overridepublicvoidrun(){//在这里进行数据库调用}}.start(); handler简单使用方法hand1.sendEmptyMessage(i);//......
  • Mysql配置
    1.官网下载压缩包https://downloads.mysql.com/archives/community/ 2.新建.ini文件内容[mysqld]default-time-zone='+8:00'port=3306#允许最大连接数max_conne......
  • mysql merge update_SQL中批量更新 merge into用法
     从备份表中更新字段到正式表中,使用UPDATE批量更新大量的数据,会出现效率低下,有时候甚至卡死的情况,后面通过使用MERGEINTO代替UPDATE执行批量更新,会提升执行效率。......
  • Docker学习
    阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors  docker启动命令1启动dockersystemctlstartdocker2关闭dockersystemc......
  • Mysql数据库未添加索引引发的生产事故
    最近开发的新功能主要是首页的红点提示功能,某个用户登录系统app,然后进入某一个功能模块,在该功能下面有很多地方可以操作,新功能就是根据用户信息查询当月是否存在新的......
  • 12、MySQL数据库配置
    MySQL系统数据库MySQL系统数据库主要包括以下几个:mysql数据库:用于存储MySQL的权限信息和系统变量等,包括user表、db表、host表等,这些表是管理MySQL权限的重要基础......
  • 高可用的kubernetes集群安装
    一、架构设计二、集群规划 IP集群角色描述110.10.0.115keepalived虚拟IP虚拟IP,对10.10.0.15、10.10.0.29做keepalived110.10.0.15master、......
  • Docker - 部署抓包/host代理工具 Whistle
    编写DockerfileFROMalpineEXPOSE8899RUNapkadd--no-cachenodejsnpm\&&npminstallwhistle-g\&&apkdelnpm\&&mkdir/whistleENTRYPOI......
  • MySQL 考试练习题
    1、用户表account1、用户表account(用户编号userid,用户名fullname,密码passward,性别sex,住址adderss,邮箱email,电话phone)account(useridchar(6),fullnamechar(4),passwar......
  • 如何将自定义的日志直接写入到 mysql 数据库中?
    要将自定义的日志直接写入MySQL数据库中,您可以使用以下步骤:安装MySQL数据库,并创建一个新的数据库和表来存储日志数据。在您的代码中,使用MySQL连接器来连接到MySQL数据库。创......