备胎的养成记KeepAlived实现热备负载

  在  入坑系列之HAProxy负载均衡 中已经详细讲过了怎么将高并发的请求按均衡算法分发到几台服务器上做均衡防止单机崩溃。

  但这样的话有没有发现所有请求都经过了HAproxy代理,自然当并发量越来越高时HAproxy就成了瓶颈,突发时HAproxy就会挂掉,或HAproxy服务器出现故障,这时外部唯一的请求入口没有了,怎么办?重启是个办法,但还是需要抢修时间,这期间内客户都无法访问损失的锅又得程序猿来背。

  这种情况下备胎出现了, Keepalived登场,他可以解决服务宕机自动无缝切换。

Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。 keepalived 默认需要使用D类多播地址224.0.0.18 进行心跳通信 keepalived 使用vrrp协议(虚拟路由冗余协议)进行通信(协议号码为112)

  Keepalived也可以与LVS、Nginx、MySQL等结合使用,形成可靠的主备机,给了你宝贵的抢修时间。

  下面来讲如何一步步搭建。

环境  

  CentOS6.X

  HAProxy 1.7.3

  Keepalived 1.3.4

  用root用户安装

下载

  若在线安装不用下载,可直接通过yum命令安装(建议),不过需要联网。

  去官网下载 :http://www.keepalived.org/software/keepalived-1.3.4.tar.gz

  下载后放进CentOS中的/usr/local/ 文件夹中

安装   

  分两种:

  1、在线装:yum install -y ipvsadm keepalived (建议)

  2、安装包;

  此处按照下载好的安装包操作:

[root@H32 local]#tar -zxvf keepalived-1.3.4.tar.gz
[root@H32 local]#cd keepalived-1.3.4

[root@H32 keepalived-1.3.4]#./configure --prefix=/usr/ --sysconfdir=/etc/
[root@H32 keepalived-1.3.4]#make
[root@H32 keepalived-1.3.4]#make install

  在此之前还需要设置主备机的时间一致,可用ntpdate向时间服务器同步,具体的方法有时间再详细说明。

设置

   修改keepalived.conf文件配置

[root@H32 ~]# vi /etc/keepalived/keepalived.conf

  具体配置内容:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost #接受邮件方
   }
   notification_email_from soul@104.com #发件人
   smtp_server 127.0.0.1 #邮件服务器
   smtp_connect_timeout 30 #超时时长
   router_id LVS_DEVEL #ID;随意即可
}

vrrp_script chk_state_down {
    script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #如果在/roo/下有down文件;就失败;转移到从上;否则正常
    interval 2
    weight 3
}

vrrp_script chk_haproxy { 
  script "/etc/keepalived/chk_haproxy.sh" # 设置执行的脚本,可以是脚本,也可以是命令
  interval 2 # script执行周期,每个interval执行一次健康检查
  weight 2 # 健康检查返回0 & weight大于0,优先级增加相应权值;健康检查非0 & weight小于0,优先级减小相应值;
      # 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
}

vrrp_instance VI_1 { # VRRP 配置标识 VI_1是实例名称,一个文件可配置多个
    state MASTER  # 指定Keepalvied角色 MASTER表示此主机为主服务器 BACKUP则是表示为备用服务器
                  # 当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。
           # 实际应用中,可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt(非抢占)解决异常恢复后再次抢占的问题。
    interface eth0 # 节点固有IP(非VIP)的网卡,用来发VRRP包
    virtual_router_id 111  # 虚拟路由标识(0-255),同一个VRRP实例使用唯一的标识,DB中的规范是使用节点IP的最后一位。如10.10.16.51的51 (主备相同)
    priority 100  # 节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。如果某个节点初始state是master,但是优先级低,该节点会变成backup
    advert_int 1  # 发送通告的时间间隔,
                   # 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
    authentication {
        auth_type PASS
        auth_pass 1111   # 同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信 (主备相同)
    }
    virtual_ipaddress {
        192.168.80.114  # 设置虚拟IP地址 (VIP),又叫做漂移IP地址 可以有多个,每个一行 (主备机必须相同,也是对外的虚拟IP)
    }
    
    track_script { 
      chk_haproxy  # 该实例需要执行的健康执行脚本,每个一行
      chk_state_down
    }
    
    notify_master "/etc/keepalived/notify.sh master 192.168.80.114"
    notify_backup "/etc/keepalived/notify.sh backup 192.168.80.114"
    notify_fault "/etc/keepalived/notify.sh fault 192.168.80.114"  # 状态切换为master/backup/fault时执行对应的脚本
}
                    

  说明:

因为Keepalived在转换状态时会依照状态来呼叫: 当进入Master状态时会呼叫notify_master 当进入Backup状态时会呼叫notify_backup 当发现异常情况时进入Fault状态呼叫notify_fault 当Keepalived程序终止时则呼叫notify_stop

  配置中notify.sh:

[root@H32 ~]# vi /etc/keepalived/notify.sh

  配置内容:

#!/bin/bash
# description: An example of notify script
#
contact='root104@localhost'
notify() { 
mailsubject="`hostname` to be $1: $2 floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
master) 
notify master 
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac

  其中chk_haproxy.sh

[root@H32 ~]# vi /etc/keepalived/chk_haproxy.sh

  添加内容:

#!/bin/bash
#
# author: weizhifeng
# description:
# 定时查看haproxy是否存在,如果不存在则启动haproxy,
# 如果启动失败,则停止keepalived
#
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
    /etc/init.d/haproxy start
 
    status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)
 
    if [ "${status2}" = "0"  ]; then
            /etc/init.d/keepalived stop
    fi
fi

将以上三个文件全部更改后 复制一份到备机;注意根据上述高亮描述进行更改。(非常重要)

  还要给chk_haproxy.sh和notify.sh执行脚本的权限。

chmod  +x  /etc/keepalived/notify.sh
chmod  +x  /etc/keepalived/chk_haproxy.sh

启动

   配置完后进行启动keepalived 和haproxy,主备机均要启动:

service keepalived start

   其它命令:

service keepalived stop #停止

service keepalived restart #重启

测试

  down掉主机的haproxy,查看haproxy监控访问VIP:192.168.80.32:8089/stats,看haproxy的ID是否有变化,然后重启主机的haproxy,再看haproxy的ID是否有变化。

   执行ip a查看VIP在两台机子上有变化

[root@H32 ~]# ip a

思考:

  虚拟IP必须与master 和 备机 在同一网段,经测试若虚拟IP与他们不在同一网段访问不了VIP。

  防止keepalived互抢IP的办法,这个也有网有提出过,有相应的方法。

  主备机互作主备,即主机也是备机,可以做配置多个实例来实现。

  有网友测试出Keepalived限制死20个VIP问题,那这个是怎么解决的。

  有时主备机都出现绑定了VIP,这时最可能的是主备机间无法通讯,最简单的测试方法是关掉两机的防火墙,再试,由于Keepalived基于vrrp 通讯,因此还需要加vrrp和防火墙:(在入坑系列之HAProxy负载均衡 中提到过)

vi /etc/sysconfig/iptables  #编辑

-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT  #允许组播地址通信(在做keepalived时用得到)
-A RH-Firewall-1-INPUT -p    vrrp    -j ACCEPT  #允许VRRP(虚拟路由器冗余协)通信
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT  #允许80端口通过防火墙
:wq! #保存退出
service iptables restart #重启防火墙使配置生效

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

高可用性方案Keepalived工作原理

随着系统架构的逐渐演化,服务器的数量和结构会越来越复杂,例如web服务器集群的搭建,提高了系统的性能,同时也提高了系统维护的复杂度,我们需要对集群中各台服务器进...

2714
来自专栏TSW

5201314对程序员意味着什么?

作为年轻人的潮流聚集地,Qzone在每个特殊的日子总会迎来一波猛烈的流量冲击。比如刚过去的520,下图是今年5月20号的流量情况:

2347
来自专栏黑白安全

iOS安全基础之钥匙串与哈希

本文最初是由Chris Lowe编写的,后来经过Ryan Ackermann(ios系统开发者)的修改,已经可以针对最新的Xcode 9.2,Swift 4,i...

1062
来自专栏小白课代表

软件分享 | AutoCAD 2009 安装教程

6、姓氏名字组织随便输,比如:公众号小白课代表最棒,输入序列号:666-69696969

832
来自专栏13blog.site

Java开源博客My-Blog之mysql容器重复初始化的严重bug修复过程

写在前面的话 My Blog项目已经开源了两个多月,也收获了不少star,在这里谢谢各位朋友的建议及帮助。由于个人原因,这个开源项目最初的定位其实是一个dock...

3587
来自专栏程序你好

一个微服务架构的简单示例

4013
来自专栏带你撸出一手好代码

开发了一个小工具

国庆因为有事,没有像朋友圈里的同学一样出去浪。闲暇时间, 为了克服平时使用电脑时的一个坏习惯,我开发了一个小工具来帮助自己。 平时使用电脑时, 我喜欢把所有东...

3018
来自专栏JAVA烂猪皮

kafka 数据可靠性深度解读

Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用。目前越来...

1391
来自专栏TEG云端专业号的专栏

解密腾讯云分布式块存储系统 : HCBS实现机制

HCBS 是一种两层架构的分布式存储,用户IO与后端存储池以直通的方式交互,两层架构的好处是将 IO 路径化繁为简,既降低了因网络通信带来的 IO 延时,同时也...

2.3K4
来自专栏北京马哥教育

万字长文带你从 0 学习 Keepalived

负载均衡器(Load Balancer, LB )是一组能够将IP数据流以负载均衡形式转发到多台物理服务器的集成软件。有硬件负载均衡器和软件负载均衡器之分,硬件...

1310

扫码关注云+社区

领取腾讯云代金券