nginx+keepalived
介绍
Keepalived软件起初是专门为LVS负载均衡软件设计的用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的
VRRP原理
1.master在工作状态会不断群发一个广播包(内涵优先参数)
2.其他路由收到收到广播后会和自己的优先参数作对比,如果优先参数小于自己则什么都不执行,如果优先参数大于自己则开启争抢机制
3.如果启动了争抢机制,他就会群发自己的优先参数,最终优先参数最小的称为master路由.
keepalived的三个核心模块
core核心模块 chech健康监测 vrrp虚拟路由冗余协议
Keepalived服务的三个重要功能
1.管理LVS 2.对LVS集群节点检查 3.作为系统网络服务的高可用功能
#其中3高可用可作为任意网络功能
Keepalived高可用故障切换转移原理
Keepalived高可用故障切换,是通过VRRP虚拟路由器冗余协议来实现的。
在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息,备节点无法检测到来自主Master节点心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
keepalived搭建
yum -y install keepalived #安装keepalived rpm -qa vim /etc/keepalived/keepalived.conf #修改主keepalived配置文件
yum -y install openssh-clients #安装scp scp /etc/keepalived/keepalived.conf root@192.168.50.149:/etc/keepalived/ #发从给从
/etc/init.d/keepalived start #启动keepalived service keepalived stop
Keepalived配置文件说明
主
! Configuration File for keepalived global_defs { #全局定义部分 notification_email { #设置警报邮箱 acassen@firewall.loc #邮箱 failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #设置发件人地址 smtp_server 192.168.50.1 #设置smtp server地址 smtp_connect_timeout 30 #设置smtp超时连接时间 以上参数可以不配置 router_id LVS_DEVEL #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的 /etc/hosts } vrrp_instance VI_1 { #VRRP实例定义区块名字是VI_1 state MASTER #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符ASTER为正式工作的状态,BACKUP为备用的状态 interface eth0 ## ifconfig ethXXX virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的. priority 100 #priority为优先级 越大越优先 advert_int 1 #为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1. authentication { #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址 192.168.50.16 #此格式ip a显示 ifconfig不显示 192.168.50.17/24 dev eth0 label eth0:1 #绑定接口为eth0,别名为eth0:1 } #至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除 #以下为虚拟服务器定义部分 virtual_server 192.168.50.16 80 { #设置虚拟服务器,指定虚拟IP和端口 delay_loop 6 #健康检查时间为6秒 lb_algo rr #设置负载调度算法 rr算法 lb_kind NAT #设置负载均衡机制 #有NAT,TUN和DR三种模式可选 nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号 persistence_timeout 50 #连接保留时间,50秒无响应则重新分配节点 protocol TCP #指定转发协议为TCP real_server 192.168.5.150 80 { #RS节点1 weight 1 #权重 TCP_CHECK { #节点健康检查 connect_timeout 8 #延迟超时时间 nb_get_retry 3 #重试次数 delay_before_retry 3 #延迟重试次数 connect_port 80 #利用80端口检查 } } real_server 192.168.50.149 80 { #RS节点2 weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
配置完毕后启动keepalived 并检测是否有虚拟端口
/etc/init.d/keepalived start ip a | grep 192.168.50.16 #出现上述带有vip:192.168.50.16行的结果表示lb01的Keepalived服务单实例配置成功
从
! Configuration File for keepalived global_defs { notification_email { 215379068@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 #此参数和lb01 MASTER不同 } vrrp_instance VI_1 { #和lb01 MASTER相同 state BACKUP #此参数和lb01 MASTER不同 interface eth0 #和lb01 MASTER相同 virtual_router_id 55 #和lb01 MASTER相同 priority 90 #此参数和lb01 MASTER不同 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.50.17/24 dev eth0 label eth0:1 } } #以下都相同
配置完成后,启动Keepalived服务 并模拟实验 主从vip漂移(只需开启关闭主 .关闭主,主VIP消失从显示VIP ,开启主 从VIP消失,主VIP显示)
Keepalived单实例与多实例
单实主备配置文件的不同
router_id dd1 router_id dd2 路由标识
state MASTER state BACKUP 主备状态
priority 100 priority 90 优先级
Keepalived双实例双主模式配置
启动两个vrrp vrrp_instance VI_1和vrrp_instance VI_2 让他俩互为主从.
解决高可用服务只针对物理服务器的问题
Keepalived软件仅仅在对方机器宕机或Keepalived停掉的时候才会接管业务。但在实际工作中,有业务服务停止而Keepalived服务还在工作的情况,这就会导致用户访问的VIP无法找到对应的服务
实现方法1.可以写守护进程脚本来处理,。当服务有问题时,就停掉本地的Keepalived服务,实现IP漂移到对端继续提供服务。
例 nginx高可用
#!/bin/sh while true do if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done #此脚本的基本思想是若没有80端口存在,就停掉Keepalived服务实现释放本地的VIP。在后台执行上述脚本并检查:
第二个方法:可以使用Keepalived的配置文件参数触发写好的监测服务脚本。首先要开发检测服务脚本,注意这个脚本与上一个脚本的不同。
#!/bin/bash if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi
在keepalived的配置文件加入以下模块
vrrp_script chk_nginx_proxy { #定义vrrp脚本,检测HTTP端口 script "/server/scripts/chk_nginx_proxy.sh" #执行脚本,当Nginx服务有问题,就停掉Keepalived服务 interval 2 #间隔2秒 weight 2
解决多组Keepalived服务器在一个局域网的冲突问题
当在同一个局域网内部署了多组Keepalived服务器对,而又未使用专门的心跳线通信时,可能会发生高可用接管的严重故障问题。之前已经讲解过Keepalived高可用功能是通过VRRP协议实现的,VRRP协议默认通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组Keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的Keepalived都会使用默认的224.0.0.18作为多播地址。此时的解决办法是,在同组的Keepalived服务器所有的配置文件里指定独一无二的多播地址,配置如下:
global_defs { #全局配置 router_id LVS_19 #服务标识 vrrp_mcast_group4 224.0.0.19 #这个就是指定多播地址的配置 } #提示: 1)不同实例的通信认证密码也最好不同,以确保接管正常。 2)另一款高可用软件Heartbeat,如果采用多播方式实现主备通信,同样会有多播地址冲突问题。
开发检测Keepalived裂脑的脚本
在备节点上执行脚本,如果可以ping通主节点并且备节点有VIP就报警,让人员介入检查是否裂脑。
#!/bin/bash lb01_vip=192.168.0.240 lb01_ip=192.168.0.221 while true do ping -c 2 -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then echo "ha is split brain.warning." else echo "ha is OK" fi sleep 5 done
可以将此脚本整合到Nagios或Zabbix监控服务里,进行监控报警。