keepalive

keepalive起初专门为lvs负载均衡软件设计的,用来管理监控lvs集群系统中各个服务节点的状态,后来又加入了可以实现高可用的vrrp功能。

keepalive软件通过vrrp协议实现高可用功能的。VRRP(虚拟路由器冗余协议)目的就是为了解决静态路由单点故障问题,竞选机制来将路由的任务交给某台VRRP路由器的,保证节点宕机,整个网络可以不间断的运行

  Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。

Keepalived高可用简单原理

  master端的vrrp路由器会一直发送vrrp广播包,buckup会一直收到广播包,buckup不会抢占master资源,在backup上会一直监听,一旦收不到master的包,在多台backup中优先级最高的就会抢占为master

keepalive服务的三个重要功能

  1、  管理LVS负载均衡软件

  2、  实现对LVS集群节点健康检查功能

  3、  作为系统网络服务的高可用功能

1、keepalive的配置文件

! Configuration File for keepalived
global_defs {         #全局定义
notification_email {         #出问题了收件人
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Cassen@firewall.loc #发件人
smtp_server 192.168.200.1         #发件服务器地址
smtp_connect_timeout        #超时时间
router_id LVS_DEVEL          #唯一标识,不同机器不能一样
} vrrp_instance VI_1 {             #vrrp实例,名字可以自定义,与前面关键字空格隔开
state MASTER          #标识是主还是备,一定要大写
interface eth0         #默认的通信的接口,当vip不指定时,默认绑定它
virtual_router_id         #实例的ID(主备必须一样,同一文件唯一,-)
priority          #真正确定谁优先地方,数字越大,级别越高,越先获取资源,建议隔50
advert_int          #心跳间隔
authentication {         #实例认证,主备一样
auth_type PASS
auth_pass
}
virtual_ipaddress { #VIP地址
192.168.200.16
192.168.200.18/ dev eth0 label eth0:
}
}

2、keepalive+nginx双主实战

2.1、nginx配置

在实际工作中有三个域名

www.etiantian.org

blog.etiantian.org

bbs.etiantian.org

它们的访问量都很大,可以配置不同的ip来结合keepalived进行负载,先用两个域名来测试:

10.0.0.3 www.etiantian.org

10.0.0.4 blog.etiantian.org

目地:在初始阶段,两不不同域名的服务跑在不同的机器上,(实际是互为主备的配置)

lb1:
10.0.0.3 www.etiantian.org
lb2:
10.0.0.4 blog.etiantian.org

keepaived沿用上面互为主备的配置

以下是nginx的配置(分别在两台lb上做)

所需要做的就是监听ip

 [root@LB01 conf]# cat nginx.conf
worker_processes ;
events {
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ;
upstream backend {
server 172.16.1.8: weight=;
server 172.16.1.7: weight=;
check interval= rise= fall= timeout= type=http;
}
server {
listen 10.0.0.3:; #这里要监听ip
server_name blog.etiantian.org;
location / {
proxy_pass http://backend; #这加一定要加这个抛的字段,否则访问就访问成负载的主页了
include proxy.conf;
}
location /status {
check_status;
access_log off;
}
}
server {
listen 10.0.0.4:;
server_name blog.etiantian.org;
location / {
proxy_pass http://backend;
include proxy.conf;
}
location /status {
check_status;
access_log off;
}
}
}

2.2、keepalive配置文件

LB01:

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
@qq.com
}
notification_email_from @qq.com
smtp_server 192.168.200.1
smtp_connect_timeout
router_id LVS_lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.3/ dev eth0 label eth0:
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.4/ dev eth0 label eth0:
}
}

LB02:

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
@qq.com
}
notification_email_from @qq.com
smtp_server 192.168.200.1
smtp_connect_timeout
router_id LVS_lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.3/ dev eth0 label eth0:
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.4/ dev eth0 label eth0:
}
}

3、脑裂原因

一般来说脑裂问题有以下这几种原因:

  1. 高可用服务器对之间心跳线链路发生故障,导致无法正常通信

心跳线坏了(包括断了,老化)、

网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)

心跳线之间的设备故障(网卡及交换机)、

仲裁的机器出现问题(才用仲裁的方案)

  1. 高可用服务器上开启了iptables防火墙,阻止了心跳传消息输
  2. 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  3. 其他服务配置不当的原因,如心跳方式不同,心跳广播冲突,软件bug等

提示keepalive配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致脑裂问题

4、脑裂方案

在实际生产环境中,我们从以下方面防止脑裂:

  1. 同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
  2. 当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
  3. 做好对脑裂的监控报警

解决常见方案:

  1. 如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
  2. 可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
  3. 开发检测程序通过监控软件检测脑裂

5、nginx配置文件监听的网卡上不存在IP地址问题

报错:

[root@LB01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6./conf/nginx.conf syntax is ok
nginx: [emerg] bind() to 10.0.0.4: failed (: Cannot assign requested address)
nginx: configuration file /application/nginx-1.6./conf/nginx.conf test failed

配置好后,出现无法绑定ip10.0.0.4:80,这是由于本地没有这个ip造成的,而这个ip是需要keepalived来生的,这样就无法进行配置nginx。

解决方法:

echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p #生效

通过这个命令,系统就允许配置一个当前不存在的辅助ip

[root@LB01 ~]# /application/nginx/sbin/nginx -s stop   #平滑重启没用,要关掉重启
[root@LB01 ~]# /application/nginx/sbin/nginx
[root@LB01 ~]# netstat -ntpl|grep nginx
tcp 10.0.0.4: 0.0.0.0:* LISTEN /nginx
tcp 10.0.0.3: 0.0.0.0:* LISTEN /nginx

用来访问的机器上做解析访问检查

vim /etc/hosts

10.0.0.3  www.etiantian.org

10.0.0.4  blog.etiantian.org

用户在进行访问体验是没有什么不同的,web服务器也没有一点变动,只是实现了负载均衡器流量的分流,

这样做的好处是平均负载的压力,但是注意的是负载的能力,因为当其中一台宕机了,另一台马上起另一个vip接管资源,压力太大就是雪崩。

6、开发监听脑裂的脚本

keepalived是服务器级别的,只监控服务器,nginx宕机了,是没有办法接管的

cat /server/scripts/check_nginx_by_keep.sh
#!/bin/sh
while true
do
if [ `netstat -lntup|grep nginx|wc -l` -ne ];then
/etc/init.d/keepalived stop
fi
sleep
done
 

当负载器上出现nginxr的监听ip大于1时(或写做-eq 0 ,即等于0时),就杀掉keepalived进程,这样来实现web服务如nginx挂掉接管资源

7、指定日志输出文件

1、/etc/sysconfig/keepalived 
修改为  KEEPALIVED_OPTIONS="-D -d -S 0"

2、/etc/rsyslog.conf

修改为  *.info;mail.none;authpriv.none;cron.none;local0.none    /var/log/messages
最后加  local0.*                                                /var/log/keepalived.log
3、重启
/etc/init.d/rsyslog restart
/etc/init.d/keepalived restart

keepalive和脑裂问题的更多相关文章

  1. keepalive脑裂的处理,从节点发现访问的虚拟IP就报警,同时尝试发送内容到主节点服务器关闭keepalive和nginx,或者关机

    解决keepalived脑裂问题   检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: 1 2 3 4 5 6 7 8 9 10 ...

  2. centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课

    centos   HA高可用集群  heartbeat搭建 heartbeat测试  主上停止heartbeat服务  测试脑裂  两边都禁用ping仲裁  第三十二节课 heartbeat是Linu ...

  3. [译]如何防止elasticsearch的脑裂问题

    本文翻译自blog.trifork.com的博文 地址是http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem- ...

  4. 如何防止ElasticSearch集群出现脑裂现象(转)

    原文:http://xingxiudong.com/2015/01/05/resolve-elasticsearch-split-brain/ 什么是“脑裂”现象? 由于某些节点的失效,部分节点的网络 ...

  5. 高可用性中的脑裂问题(split-brain problem in HA)(转)

    欢迎关注我的社交账号: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://gith ...

  6. Zookeeper 脑裂

    转自 http://blog.csdn.net/u010185262/article/details/49910301 Zookeeper zookeeper是一个分布式应用程序的协调服务.它是一个为 ...

  7. AIX下解决POWERHA的脑裂问题

    一.安装创建并发vg时必需的软件包clvm包,该包安装.升级.后必须重启os clvm包的描述:Enhanced Concurrent Logical Volume Manager 软件包在aix61 ...

  8. Elasticsearch笔记八之脑裂

    Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...

  9. ZooKeeper 03 - ZooKeeper集群的脑裂问题 (Split Brain问题)

    目录 1 ZooKeeper的主从机制 2 什么是ZooKeeper的脑裂 2.1 脑裂现象的表现 2.2 为什么会出现脑裂 3 ZooKeeper如何解决"脑裂" 3.1 3种可 ...

随机推荐

  1. C#中各种集合类比较

    数组(Array)的不足(即:集合与数组的区别) 1. 数组是固定大小的,不能伸缩.虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是 ...

  2. 常用maven 仓库地址

    maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...

  3. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  4. ubuntu更新出错--Could not get lock /var/lib/dpkg/lock

    ubuntu在vps上安装好后,通常第一个命令是更新系统软件.然而在运行的过程中,却出现这样的错误: E: Could not get lock /var/lib/dpkg/lock - open ( ...

  5. 设置CentOS控制台分辨率图文详解

    最小化安装CentOS,默认是没有图形界面的,这个正合我意.但是命令行界面很小,会有很多输出被迫换行写,影响美观. 那么,怎样调整终端分辨率呢 解决方案:修改引导程序配置 /boot/grub/gru ...

  6. Atitit.软件仪表盘(0)--软件的子系统体系说明

    Atitit.软件仪表盘(0)--软件的子系统体系说明 1. 温度检测报警子系统 2. Os子系统 3. Vm子系统 4. Platform,业务系统子系统 5. Db数据库子系统 6. 通讯子系统 ...

  7. LINK : fatal error LNK1104

    今天本来想试试opencv的,于是就在自己的机子上部署一下试试,结果一直遇到这个错误:LINK : fatal error LNK1104 环境:win7 64位 vs2012 opencv 2.4. ...

  8. CodeForces 459D Pashmak and Parmida's problem

    Pashmak and Parmida's problem Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  9. 基于HTML5 Canvas 实现的 Loading 效果

    Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...

  10. 利用|,&,^,~,<<,>>>写出高效艺术的代码

    简单介绍: 大家在阅读源代码的时候常常会看到一些比方以下这样特别难理解的代码. cancelEvent.setAction(MotionEvent.ACTION_CANCEL | (motionEve ...