设为首页 收藏本站
查看: 777|回复: 0

[经验分享] 备胎的养成记KeepAlived实现热备负载

[复制链接]

尚未签到

发表于 2017-6-4 09:48:20 | 显示全部楼层 |阅读模式
  在  入坑系列之HAProxy负载均衡 中已经详细讲过了怎么将高并发的请求按均衡算法分发到几台服务器上做均衡防止单机崩溃。
  但这样的话有没有发现所有请求都经过了HAproxy代理,自然当并发量越来越高时HAproxy就成了瓶颈,突发时HAproxy就会挂掉,或HAproxy服务器出现故障,这时外部唯一的请求入口没有了,怎么办?重启是个办法,但还是需要抢修时间,这期间内客户都无法访问损失的锅又得程序猿来背。
DSC0000.png

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

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

DSC0001.png

  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、安装包;
  此处按照下载好的安装包操作:



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

[iyunv@H32 keepalived-1.3.4]#./configure --prefix=/usr/ --sysconfdir=/etc/
[iyunv@H32 keepalived-1.3.4]#make
[iyunv@H32 keepalived-1.3.4]#make install
  在此之前还需要设置主备机的时间一致,可用ntpdate向时间服务器同步,具体的方法有时间再详细说明。

设置
  修改keepalived.conf文件配置



[iyunv@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:



[iyunv@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



[iyunv@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 #重启

service keepalived enable #开机启动
测试
  down掉主机的haproxy,查看haproxy监控访问VIP:192.168.80.32:8089/stats,看haproxy的ID是否有变化,然后重启主机的haproxy,再看haproxy的ID是否有变化。
  执行ip a查看VIP在两台机子上有变化



[iyunv@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 #重启防火墙使配置生效

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-383382-1-1.html 上篇帖子: 【Rsync项目实战一】备份全网服务器数据 下篇帖子: Linux命令工作中常用总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表