1.1Keepalived高可用软件

Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服务(Nginx,Haproxy)的高可用软件,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。所以,keepalived以方面具有LVS Cluster nodes
healthchecks功能,另一方面也具有LVS directors failover功能。

1.1.1LVS
Directors failover功能

Ha failover功能:实现LB Master主机和Backup主机之间故障转义和自动切换。

这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡的所有工作(vip资源及相应服务)一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

1.1.2Lvs
cluster nodes healthchecks功能

1、keepalived.conf里配置就可以实现LVS功能。

2、keeplaived可以对LVS下面的集群节点做健康检查。

Rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求。

当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去,从而保证用户的访问不受影响:当故障的RS服务器被修复以后,系统又会自动地把它们加入转发队列,分发请求提供正常服务。

1.2Keeplaived故障切换转移原理介绍

Keepalived
Directors高可用对之间的故障切换转移,是通过VRRP协议(Virtual Router
Redundancy Protocol 中文虚拟路由器冗余协议)来实现的。

在Keepalived
Directors正常工作时,主Director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身备用角色。

1.3VRRP协议简单介绍

VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为Master的负责路由工作,其他的都是Backup,Master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是Master。Master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的Master要负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称为VIP)。客户端主机并不需要因为Master的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),Backup不会枪占Master,除非它的优先级(priority)更高。当Master不可用时(Backup收不到广告包),多台Backup中优先级最高的这台会被枪占为Master。这种枪占是非常快速的(<1s),以保证服务的连续性。

由于安全性考虑,VRRP包使用了加密协议进行加密。

1.4Keepalived工作原理小结

1.4.1VRRP协议介绍

1、VRRP协议,全称Virtual Router Redundancy Protocol,中文名,虚拟路由器冗余协议,VRRP的出现就是为了解决静态 的单点故障。

2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器。

3、VRRP是通过IP多播的方式实现通信。

4、主发包,备接包,当备接不到主发的包的时候,就启动接管程序接管主的资源。备可以由多个,通过优先级竞选。

5、VRRP使用加密协议。

1.4.2Keepalived工作原理

Keepalived高可用之间是通过VRRP协议通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会获得所有的资源,备节点处于等待状态,当主挂了时候,备节点,接管主节点的资源,然后顶替主节点对外提供服务。

VRRP协议是通过IP多播包的方式(224.0.0.18)发送。

在keepalived之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管的速度可以小于1秒,VRRP使用加密协议加密发送广播包。

1.5Keepalived+Nginx高可用实践

1.5.1高可用环境准备

[root@lb-node1 ~]# cat /etc/redhat-release  #查看系统版本

CentOS release 6.7 (Final)

[root@lb-node1 ~]# uname -r #查看内核版本

2.6.32-573.el6.x86_64

[root@lb-node1 ~]# getenforce #确认Selinux关闭状态

Disabled

[root@lb-node1 ~]# /etc/init.d/iptables status#确认Iptables关闭状态

iptables: Firewall is not running.

1.5.2安装Nginx web服务

yum install openssl openssl-devel pcre pcre-devel
-y

mkdir -p /home/oldboy/tools

cd /home/oldboy/tools

wget -q
http://nginx.org/download/nginx-1.6.3.tar.gz

ls -l nginx-1.6.3.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

./configure--user=nginx --group=nginx --prefix=/application/nginx-1.6.3
--with-http_stub_status_module--with-http_ssl_module

make

make install

ln -s /application/nginx-1.6.3 /application/nginx

1.5.3安装Keepalived高可用

[root@lb01 ~]#yum -y install keepalived  #lb01端安装keepalived

[root@lb02 ~]#yum -y install keepalived  #lb02端安装keepalived

1.5.4配置Master_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf  #Master
Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_01

}

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.5配置Backup_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #Backup Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_02

}

vrrp_instance VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.6Keepalived主备配置比较

主从单实例keepalived.conf配置差别项

Keepalived配置参数

Master节点特殊参数

Backup节点特殊参数

route_id(唯一标识)

route_id lb01

route_id lb02

state(角色状态)

state Master

state Backup

priority(竞选优先级)

priority 150

priority 100

1.5.7启动keepalived服务

[root@lb01 ~]# /etc/init.d/keepalived start #启动lb01上Master_keepalived

[root@lb02 ~]# /etc/init.d/keepalived start #启动lb02上Master_keepalived

1.5.8检测IP地址是否漂移

[root@lb01 ~]# ip addr|grep 10.0.0.11 #查看是否有VIP地址

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived stop #停止Master上Keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已经从Master端移除

[root@lb02 ~]# ip addr|grep 10.0.0.11 #Backup上Keepalived接管资源

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived start #启动Master_keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #Master继续接管资源

inet
10.0.0.11/24 scope global secondary eth0

1.5.9Keepalived配置文件详解

1 !
Configuration File for keepalived
#注释

2

3
global_defs {

4    notification_email {

5      acassen@firewall.loc #5-7发邮件给谁

8    }

9    notification_email_from Alexandre.Cassen@firewall.lo #发邮件发件人

10    smtp_server 192.168.200.1 #邮件服务器地址

11    smtp_connect_timeout 30 #超时时间

12    router_id Nginx_01 #主备ID不能一样

13 }

15 vrrp_instance VI_1 {  #实例名称(建议不修)

16     state MASTER #服务器的状态(仅仅是傀儡)

 17     interface eth0 #通信端口

 18     virtual_router_id 51 #实例的ID

 19     priority 150 #优先级,主备之间最好相差50

20     advert_int 1 #心跳间隔(如果一秒没通信备节点马上接管)

21     authentication {

22         auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同

23         auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同

24     }

25     virtual_ipaddress { #vip(可以多个)

 26       10.0.0.11/24 #26-28配置vIP地址,绑定在eth0  因为(interface
eth0)

29     }

30 }

q全局定义块部分:主要设置Keepalived的通知机制和标识

1、第4-9行是email通知参数。作用:当LVS发生切换或RS等有故障时,会发邮件报警。这是可选配,notifucation_email指定在keepalived发生事件时,需要发给的email地址,可以有多个,每行一个。

2smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。

3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。

4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

 

qVRRP定义块

1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。

(1)14行实例状态state.只有MasterBackup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUPMASTER恢复到BACKUP状态。

(2)通信接口interface。对外提供服务的网络结构,如eth0,eth1当前主流的服务器有2个或2个以上的网络接口,在选择服务器接口时,一定要搞清楚了。

(3)lvs_sync_daemon_interface。负载均衡器之间的监控接口,类似于HA
HeartBeat
的心跳线。

(4)16行为虚拟路由标示virtual_route_id是一致的,同时在整个keepalived内是唯一的。

(5)17行为优先级priority,这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级
BACKUP
。若MASTERpriority值为150,那么BACKUPpriority只能在149或者跟小的数值(官方建议相差50)

(6)18行同步通知间隔advert_intMASTERBACKUP负载均衡器之间同步检查的时间间隔,单位为秒。

(7)19-22行验证authentication.包含验证类型和验证密码。类型主要有PASSAH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTERBACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。

 

2、第23-27行为虚拟ip地址virtual_ipaddress。可以配置多个IP地址,每个地址占一行,需要指定子网掩码。

注意:这个ip必须与我们在lvs客户端设定的vip相一致。

1.5.10keepalived日志文件

[root@lb01 ~]#sed
-i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S
0"#g' /etc/sysconfig/keepalived #指定文件接收Keepalived服务日志

[root@lb-node1 conf]# echo -e "local0.* \t
/var/log/keepalived.log" >>/etc/rsyslog.conf  #配置至rsyslog

[root@lb-node1 conf]# tail -1 /etc/rsyslog.conf  #检查是否配置成功

local0.*/var/log/keepalived.log

[root@lb-node1 conf]# /etc/init.d/rsyslog restart  #重新启动rsyslog

Shutting down system logger:                               [  OK  ]

Starting system logger:                                [  OK  ]

1.6Keepalived+Nginx高可用多实例实践

1.6.1Master_keepalived多实例

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Master 第二个实例修改为Backup

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id
52

priority
100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.2Backup_keepalived多实例

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Backup,第二个实例修改为Backup

vrrp_instance
VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state MASTER

interface eth0

virtual_router_id
52

priority
150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.3检测多实例IP地址是否漂移

[root@lb-node1 ~]# ip addr|grep 10.0.0.11

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node1 ~]# tcpdump -n 'host 224.0.0.18'  抓包

1.7keepalived列脑解决

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并

Nginx宕机keepalived是不会接管的,需要写一个脚本检测nginx是否存活 ,如果不存货就kill nginx和keepalived

1、可以ping通主,备节点还有VIP就认为列脑  (如果停止主,脚本也会报脑裂)

[root@lb02 ~]# cat check_split_brain.sh

#!/bin/sh

lb01_vip=10.0.0.12

lb01_ip=10.0.0.7

while true

do

ping -c 2 -W 3 $lb01_ip &>/dev/null

if [ $? -eq
0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]

then

echo
"ha is split brain.warning."

else

echo
"ha is ok"

fi

sleep 5

done

1.8Keepalived常见故障解决

服务器网线松动等网络故障

服务器硬件故障发生损坏现象而崩溃

Nginx服务死掉

[root@lb01 scripts]# cat nginx_pid.sh

#!/bin/sh

while true

do

nginxpid=`ps -C nginx --no-header|wc -l`

if [ $nginxpid -eq 0 ];then

/application/nginx/sbin/nginx

sleep 5

nginxpid=`ps -C nginx --no-header|wc -l`

if [
$nginxpid -eq 0 ];then

/etc/init.d/keepalived stop

exit 1

fi

fi

sleep 5

done

学习Keepalived(三)的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  3. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  4. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  5. 三、Android学习第三天——Activity的布局初步介绍(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...

  6. JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB

    JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ...

  7. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  8. Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  9. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  10. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

随机推荐

  1. Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化

    Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...

  2. Echarts图表类型

    每个系列通过 type 决定自己的图表类型: type: 'bar':柱状/条形图 type: 'line':折线/面积图 type: 'pie':饼图 type: 'scatter':散点(气泡)图 ...

  3. Qt:QUrl

    1.说明 概述 一个代表URL的类,此外还支持国际域名(IDNs). 通常在初始化时传入QString构造QUrl,除此之外还能用setUrl(). URL有两种表示格式:编码.未编码.未编码URL常 ...

  4. CPU长指令(VLIW)失败的主要原因是什么,VLIW真的无药可救吗?

    software和hardware之间总是存在tradeoff:要么是hardware结构复杂,software灵活.要么是hardware结构保持简洁清晰,software干一些脏活累活.VLIW就 ...

  5. 写下载的时候,axios的responseType: "blob"(一定要修改)

    download(data, fileName) {       // window.URL.createObjectURL创建一个地址.       const url = window.URL.c ...

  6. 【故障公告】龙卷风来袭:突增的并发请求,撑不住的CPU

    (上图是数据库连接数监控图) 非常抱歉,今天下午 16:50-17:40 期间,一场龙卷风突袭园子,突增的并发请求狂卷博客站点的 pod,由于风力巨大(70%左右的增量),pod 的 cpu 不堪重负 ...

  7. 当我们看到phpinfo时在谈论什么

    我们在渗透测试的过程中,如果存在phpinfo界面,我们会想到什么? 大部分内容摘抄自:https://www.k0rz3n.com/2019/02/12/PHPINFO 中的重要信息/ 关于phpi ...

  8. PHP Curl Accept-Encoding: gzip乱码问题解决

    在使用php curl对接hugegraph的过程中,发现向gremlin发送结果返回乱码,截图如下: 发现返回乱码的乱码请求中有Accept-Encoding: gzip,即返回的内容采用了gzip ...

  9. mysql卡顿问题查找和解决方法

    mysql卡顿问题查找和解决方法 版权一.所遇问题        写在前边的废话:今天面试阿里的时候问到过类似问题,以前做调优的时候都是现查现用,缺乏总结,面试时答得也不好,今天趁此机会做一个梳理,知 ...

  10. Java的jinfo命令使用详解

    jinfo命令简介 jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参数和系统属性的命令行 ...