备胎的养成记KeepAlived实现热备负载-阿里云开发者社区

开发者社区> james8888> 正文

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

简介:   在  入坑系列之HAProxy负载均衡 中已经详细讲过了怎么将高并发的请求按均衡算法分发到几台服务器上做均衡防止单机崩溃。   但这样的话有没有发现所有请求都经过了HAproxy代理,自然当并发量越来越高时HAproxy就成了瓶颈,突发时HAproxy就会挂掉,或HAproxy服务器出现故障,这时外部唯一的请求入口没有了,怎么办?重启是个办法,但还是需要抢修时间,这期间内客户都无法访问损失的锅又得程序猿来背。
+关注继续查看

  在  入坑系列之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 #重启
service keepalived enable #开机启动

测试

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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6904 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4478 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5456 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
443 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3227 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16815 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
1129 0
+关注
james8888
专注商城、APP架构设计及开发,主导高并发分布式负载均衡、Hadoop批处理、Spark流式实时大数据处理架构设计,公众号[一个码农的日常]
264
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载