Nginx 集群搭建(主备切换)

nginx集群原理

  • 利用虚拟IP,将同一个虚拟IP绑定到多个实际网卡上的IP,形成访问一个虚拟IP时,实际访问的是多个实际IP。每个实际IP对应一个nginx服务。

keepalived 交换机制软件

  • Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
  • VRRP协议:VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP。

keepalived虚拟IP切换的原理如下:

  • 正常情况下,用户通过虚拟IP是直接访问到Keepalived-Master的(没有成为Master的就是Backup);
  • 成为Master的Keepalived,会每秒向所有的Backup发送VRRP包,通告自己是主,且运行正常;
  • 当Master因为网络原因或者是别的原因导致与集群断开之后,Backup会在3.6秒左右(以优先级100为例,计算公式为3 × 1 + 256 × (256 - 100))认定Master宕机;
  • 如果是多播的情况下,Master宕机,那么剩余的Backup要通过选举产生新的Master
  • 如果是单播,则由剩下的Bakcup直接作为新的Master。
选举机制如下:
  • keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其他主机,同时,它还会以多播的形式(默认目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级
  • 网络中的所有BACKUP节点只负责处理MASTER发出的多播包,在抢占模式下,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状态,然后做MASTER该做的事:响应arp包和发送VRRP通告
  • 如果在同一个广播域的同一个VRRP组内出现了两台Master路由器,那么它们收到对方发送的VRRP通
    告报文之后,将比较自己与对方的优先级,优先级的值更大的设备胜出,继续保持Master状态,而
    竞争失败的路由器则切换到Backup状态。
  • 如果这两台Master路由器的优先级相等,那么接口IP地址
    更大的路由器接口将会保持Master状态,而另一台设备则切换到Backup状态。

Nginx + Keepalived 搭建(实现主备切换)

  • 原理图


    原理图

环境准备

  • Centos 7 x86_64系统2台,实际IP分别为:192.168.250.102 和 192.168.250.103
  • nginx version: nginx/1.20.2
  • Keepalived v1.3.5 (03/19,2017)
  • 虚拟IP设置为:192.168.250.250
  • Keepalived Master 在192.168.250.102机器上,Backup 在192.168.250.103机器上。

安装nginx 和 keepalived

  • nginx 安装自行查阅,不赘述
  • keepalived 安装:yum install -y keepalived 即可

keepalived配置

  • keepalived配置文件在:/etc/keepalived/keepalived.conf(有可能跟我不一样,自行确认一下)

  • Master(192.168.250.102机器上是master)配置信息如下

#全局配置
global_defs {
   #启用脚本安全
   enable_script_security
}
# 调整优先级脚本
vrrp_script chk_nginx {
    # shell脚本路径
    script "/etc/keepalived/chk_nginx.sh"
    #执行脚本的用户名
    user root
    # 脚本执行间隔时间(单位s)
    interval 2
    # weight 大于0
    #       如果脚本监测失败,优先级不变,如果成功,优先级增加,
    #       如果后续监测失败,则优先级在增加的基础上回退,
    #       这个weight不会持续增加或减小,只会存在两个值
    # weight 小于0
    #       如果脚本监测失败,优先级降低,
    #       如果成功,优先级不变,
    #       这个weight不会持续增加或减小,只会存在两个值
    weight -30
}

# 虚拟IP配置
vrrp_instance VI_1 {
    # 表示当前是主服务器 还是 备份服务器(如果是备份服务器,则值为BACKUP)
    # 都设置为BACKUP,首先启动的作为Master
    state MASTER
    # 虚拟IP绑定网卡 值为:网卡名称(注意:改成自己机器网卡)
    interface ens33
    # 主、备服务器的 virtual_router_id需要一致
    # 虚拟路由id,这个id在整个局域网中需要唯一
    virtual_router_id 99
    # 优先级(主大备小)master优先级大于backup
    # 当待出现脚本执行错误时,keepalived会自行调整优先级,形成主备切换
    # 注意 优先级跨度不要超出weight的值,否则出现错误后,无法形成主备切换
    priority 120
    # VRRP广播的时间间隔
    advert_int 1
    # keepalived认证,类型有AH加密和PASS明文
    # 密码,集群中保持一致,且取前8个字符
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    # 绑定本机实际IP
    unicast_src_ip 192.168.250.102
    # 其他 keepalived ip地址
    unicast_peer {
        192.168.250.103
    }
    #虚拟IP地址(启动后使用ip add命令,能看到interface的网卡下存在绑定的虚拟ip)
    virtual_ipaddress {
        192.168.250.250
    }
    # 执行的script脚本,当脚本执行失败,则降低优先级(脚本在vrrp_script配置)
    track_script {
        # 脚本名称
        chk_nginx
    }
}
  • Backup Keepalived配置
#全局配置
global_defs {
   #启用脚本安全
   enable_script_security
}

# 调整优先级脚本
vrrp_script chk_nginx {
    # shell脚本路径
    script "/etc/keepalived/chk_nginx.sh"
    #执行脚本的用户名
    user root
    # 脚本执行间隔时间(单位s)
    interval 2
    # weight 大于0
    #       如果脚本监测失败,优先级不变,如果成功,优先级增加,
    #       如果后续监测失败,则优先级在增加的基础上回退,
    #       这个weight不会持续增加或减小,只会存在两个值
    # weight 小于0
    #       如果脚本监测失败,优先级降低,
    #       如果成功,优先级不变,
    #       这个weight不会持续增加或减小,只会存在两个值
    weight -30
}

#虚拟IP配置
vrrp_instance VI_1 {
    # 表示当前是主服务器 还是 备份服务器(如果是备份服务器,则值为BACKUP)
    # 都设置为BACKUP,首先启动的作为Master
    state BACKUP
    # 虚拟IP绑定网卡 值为:网卡名称(注意:机器网卡)
    interface ens33
    # 主、备服务器的 virtual_router_id需要一致
    # 虚拟路由id,这个id在整个局域网中需要唯一
    virtual_router_id 99
    # 优先级(主大备小)master优先级大于backup
    # 当待出现脚本执行错误时,keepalived会自行调整优先级,形成主备切换
    # 注意 优先级跨度不要超出weight的值,否则出现错误后,无法形成主备切换
    priority 110
    # VRRP广播的时间间隔
    advert_int 1
    # keepalived认证,类型有AH加密和PASS明文
    # 密码,集群中保持一致,且取前8个字符
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    # 绑定本机实际IP
    unicast_src_ip 192.168.250.103
    # 其他 keepalived ip地址
    unicast_peer {
        192.168.250.102
    }
    #虚拟IP地址(启动后使用ip add命令,能看到interface的网卡下存在绑定的虚拟ip)
    virtual_ipaddress {
        192.168.250.250
    }
    # 执行的script脚本,当脚本执行失败,则降低优先级(脚本在vrrp_script配置)
    track_script {
        # 脚本名称
        chk_nginx
    }
}

keepalived中执行的 chk_nginx.sh脚本

  • 脚本文件用户用户组 要设置成keepalived.conf中的 用户(我的是root
  • chk_nginx.sh脚本文件注意修改权限(最好改成0755防止keepalived无法执行)
  • chk_nginx.sh脚本文件路径要与keepalived.conf配置保持一致
  • 脚本内容如下:
#!/usr/bin/bash

#统计nginx 命令启动的进程数有几个
PIDS=`ps -C nginx --no-header | wc -l`
if [ $PIDS -eq 0 ]; then
    # 如果没有nginx进程,利用exit退出带正数,表示有错误退出
    # 那么keepalived认为此次脚本执行错误

    # # 这里可以加 重启nginx逻辑 如下:
    # # 如果重启后还是没有nginx进程,则脚本带错误退出
    #/usr/local/bin/nginx -c /opt/nginx/conf/nginx.conf
    # #等待3s
    #sleep 3
    #IDS=`ps -C nginx --no-header | wc -l`
    #if [ $PIDS -eq 0 ]; then
    #   exit 127
    #else
    #   exit 0
    #fi

    # 为了演示主备切换,就不设置重启nginx逻辑,直接返回脚本执行错误
    exit 127
else
    exit 0
fi

nginx配置(略)

  • 请自行上网查阅
  • 至此搭建结束,下面进入测试

Nginx + Keepalived 集群测试

准备工作:

  • 我们在 192.168.250.102和103上分别启动nginx 和 keepalived(注意:先启动nginx,否则keepalived会发生主备切换)
  • nginx :启动/停止,自行查阅
  • keepalived 启动命令:keepalived -f /etc/keepalived/keepalived.conf(-f 后面是keepalived的配置文件路径)
  • keepalived 关闭:kill ${对应keepalived pid} 即可
  • keepalived 启动后,其日志文件在/var/log/messages可以看到(后续我将使用 tail -f /var/log/messages 来观察keepalived的变化)

102机器启动Keepalived

  • 下图可以看出,192.168.250.102机器上的keepalived以 Master 启动起来。
    192.168.250.102

103机器启动Keepalived

  • 下图:192.168.250.103机器上的keepalived以 Backup 启动起来。
    192.168.250.103

使用虚拟IP 192.168.250.250访问

  • 可以看出,我们当前访问的是Master上的nginx。
    虚拟IP访问

将102上的nginx服务停止

  • 下面2张图,可以看出102的优先级降低,从120 -> 90,并切换为Backup。
  • 而103变成新的Master。
    192.168.250.102上Nginx停止,102变成backup
    192.168.250.103变成Master

再用虚拟IP访问

  • 下图:再使用虚拟IP访问时,已经访问的是103上备份的nginx
    成功切换到备份Nginx上

重启102机器上Nginx

  • 可以看出:102优先级从90回到120,并且成功切换成Master。
  • 103 由于优先级为110,从而切换为Backup
    192.168.250.102重启Nginx,ch_nginx.sh脚本执行成功,从而102重回Master
    103优先级低于102,故重回Backup

再次访问虚拟IP 192.168.250.250

  • 下图:重新请求到102Master主机上的nginx。
    虚拟IP访问回到102主机上

总结

  • chk_nginx.sh 脚本要注意权限,防止keepalived没有权限自行脚本
  • keepalived.conf Master 和 Backup 配置文件不要搞乱
  • 注意Master 和 Backup 中的优先级值设置,防止主备切换时,优先级值设置不正确,导致主备切换失败。
  • 要利用 tail -f /var/log/messages 观察keepalived的执行日志

资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容