docker技术快速实现前后端项目的集群化⑦Haproxy的keevalived高可用方案

keepalived 设置的VIP 端口不通 keepalived端口号_配置文件

keepalived 设置的VIP 端口不通 keepalived端口号_配置文件_02

整体规划架构:

haproxy01  负载均衡 172.18.0.7 的 8888端口作为状态监控端口,3306作为 pxc 集群反向代理的端口,上面运行了 keepalived 虚拟ip为 172.18.0.100,可以保证高可用

haproxy02  负载均衡 172.18.0.8 的 8888端口作为状态监控端口,3306作为 pxc 集群反向代理的端口,上面运行了 keepalived 虚拟ip为 172.18.0.100,如果master挂了,漂移过来,可以保证高可用

 

宿主机 10.11.0.218 上面运行的 keepalived 是和容器的 keepalived(172.30.0.100) 通讯

 

172.18.0.100 的 8888 端口 和 宿主机keepalived虚拟出的 10.11.0.218  的 8888 端口映射

172.18.0.100 的 3306 端口 和 宿主机 keepalived虚拟出的 10.11.0.218  的 3336 端口映射(3306已经分配给了之前的docker)

 

访问宿主机 10.11.0.218 8888端口就是映射到了容器的haproxy监控端

keepalived 设置的VIP 端口不通 keepalived端口号_docker_03

Keepvlived安装在ubuntu容器中

 

Ubuntu中给apt-get设置代理

进入docker-haproxy服务

docker exec -it h1 /bin/bash

 

 

编辑文件: /etc/apt/apt.conf

在您的apt.conf文件中加入下面这行(根据你的实际情况替换yourproxyaddress和proxyport)。

Acquire::http::Proxy "http://yourproxyaddress:proxyport";

Acquire::https::proxy "http://yourproxyaddress:proxyport";

 

 

Acquire::http::Proxy "http://10.11.0.148:808";

Acquire::https::proxy "http://10.11.0.148:808";

 

设置apt-get的代理

cd /etc/apt

echo 'Acquire::http::Proxy "http://10.11.0.148:808";' >> apt.conf

echo 'Acquire::https::proxy "http://10.11.0.148:808";' >> apt.conf

或者

cd /etc/apt/apt.conf.d

echo 'Acquire::http::Proxy "http://10.11.0.148:808";' >> proxy.conf

echo 'Acquire::https::proxy "http://10.11.0.148:808";' >> proxy.conf

 

# 系统升级,安装vim编辑器

# apt-get update

root@f9ee51b26ac0:/etc/apt/apt.conf.d# apt-get install vim

 

# 安装keepalived和ping命令

apt-get install keepalived

apt-get install net-tools

apt-get install iputils-ping            

keepalived 设置的VIP 端口不通 keepalived端口号_docker_04

keepalived搭建:

keepalived的实现是要在docker服务内创建,最后宿主机中也要创建实现docker内外的连接;

docker服务内创建,我们需要进入到该服务并安装keepalived

# 新建并写入一个keepalived的配置文件

vim /etc/keepalived/keepalived.conf

#取名为K1,可自定义



vrrp_instance  VI_1 {
#定义节点属性
    state  MASTER
    #定义虚拟网卡
    interface  eth0
    #定义组vriid
    virtual_router_id  100
    #定义权重
    priority  100
    #定义心跳检测时间1秒
    advert_int  1
    #定义组用户密码
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    #定义docker内ip地址,必须要在和haproxy同一个网段
    virtual_ipaddress {
        172.18.0.100
    }
}



如果配置文件信息都是正确的,通过ip a命令会显示如当前docker服务有的网卡

keepalived 设置的VIP 端口不通 keepalived端口号_docker_05

Ping这个虚拟ip和宿主机网络是通的

 

 

keepalived 设置的VIP 端口不通 keepalived端口号_docker_06

最后,再新建一个haproxy再添加slave的keepalive,加入到master中,即完成负载均衡集群的搭建。

 

新建第二个haproxy容器的配置文件和第一个容器是一样的,需要注意的地方是,在docker run新建容器的时候,由于4001,4002端口和ip都被占用了,所以在run的时候要指定未使用的新端口和ip,比如4003,4004端口等等;

 

第二个keepalived的配置文件和第一个配置文件完全一样,如果想要分配不同的权重比列,只需要更改权重参数就可以了。

 

# 启动第二个haproxy取名为 h2



# docker run -it -d -p 4003:8888 -p 4004:3306 -v /data/haproxy02:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy



# docker exec -it h2 /bin/bash
apt-get update
apt-get install vim
# apt-get install keepalived
apt-get install net-tools
apt-get install iputils-ping
 
# vim /etc/keepalived/keepalived.conf
vrrp_instance  VI_1 {
    state  MASTER
    interface  eth0
    virtual_router_id  100
    priority  90
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        172.18.0.100
    }
}

# service keepalived start



最后,本地宿主机安装keepalived进行外网路由:

宿主机操作:

安装keepalived

yum install -y keepalived

 

安装完后配置文件本省有自带的在,/etc/keepalived文件夹中,通过ftp替换掉这个配置文件

宿主机Kepalived配置文件信息:

# 进入容器h2,修改keepalived配置

[root@server01 keepalived]# cat /etc/keepalived/keepalived.conf



vrrp_instance VI_1 {
    state MASTER
    #这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个
    interface eth0
    #定义组vrid
    virtual_router_id 100
    #定义权重
    priority 100
    #定义心跳检测时间3秒
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
    #这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是 10.11.0.218 ,所以指定虚拟ip是给的 218
           10.11.0.218
    }
}
 
#接受监听数据来源的端口,网页入口使用
virtual_server 10.11.0.218 8888 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
#把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致
    real_server 172.18.0.100 8888 {
        weight 1
    }
}
 
#接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
virtual_server 10.11.0.218 3336 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
#同理转发数据库给服务的端口和ip要求和docker服务中的数据在一个网段
    real_server 172.18.0.100 3306 {
        weight 1
    }
}



 

配置完后,通过命令service keepalived start启动宿主机的KP,通过ip a查看网卡中是否出现定义的10.11.0.218 这个 IP地址,如果没有出现大多数是配置文件不正确。

 

通过ping 10.11.0.218 ip地址,发现能够ping通

 

切换到windows上,进入cmd ping宿主机90ip地址发现能ping通,通过浏览器输入

http://10.11.0.218:8888/dbs

keepalived 设置的VIP 端口不通 keepalived端口号_配置文件_07

 

到此实现了外网访问的负载均衡集群搭建。

 

在此如果cmd能ping通90ip 而网页无法进入监听界面,问题出现在防火墙上,centos7默认防火墙是没有开启开启vrrp 协议,而keepalived用的是vrrp协议,所以要么让防火强开通vrrp协议,命令:

 

    执行命令1

    firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

   

    # 还需要对8888端口和3336端口放行

firewall-cmd --zone=public --add-port=8888/tcp --permanent

firewall-cmd --zone=public --add-port=3336/tcp --permanent

firewall-cmd --reload

 

或者直接关闭防火墙(实际需要关闭防火墙,不知道是否是因为我这里的环境原有)

 

systemctl stop firewalld.service

 

以上防火墙命令只针对于centos7的firewalld,其他防火墙或者linux版本可以自行百度让vrrp协议能够使用即能让网页进入到监听界面

 

数据库的备份

使用xtrabackup在容器中备份数据

过程:删除之前的一个pxc节点,然后重新启动这个容器,并且映射一个backup目录到宿主机,因为之前启动时是映射到宿主机的v1删除容器node01不会删除里面的数据

 

还原:

只能执行冷还原,没有热还原,因为正在生产的数据库会产生数据与还原的数据有冲突

 

Pxc集群的冷还原比较麻烦,步骤如下:

  1. 停用并删除老的pxc集群和所在的卷
  2. 启动新的集群节点node1
  3. 在node1中还原备份的数据
  4. 然后依赖node1重新部署新的pxc集群