Keepalived实现Nginx负载均衡高可用的示例代码
第一章:keepalived介绍
VRRP协议
目的就是为了解决静态路由单点故障问题的
第二章:keepalived工作原理
2.1作为系统网络服务的高可用功能(failover)
keepalived高可用功能实现的基本原理为:
两台主机同时安装好keepalived软件并启动服务,开始正常工作时
角色为Master的主机获得所有资源并对用户提供服务
角色为Backup的主机作为Master主机的热备;
当角色为Master的主机失效或出现故障时
角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务
而当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作
角色为Backup的主机则同时释放Master主机失效时他接管的工作
此时,两台主机将恢复到启动时各自的原始角色及工作状态
2.2什么是VRRP
VRRP,全称VirtualRouterRedundancyProtocol,中文名为虚拟路由冗余协议
VRRP的出现就是为了解决静态路由的单点故障问题
VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的.
VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的
虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址,:00-00-5E-00-01-{VRID}.
所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP).
客户端主机并不需要因Master的改变修改自己的路由配置.对它们来说,这种切换是透明的.
在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master
当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master.
这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性,处于安全性考虑,VRRP数据包使用了加密协议进行了加密.
2.3面试的时候怎么说
解答:
keepalived高可用对之间是通过VRRP通信的,因此,我从VRRP开始给您讲起.
1)VRRP,全称VirtualRouterReduancyProtocol,中文名为虚拟路由器冗余协议,VRRP的出现是为了解决静态路由的单点故障,
2)VRRP是通过一种竞选协议来将路由任务交给某台VRRP路由器的,
3)VRRP用IP多播的方式,(默认多播地址(224.0.0.18))实现高可用对之间通信.
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的包的时候,就启动接管程序接管主节点的资源.备节点可以有多个,通过优先级竞选,但一般keepalived系统运维工作中都是一对.
5)VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐用明文的方式配置认证类型和密码.
介绍完了VRRP,接下来我在介绍一下keepalived服务的工作原理;
keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务.
在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于一秒
第三章:VRRP协议
VRRP通过竞选机制来实现虚拟路由器的功能
所有的协议报文都是通过IP多播(Multicast)包
默认的多播地址224.0.0.18
VIP前提条件:
1.虚拟公网IP必须是真实可用的
2.虚拟公网IP不能重复
3.组播地址必须是可以通讯的
第四章:keepalived安装配置
1.安装keepalived
yuminstallkeepalived-y
2.配置文件解释
global_defs{ router_idlb01#设置路由ID,每个主机不一样 } vrrp_instanceVI_1{#设置VRRP组名,同一组组名相同 stateMASTER#设置角色状态,分为MASTERBACKUP interfaceeth0#VIP绑定的网卡 virtual_router_id50#虚拟路由id,同一组一样 priority150#权重,权重越高,优先级越高 advert_int1#发送组播间隔 authentication{#设置验证,密码为明文 auth_typePASS auth_pass1111 } virtual_ipaddress{#设定的虚拟IP,这个虚拟IP必须是存在且合法且没有被使用的。 10.0.0.3 } }
3.lb01配置
[root@lb01~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb01 } vrrp_instanceVI_1{ stateMASTER interfaceeth0 virtual_router_id50 priority150 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } }
4.lb02配置
[root@lb02~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb02 } vrrp_instanceVI_1{ stateBACKUP interfaceeth0 virtual_router_id50 priority100 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } }
5.启动
systemctlstartkeepalived
6.测试
关掉任意一台,观察VIP是否会漂移
恢复MASTER观察BACKUP的VIP是否会消失
第五章:脑裂现象
1.安装抓包工具
yuminstalltcpdump-y
2.lb02抓包查看
tcpdump-nn-ianyhost224.0.0.18
3.lb02新开一个终端,然后开启防火墙
systemctlstartfirewalld.service
4.lb02观察抓包现象
观察是否两边都有VIP
5.添加放行规则
firewall-cmd--direct--permanent--add-ruleipv4filterINPUT0--in-interfaceeth0--destination224.0.0.18--protocolvrrp-jACCEPT firewall-cmd--direct--permanent--add-ruleipv4filterINPUT0--in-interfaceeth1--destination224.0.0.18--protocolvrrp-jACCEPT systemctlreloadfirewalld
6.lb02观察抓包现象
观察是否两边都有VIP
第六章:keepalived双主实验
1.lb01配置文件
[root@lb01~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb01 } vrrp_instanceVI_1{ stateMASTER interfaceeth0 virtual_router_id50 priority150 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } } vrrp_instanceVI_2{ stateBACKUP interfaceeth0 virtual_router_id51 priority100 advert_int1 authentication{ auth_typePASS auth_pass2222 } virtual_ipaddress{ 10.0.0.4 } }
2.lb02配置文件
[root@lb02~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb02 } vrrp_instanceVI_1{ stateBACKUP interfaceeth0 virtual_router_id50 priority100 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } } vrrp_instanceVI_2{ stateMASTER interfaceeth0 virtual_router_id51 priority150 advert_int1 authentication{ auth_typePASS auth_pass2222 } virtual_ipaddress{ 10.0.0.4 } }
3.重启keepalived并观察现象
systemctlrestartkeepalived
第七章:keepalived结合nginx反向代理负载均衡
lb服务器的Nginx配置:
注意!两台lb服务器的Nginx配置一模一样
1.备份原有配置
mkdir/backup cd/etc/nginx/conf.d mv*/backup
2.编写Nginx配置文件
[root@lb01/etc/nginx/conf.d]#catproxy.conf upstreamweb_pools{ server172.16.1.7; server172.16.1.8; } server{ listen80; server_name(www|bbs).mysun.com; location/{ proxy_passhttp://web_pools; includeproxy_params; } }
3.测试并重启nginx
nginx-t systemctlrestartnginx
lb服务器的keepalived配置:
1.lb01的keepalived配置
[root@lb01~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb01 } vrrp_instanceVI_1{ stateMASTER interfaceeth0 virtual_router_id50 priority150 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } }
2.lb02的keepalived配置
[root@lb02~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb02 } vrrp_instanceVI_1{ stateBACKUP interfaceeth0 virtual_router_id50 priority100 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } }
web服务器配置:
注意!两台web服务器配置一模一样
1.nginx配置
[root@web01~]#cat/etc/nginx/conf.d/www.conf server{ listen80; server_namewww.mysun.com; location/{ root/code; indexwww.html; } }
2.写入测试文件
echo"$(hostname)">/code/index.html
第八章:防裂脑脚本
1.问题现象:
1.nginx挂了,但是keep还活着
2.两边都有VIP
2.思路:
解决nginx挂了问题:
1.编写一个脚本
- 启动nginx
- 如果启动2次都失败了,停掉自己的keepalived
2.keepalived定时去调用这个脚本
3.实现:
1.命令如何实现
systemctlstartnginx
2.检查nginx进程
[root@lb01~]#ps-ef|grepnginx|grep-v"grep" root12101011:21?00:00:00nginx:masterprocess/usr/sbin/nginx-c/etc/nginx/nginx.conf nginx12111210011:21?00:00:00nginx:workerprocess [root@lb01~]#ps-ef|grepnginx|grep-v"grep"|wc-l 2 [root@lb01~]#ps-ef|grepnginx|grep-v"grep"|wc-l 0
脚本内容:
[root@lb01~]#catcheck_web.sh !/bin/bash nginx_status=$(ps-Cnginx--no-header|wc-l) if[[${nginx_status}==0]] then systemctlstartnginx&>/dev/null sleep1 nginx_status=$(ps-Cnginx--no-header|wc-l) if[[${nginx_status}==0]] then systemctlstopkeepalived fi fi
keepalived调用脚本:
[root@lb01~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb01 } vrrp_scriptcheck_web{ script"/server/scripts/check_web.sh" interval5 weight50 } vrrp_instanceVI_1{ stateMASTER interfaceeth0 virtual_router_id50 priority150 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } track_script{ check_web } }
4.第二个问题:脑裂问题
两边都有VIP
现象:
2边都有VIP
2边Nginx都活着
对面的MASTER的Nginx还活着
curl-I-s-w"%{http_code}\n"-o/dev/null10.0.0.5
但是我又有了VIP
ipa|grep"10.0.0.3"|wc-l
我就把自己干掉
systemctlstopnginx systemctlstopkeepalived
脚本内容:
[root@lb02/server/scripts]#catcheck_vip.sh #!/bin/bash master_status=$(curl-I-s-w"%{http_code}\n"-o/dev/null10.0.0.5) my_vip=$(ipa|grep"10.0.0.3"|wc-l) if[${master_status}==200-a${my_vip}==1] then systemctlstopnginx systemctlstopkeepalived fi
keepalived配置:
[root@lb02~]#cat/etc/keepalived/keepalived.conf global_defs{ router_idlb02 } vrrp_scriptcheck_web{ script"/server/scripts/check_web.sh" interval5 weight50 } vrrp_scriptcheck_vip{ script"/server/scripts/check_vip.sh" interval5 weight50 } vrrp_instanceVI_1{ stateBACKUP interfaceeth0 virtual_router_id50 priority100 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ 10.0.0.3 } track_script{ check_web check_vip } }
到此这篇关于Keepalived实现Nginx负载均衡高可用的示例代码的文章就介绍到这了,更多相关KeepalivedNginx负载均衡高可用内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!