Keepalived

当前负载均衡软件使用最广泛的就数 Nginx、LVS、HAProxy这三个了,通常都会结合keepalived做心跳检查,防止单点故障,实现故障迁移。
 
keepalived简介  
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
类似的HA工具还有heatbeat、drbd等,heatbeat、drbd配置都较为复杂。
 
keepalived工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
keepalived是一个类似于layer3, 4,5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
 
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
 
vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
 
好,下面就来看下keepalived从安装到配置的部署:
 
环境概况:
之前部署haproxy的时候,已经涉及到四台机器了,这我们再从后端服务器中抽一台作为第二台haproxy,那也就是,两台ha,两台真实服务器,其中两台ha做keepalived!
192.168.75.60                Haproxy      keepalived
192.168.75.61                Haproxy      keepalived
192.168.75.62                             realserver
192.168.75.63                            realserver
 
60的haproxy已经部署好了,这里接着部署61服的haproxy,脚本写好了,但是在跑的过程中会报错,原因是配置文件中,本机原来是作为真实服务器的,这里要在定义真实服务器的时候,把本机IP去掉!
所以注意,针对每台部署都要个性化修改的服务,不要着急把脚本里开起来,需要对当前环境做适配,再酌情修改执行!
这里两台haproxy的配置文件看下:
master:
[root@VM-75-60 haproxy]# cat haproxy.cfg
global
        uid 451
        gid 451
        log 127.0.0.1 local0
        log 127.0.0.1 local1 notice
        daemon
        maxconn 8192
 
defaults
        timeout connect         3500
        timeout queue           11000
        timeout tarpit          12000
        timeout client          30000
        timeout http-request    40000
        timeout http-keep-alive 5000
        timeout server          40000
        timeout check           7000
 
        mode http               #Haproxy工作模式,四层工作模式为TCP
        option forwardfor       #使后端服务器获取客户端的真实IP
        option httplog
        option dontlognull
        option abortonclose  #当服务器负载过高时,将自动关闭队列中处理时间较长的连接请求
        retries 3          #服务器连接失败后的重试次数
        option redispatch  #如果cookie中写入ServerID而客户端不会刷新Cookie,那么当ServerID对应的服务器宕机后,将强制定向到其它健康的服务器上
        #balance source  #开启以IP为对象的负载均衡策略,同一IP的所有请求都发送到同一后端节点服务器
 
listen admin_stats
        stats enable
        bind *:8080
        mode http
        option httplog
        log global
        maxconn 10
        stats refresh 30s       #页面刷新间隔为5s
        stats uri /stats        #访问地址为:http://192.168.75.60:8080/stats
        stats realm haproxy
        stats auth admin:admin  #登录使用的用户名与密码
        stats hide-version      #隐藏haproxy版本号
        stats admin if TRUE
 
################################
frontend c2
        bind *:80
        log global
        mode http
        option httplog
 
        acl is_dg hdr_beg(host) dg.test.com
 
        use_backend dgserver if is_dg                 #重点依旧是这里的dg.test.com
 
        default_backend c2b0            #默认的后端服务器组
 
4
        mode http
        log global
        balance roundrobin              #负载均衡算法为轮询
        server s1 124.156.208.65:80 maxconn 2048 weight 1 check inter 2000 rise 2 fall 3
        server s2 124.156.209.179:80 maxconn 2048 weight 1 check inter 2000 rise 2 fall 3
 
backend c2b0
        mode http
        log global
        balance roundrobin
        server s1 124.156.208.90:80 maxconn 2048 weight 1 check inter 2000 rise 2 fall 3
 
listen 80
        bind 0.0.0.0:80
        mode http
        log global
        balance roundrobin
        server web1 124.156.208.65:80 maxconn 2048 weight 3 check inter 2000 rise 2 fall 3
        server web2 124.156.209.179:80 maxconn 2048 weight 3 check inter 2000 rise 2 fall 3
 
这里game服的haproxy配置文件就跟这里一样了,略过~
同时开启进程:
haproxy -f /usr/local/haproxy/haproxy.cfg
两台都开起来,并绑定hosts,测试,两台是不是都能达到负载均衡的效果,这里亲测有效!监控界面也没有问题!

下面就是keepalived!
 
安装:
这里有源码包,但是没必要手动编译了,yum就能解决!
前提是要安装了最新的仓库:
rpm -ivh epel-release-6-8.noarch.rpm
yum install -y keepalived
[root@VM_0_10_centos ~]# keepalived -v
Keepalived v1.2.13 (03/19,2015)
默认装的是1.2.13版本!
 
这里把源码编译的过程截图下供参考:
 
安装好后,在/etc/keepalived/下会有配置文件:
 
下面我们看看MASTER端的配置文件:
! Configuration File for keepalived
 
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LB01
}
 
vrrp_script chk_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 2
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.75.66          
    }
    unicast_src_ip 192.168.75.60
    unicast_peer {
        192.168.75.61
    }
}
 
BACKUP端配置文件:
[root@VM-75-61 keepalived]# cat keepalived.conf
! Configuration File for keepalived
 
global_defs {                             #全局配置
   notification_email {
     root@localhost                       #表示发送通知邮件时的源地址
   }
   notification_email_from root@localhost # 表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个
   smtp_server 127.0.0.1                  # 表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现,如果不行,能不能试试第三方邮箱服务器?
   smtp_connect_timeout 30                #链接smtp超时时间
   router_id LB02                         #机器标识,两台机器要不同
}
 
vrrp_script chk_haproxy {                    #作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
  script "/etc/keepalived/check_haproxy.sh"  #脚本位置
  interval 2                                 #定义脚本执行的时间间隔,默认1S
  weight 2                                   #调整优先级,默认为1
}
 
vrrp_instance VI_1 {                                                    
    state BACKUP                     #指定初始化节点的状态
    interface eth0                   #vrrp实例绑定的网卡接口,用于发送vrrp包
        virtual_router_id 51             #这里设置VRID,这里非常重要,相同的VRID为一个组,前后必须相同!
    priority 90                      #定义优先级,master一定要高于backup
    advert_int 1                                        
    authentication {
        auth_type PASS
        auth_pass 111111             #这边要求两台机器要一样,某种认证方式,密码最多8位
    }
    virtual_ipaddress {              #定义虚拟IP
        192.168.75.66
    }
    unicast_src_ip 192.168.75.61    #这里是指定单播对象的,否则默认是组播,而在很多云环境中,组播是不允许的,同时要注意在两台机器上配置响应的防火墙(-A INPUT -p vrrp -j ACCEPT),这里是本机IP
    unicast_peer {
        192.168.75.60               #这里是发送的目标机器IP
    }
}
 
其中,check_haproxy.sh 的内容为:
[root@VM-75-61 keepalived]# cat check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
[root@VM-75-61 keepalived]# ps -C haproxy --no-header | wc -l
0
 
好,这里keepalived的配置文件处理好了,开起来!两台都开起来,你会发现,master会虚拟出对应的IP,并且当master端关闭服务时,虚拟IP会自动转移到backup上!亲测有效!同时在部署的时候,我们能够用vrrp的抓包指令看二者的交互情况:
[root@VM-75-61 keepalived]# tcpdump -i eth0 vrrp -n

 
后端真实服务器的nginx的部署这里就不说了;
在开启keepalived之后,
 
把dg.test.com绑定到虚拟IP,修改本机hosts文件,经过测试是能够实现故障转移的!
但是在云环境中,目前腾讯云havip功能还在公测中,期待后面上线后的效果!
 
 

以上, 共勉!

 
posted @ 2020-08-01 12:09  一个运维  阅读(286)  评论(0编辑  收藏  举报