Docker搭建Nginx+keepalived高可用负载均衡服务器

服务器 0
一、背景
1.nginx高可用

在生产环境下,Nginx作为流量的入口,如果Nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。所以负责负载均衡、反向代理的服务(Nginx)为了提高处理性能,高可用,也需要集群部署。本期咋们采用 keepalived 和 Nginx实现高可用。

2.KeepAlived

KeepAlived是Linux下的基于VRRP备份路由的高可靠性中间件。如果一台服务器宕机,KeepAlived会检测到并将发生故障的机器从集群中摘除,同时使用其他的服务器代替该故障机器的工作,当服务器重新正常工作后KeepAlived就会自动将该服务器加入到工作集群中,以上的工作都是KeepAlived自动完成无需人工介入。

3.VRRP协议

VRRP协议英文全称:Virtual Router Redundancy Protocol,即”虚拟路由冗余协议“。将多台提供相同功能的路由器组成路由器组,包含一个master和多个backup。提供虚拟IP,占有这个虚拟IP的master负责ARP的响应和转发IP数据包。master负责发布组广播消息,若master发送的广播长时间没有被backup接收到就会触发选举backup当新master。

4.Nginx+keepalived 双机主从模式

使用两台Nginx服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

5.Nginx+keepalived 双机主主模式

使用两台Nginx服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。该方案解决了双击主从的资源浪费问题,但是有个性能瓶颈的问题在这种模式会出现。就是单台机器上的负载会瞬时过大。那如何解决这个问题呢,就出现了多点集群模式。

6.Nginx+keepalived 多点模式

以上两种方式都有各自的有缺点,多点集群模式应运而生。多点集群可以理解为双机热备在技术上的提升。多机服务器可以组成一个集群。根据应用的实际情况,可以灵活地在这些服务器上进行部署,同时可以灵活地设置接管策略。比如,可以由一台服务器作为其他所有服务器的备机,也可以设置多重的接管关系,等等。这样,就可以充分地利用服务器的资源,同时保证系统的高可用性。

二、docker部署双机主从模式
1.创建网络
# 创建bridgedocker network create -d bridge --subnet 172.70.0.0/16 --gateway 172.70.0.1 nginx-networkdocker network ls# 查看信息docker network lsdocker network inspect minio-network# 删除docker network rm networkId
2.创建容器
# masterdocker run -it --name centos-master --privileged -v /home/centos/master:/mnt/software -p 10010:80 --net=nginx-network centos:7# salvedocker run -it --name centos-salve --privileged -v /home/centos/salve:/mnt/software -p 10020:80 --net=nginx-network centos:7
3.安装准备
# 切换目录cd /etc/yum.repos.d/# 删除yum源rm -rf CentOS*# 复制yum源docker cp /etc/yum.repos.d/CentOS-Base.repo 容器id:/etc/yum.repos.d/CentOS-Base.repo# 安装工具yum -y updateyum install epel-releaseyum -y install net-toolsyum -y install vim# 清除缓存yum clean all# 生成缓存yum makecache
4.安装nginx
yum -y install nginx# 启动nginx# 停止nginx -s quit# 刷新配置nginx -s reload
5.安装keepalived
yum -y install keepalived # 启动keepalived -l -f /etc/keepalived/keepalived.conf# 停止pkill keepalived# 查看ps -ef | grep keepalived
keepalived配置
  1. keepalived master配置

    # keepalived.conf! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   # 路由id,主备节点不能相同   router_id LVS_DEVEL_MASTER   vrrp_skip_check_adv_addr   #vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0   script_user root   enable_script_security}# nginx检查vrrp_script chk_nginx {  script "/etc/keepalived/nginx_check.sh"  interval 1  weight 0}vrrp_instance VI_1 {	# Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点    state MASTER    # 指定监测的网卡,可以使用 ifconfig 或 ip a 进行查看    interface eth0    # 虚拟路由的id,主备节点需要设置为相同    virtual_router_id 51    # 优先级,主节点的优先级需要设置比备份节点高    priority 100    # 设置主备之间的检查时间,单位为秒    advert_int 1    # 定义验证类型和密码    authentication {        auth_type PASS        auth_pass 1111    }    # 虚拟IP地址,可以设置多个    virtual_ipaddress {        172.70.0.10    }    # 调用上面自定义的监控脚本    track_script {       chk_nginx    }}
  2. keepalived salve配置

    # keepalived.conf! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 192.168.200.1   smtp_connect_timeout 30   # 唯一值   router_id LVS_DEVEL_SALVE   vrrp_skip_check_adv_addr   # vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0   script_user root   enable_script_security}# nginx检查vrrp_script chk_nginx {  script "/etc/keepalived/nginx_check.sh"  interval 1  weight 0}vrrp_instance VI_1 {    state BACKUP    interface eth0    # 主从一致    virtual_router_id 51    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        172.70.0.10    }    track_script {       chk_nginx    }}
  3. nginx检查配置

    # nginx_check.shA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then #执行nginx启动命令 #nginx # 启动失败停止keepalived if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then	pkill keepalived fifi
  4. 补充配置

    # 文件授权chmod +x check_nginx.shchmod +x keepalived.conf

也许您对下面的内容还感兴趣: