学习Keepalived(三)
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地址,可以有多个,每行一个。
2、smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。
3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。
4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。
qVRRP定义块
1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。
(1)第14行实例状态state.只有Master和Backup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到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。若MASTER的priority值为150,那么BACKUP的priority只能在149或者跟小的数值(官方建议相差50)。
(6)第18行同步通知间隔advert_int。MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
(7)第19-22行验证authentication.包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。
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(三)的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 从零开始学习jQuery (三) 管理jQuery包装集
本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- 三、Android学习第三天——Activity的布局初步介绍(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 三.Android学习第三天——Activity的布局初步介绍 今天总结下 ...
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB
JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ...
- MyEclipse Spring 学习总结三 SpringMVC
MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...
- Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
随机推荐
- 一个简单的性能计数器:CodeTimer
public static class CodeTimer { public static void Initialize() { Process.GetCurrentProcess().Priori ...
- PyTorch 中 torch.matmul() 函数的文档详解
官方文档 torch.matmul() 函数几乎可以用于所有矩阵/向量相乘的情况,其乘法规则视参与乘法的两个张量的维度而定. 关于 PyTorch 中的其他乘法函数可以看这篇博文,有助于下面各种乘法的 ...
- Oracle之数据库的连接
Oracle 默认用户 数据库创建完毕后,需要设置数据库的默认用户.Oracle中为管理员预置了两个用户分别是SYS和SYSTEM.SYS的初始密码为Oracle安装时设置的数据库口令 admin,在 ...
- C#控制打印机打印
一.引用BarcodeStandard.dll #region BarcodeStandard.dll /* * * 使用说明 需要通过NuGet进行安装BarcodeLib.dll,必不可少 */ ...
- GPT-3被超越?解读低能耗、高性能的GlaM模型
原创作者 | LJ GLaM: Efficient Scaling of Language Models with Mixture-of-Experts https://arxiv.org/pdf/2 ...
- Laravel7-验证器使用
- git常用命令及问题
Git基本操作 git init 创建新的git仓库 git clone [url] 使用 git clone 拷贝一个 Git 仓库到本地 git status 查看工作区 git stash li ...
- 分析vue脚手架
执行流程: 执行npm run serve.找到了main.js文件,之后引入Vue.App等等.后来找到App组件,发现里面用到了组件School,于是执行School组件,最终汇总到App组件.通 ...
- 原生 JS 实现 VS Code 自动切换输入法状态!这次没有AHK
上一篇文章:使用 AHK 在 VS Code 中根据上下文自动切换输入法状态 给出一个使用 ahk 在 VSCode 自动切换输入法的方法.不过这个方法实际上很蹩脚,一点都不优(zhuang)雅(bi ...
- MyEclipse 在浏览器运行里报错,The requested resourse (xx/index.jsp) is not available
在浏览器地址输入新建的web项目(http://localhost:8080/FirstPro/index.jsp),显示请求的资源不可用 这是因为我们新建的项目存放在安装MyEclipse时建立的W ...