Docker搭建Keepalived+Haproxy+PXC集群

Stella981
• 阅读 793

准备环境:

  1.4台CentOS7主机

  2.主机名对应的IP地址:

    docker1  192.168.113.21

    docker2  192.168.113.22

    docker3  192.168.113.23

    docker4  192.168.113.24

操作步骤:

1.4台主机上关闭防火墙,安装并启动Docker服务

2.在docker1主机上搭建Docker Swarm集群,并创建共享网络。

 值得一提的是,我们并不适用Swarm管理容器的技术,仅仅通过共享网络来实现容器跨主机通信,自己搭建Keepalived+Haproxy实现高可用和负载均衡集群

## docker1主机上的操作
docker swarm init
#获取以manager身份加入集群的token
docker swarm join-token manager
#获取以worker身份加入集群的token
docker swarm join-token worker

## 然后docker2、docker3执行worker身份加入集群的命令
## docker4执行manager身份加入集群的命令

## 在docker1主机上创建共享网络
docker network create -d overlay --attachable swarm_test

3.创建存储卷,启动容器

##docker1主机
# 创建存储卷
docker volume craete v1
docker volume create v2
docker volume create backup
# 拉取镜像并改名
docker pull percona/percona-xtradb-cluster
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
# 启动第一个容器
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123qqq...A -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123qqq...A --privileged --name=node1 --net=swarm_test pxc
# 启动第二个pxc容器
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123qqq...A -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123qqq...A -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=swarm_test -e CLUSTER_JOIN=node1 pxc

##docker2主机
#创建存储卷
docker volume create v3
docker volume create backup
# 拉取镜像并改名
docker pull percona/percona-xtradb-cluster
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
# 启动容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123qqq...A -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123qqq...A -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=node3 --net=swarm_test pxc


##docker3主机
#创建存储卷
docker volume create v4
docker volume create backup
# 拉取镜像并改名
docker pull percona/percona-xtradb-cluster
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
# 启动容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123qqq...A -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123qqq...A -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=node4 --net=swarm_test pxc

##docker4主机
# 创建存储卷
docker volume create v5
docker volume create backup
# 拉取镜像并改名
docker pull percona/percona-xtradb-cluster
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
# 启动容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123qqq...A -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123qqq...A -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=swarm_test pxc

4.docker1和docker4主机部署Haproxy容器,两台机器的操作都一样,这里就只写一台的操作步骤了

//查看pxc容器信息,确定容器的ip,其他几台都这样查看,然后写到下面的配置文件中集群设置中docker inspect node1//准备haproxy.cfg配置文件,这里我将它放在/root/soft/haproxy目录下
vim /root/soft/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
    #客户端超时
    timeout client  5000
    #服务器超时
   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:123qqq...A

#数据库负载均衡
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 10.0.0.2:3306 check weight 1 maxconn 2000
    server  MySQL_2 10.0.0.3:3306 check weight 1 maxconn 2000
    server  MySQL_3 10.0.0.4:3306 check weight 1 maxconn 2000
    server  MySQL_4 10.0.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 10.0.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka


//拉取并启动容器
docker run -d -p 4001:8888 -p 4002:3306 -v /root/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=swarm_test --ip 10.0.0.7 haproxy

//进入容器,加载映射到容器中的配置文件
docker exec -it h1 bash
root@d67237ec2c6a:/# haproxy -f /usr/local/etc/haproxy

5.进入Haproxy容器中,搭建keepalived服务。两台主机的配置依旧是一样,keepalived.conf配置文件都是一样,抢占虚拟ip。所以这里就行写一台的配置

docker exec -it h1 bash

# 因为haproxy容器环境是ubutun系统,我们使用ubutun命令
# 将系统的镜像更换为国内的镜像源
mv /etc/apt/sources.list apt-sources-list.ba
cat << EOF > /etc/apt/sources.list
> deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
> deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
> deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
> deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
> deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
> deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
> deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
> deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
> deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
> deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse12345678910
> EOF

#更新镜像源
apt-get update
#安装keepalived
apt-get install keepalived
#安装vim
apt-get install vim

#修改keepalived配置文件
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 {
        10.0.0.10
    }
}


#启动keepalived
service keepalived restart

#下载ping和ifconfig工具,便于测试
apt-get install inetutils-ping
apt-get install net-tools

# 测试
ping 10.0.0.10

6.后续的配置,就只是需要后端集群访问10.0.0.10这个虚拟ip,来实现访问pxc集群。当然后端集群也得是在swarm_test这个网段上的

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
5个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue