当前文章收录状态:
查询中...
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,首先启动的作为Masterstate 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 PASSauth_pass 123456}# 绑定本机实际IPunicast_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}}#全局配置 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 } }#全局配置 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,首先启动的作为Masterstate 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 PASSauth_pass 123456}# 绑定本机实际IPunicast_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}}#全局配置 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 } }#全局配置 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 127elseexit 0fi#!/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#!/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变成backup192.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重回Master103优先级低于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的执行日志
© 版权声明
1
本站网络名称:
明恒博客
2
本站永久网址:
www.zym88.cn
3 本站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
THE END
暂无评论内容