备胎的养成记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}" = "" ]; then
/etc/init.d/haproxy start status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l) if [ "${status2}" = "" ]; 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 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 #重启防火墙使配置生效
备胎的养成记KeepAlived实现热备负载的更多相关文章
- Keepalived双机热备
一,Keepalived双机热备的应用场景 1,网站流量不高,压力不大,但是对服务器的可靠性要求极其高,例如实时在线OA系统,政府部门网站系统,医院实时报医系统,公安局在线报案系统,股市后台网站系统等 ...
- Nginx+keepalived双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡
前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...
- keepalived双机热备nginx
nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽 ...
- Nginx+keepalived 双机热备(主主模式)
之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...
- keepalived双机热备,安装部署文档
keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...
- keepalived+nginx双机热备+负载均衡
Reference: http://blog.csdn.net/e421083458/article/details/30092795 keepalived+nginx双机热备+负载均衡 最近因业务扩 ...
- 【Nginx】如何基于主从模式搭建Nginx+Keepalived双机热备环境?这是最全的一篇了!!
写在前面 最近出版了<海量数据处理与大数据技术实战>,详情可以关注 冰河技术 微信公众号,查看<我的<海量数据处理与大数据技术实战>出版啦!>一文. 也有不少小伙伴 ...
- Nginx+keepalived双机热备(主从模式)
负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行.关于负载均衡介绍,可以参考:linux负载 ...
随机推荐
- Varnish+Xcache构建高性能WEB构架初探
本文主要讲述web优化方案和缓存工具的调研及使用.根据目前的测试结果来看,采用varnish+xcache作为 apache和 php缓存这种架构具有高并发.高稳定性,易扩展等优点,服务器的动态请求处 ...
- 深入理解Java Proxy
深入理解Java Proxy: http://blog.csdn.net/rokii/article/details/4046098 整理之后的代码: package com.stono.reftes ...
- ORA-02266: 表中的唯一/主键被启用的外键引用
http://www.cnblogs.com/cici-new/archive/2013/01/01/2841700.html 需要如下操作 先取消子表外键的外键约束,之后删除父表数据,最后再次启用外 ...
- Java泛型在spring jdbc template中的类似应用
泛型的使用保证返回的对象类型的正确: package com.stono.gentest; import java.util.ArrayList; import java.util.List; pub ...
- nodejs 中使用 mocha + should + jscoverage 生成 单元测试覆盖率报告
最近一直在做nodejs,而关于js的单元测试覆盖率网上资料比较少而且吧比较零散,我从网上找来一些资料整理一下分析给大家,希望大家可以少走弯路. 首先我是从windows环境下测试的,用到的工具有 m ...
- 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务
昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...
- C++ Primer 笔记 第三章
C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...
- webservice_模拟报文测试
一.WebService测试小工具STORM 二.利用MyEclipse的WebService视图调用webservice Ø 除了客户端生成代码编写程序调用之外.还可以用MyEclipse提供 ...
- mybatis入门-框架原理
mybatis是什么 在说mybatis原理之前,我们有必要知道,mybatis到底是个什么东西.mybatis是一个持久层的框架.是一个不完全的ORM框架.因为它需要由程序员自己去写sql语句.但是 ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...