keepalived与dr模式结合

keepalived介绍

keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),
这样可以简单实现一个双机热备高可用功能;
keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,
可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,
这个组里面有一个master和多个backup,
master上面有一个对外提供服务的vip
(该路由器所在局域网内其他机器的默认路由为该vip),
master会发组播,当backup收不到VRRP包时就认为master宕掉了,
这时就需要根据VRRP的优先级来选举一个backup当master。
这样的话就可以保证路由器的高可用了。
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),
这样可以简单实现一个双机热备高可用功能;
keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,
可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,
这个组里面有一个master和多个backup,
master上面有一个对外提供服务的vip
(该路由器所在局域网内其他机器的默认路由为该vip),
master会发组播,当backup收不到VRRP包时就认为master宕掉了,
这时就需要根据VRRP的优先级来选举一个backup当master。
这样的话就可以保证路由器的高可用了。

keepalived实验

实验环境 4台虚拟机

dr1		192.168.1.135
dr2 192.168.1.106
rs1 192.168.1.190
rs2 192.168.1.187
VIP 192.168.1.180
为方便实验,建议关闭iptables,或者开通80端口 dr1和dr2安装ipvsadm和keepalived
yum install -y ipvsadm keepalived real_server1和real_server2上安装nginx
开启80端口访问,区分两个real_server

实验操作

  • 修改配置文件
1.修改dr1的keepalived配置文件

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
notification_email { # 配置邮箱报警
acassen@firewall.loc # (如果要开启邮件报警,需要开启相应的sendmail服务)
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 # 邮箱的服务器
smtp_connect_timeout 30 # 邮箱连接设置
router_id LVS_DEVEL # 表示keepalived服务器的一个标识,是发邮件时显示在邮件主题中的信息
} vrrp_instance VI_1 { #定义一个vrrp组,组名唯一
state MASTER #定义改主机为keepalived的master主机
interface eth0 #监控eth0号端口
virtual_router_id 58 #虚拟路由id号为58,id号唯一,这个id决定了多播的MAC地址
# (一组keepalived相同,多组不能相同)
priority 150 #设置本节点的优先级,master的优先级 要比backup的优先级别高,数值要大
# (一组中keepalived会检查此选项然后选举出一台服务器作为路由,配置vip)
advert_int 1 #检查间隔,默认为1秒
authentication {
auth_type PASS #认证方式,密码认证
auth_pass 1111 #认证的密码,这个密码必须和backup上的一致
}
virtual_ipaddress { #设置虚拟的ip, 这个ip是以后对外提供服务的ip。如果有多个VIP,继续换行填写.
192.168.1.180
}
} virtual_server 192.168.1.180 80 { #虚拟主机设置,ip同上。
delay_loop 2 #每隔2秒查询realserver状态
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的集群模式
nat_mask 255.255.255.0
# persistence_timeout 50 #同一IP的连接50秒内被分配到同一台realserver
# 测试的时候可以不用开
protocol TCP #用TCP协议检查realserver状态 real_server 192.168.1.187 80 { #后端真实主机1
weight 100 #每台机器的权重,0表示不给该机器转发请求,直到它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
} real_server 192.168.1.190 80 { #后端真实主机2
weight 100 #每台机器的权重,0表示不给该机器转发请求,直到它恢复正常。
TCP_CHECK { #健康检查项目,以下
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
2.修改dr2上的keepalived配置文件

vim /etc/keepalived/keepalived.conf

只要修改dr1上的配置内容
backup主机的配置和master的基本一样,只有以下地方需要修改。
state BACKUP #定义改主机为keepalived的backup主机,监控主master
priority 100 #设置本节点的优先级,数值要比master主机上的小
3.配置real_server的dr脚本(同dr模式脚本)

vim /usr/local/sbin/lvs_dr.sh

#!/bin/bash
vip=192.168.1.180
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
  • 启动执行
1.将2台dr上的keepalived启动
/etc/init.d/keepalived start
2.执行脚本
sh /usr/local/sbin/lvs_dr.sh
  • 检查是否搭建成功
查看VIP和ipvsadm
通过检查网卡信息看vip绑定在哪台机器的网卡上
ip addr [root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:46:c8:ae brd ff:ff:ff:ff:ff:ff
inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.180/32 scope global eth0
inet6 fe80::20c:29ff:fe46:c8ae/64 scope link
valid_lft forever preferred_lft forever

不要跟dr模式混乱,这里启动keepalived后不需要再执行dr模式下的lvs_dr.sh脚本

  • 测试

(注:如果发现rs没有轮询,注释掉keepalived.conf中persistence_timeout 50即可)

A:dr1存活(正常轮询)
[root@151 ~]# curl 192.168.1.180
rs2 nginx
[root@151 ~]# curl 192.168.1.180
rs1 nginx
[root@151 ~]# curl 192.168.1.180
rs2 nginx 此时vip在135上 [root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:46:c8:ae brd ff:ff:ff:ff:ff:ff
inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.180/32 scope global eth0
inet6 fe80::20c:29ff:fe46:c8ae/64 scope link
valid_lft forever preferred_lft forever B:dr1挂掉 停掉dr1的keepalived,vip自动绑定到dr2,keepalived搭建完成
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5a:c3:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.135/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.180/32 scope global eth0
inet6 fe80::20c:29ff:fe5a:c348/64 scope link
valid_lft forever preferred_lft forever 因为给192.168.1.106配置的priority优先级为150
而192.168.1.135的优先级是100
所以,当keepalived连接通信时(主从同时存在时),vip会在106上
而当106宕机时,vip会飘到135上
当重新启动106(启动106上的keepalived)等于重新做了keepalived主从
106因为优先级为150,所以又会重新获得vip

脑裂问题(主从模式)

上述主从配置方式存在脑裂的可能,
即两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,
这时两个节点均强行绑定虚拟IP,导致不可预料的后果。

这就是我刚刚实验中说不需要执行dr模式下的lvs_dr.sh脚本,因为执行脚本后,主从同时获得vip

这时就需要设置仲裁,即每个节点必须判断自身的状态(应用服务状态及自身网络状态),
要实现这两点可使用自定义shell脚本实现,通过周期性地检查自身应用服务状态,
并不断ping网关(或其它可靠的参考IP)均可。
当自身服务异常、或无法ping通网关,
则认为自身出现故障,就应该移除掉虚拟IP(停止keepalived服务即可)。
主要借助keepalived提供的vrrp_script及track_script实现:
(实验中没有添加这个)

在keepalived的配置文件最前面加入以下代码,定义一个跟踪脚本:

vrrp_script check_local { #定义一个名称为check_local的检查脚本
script "/usr/local/keepalived/bin/check_local.sh" #shell脚本的路径
interval 5 #运行间隔
}

再在vrrp_instance配置中加入以下代码使用上面定义的检测脚本:

track_script {
check_local
}
我们在/usr/local/keepalived/bin/check_local.sh定义的检测规则可以是:
(以上的路径及文件是自己定义的。) a.自身web服务故障(超时,http返回状态不是200) b.无法ping通网关 c.产生以上任何一个问题,均应该移除本机的虚拟IP(停止keepalived实例即可) 但这里有个小问题,如果本机或是网关偶尔出现一次故障,那么我们不能认为是服务故障。
更好的做法是如果连续N次检测本机服务不正常或连接N次无法ping通网关,
才认为是故障产生,才需要进行故障转移。
另一方面,如果脚本检测到故障产生,并停止掉了keepalived服务,
那么当故障恢复后,keepalived是无法自动恢复的。
我觉得利用独立的脚本以秒级的间隔检查自身服务及网关连接性,
再根据故障情况控制keepalived的运行或是停止。

这里提供一个思路,具体脚本内容请大家根据自己的需要编写即可。

脚本 /usr/local/nginx/check_nginx.sh"内容:
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
/usr/local/nginx/sbin/nginx
sleep 5
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived
fi
fi
vi /etc/keepalived/keepalived.conf
global_defs {
router_id nginx_backup
}
#监控服务.NGINX mysql等 vrrp_script chk_nginx {
script "/usr/local/nginx/check_nginx.sh"
interval 2
weight 2
} vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.xx.xx #VIP(虚拟ip)
192.168.xx.xx #主服务器IP
192.168.xx.xx #从服务器IP
}
track_script {
chk_nginx #检测脚本 上面配置的
}
}

keepalived健康检查方式

keepalived对后端realserver的健康检查方式主要有以下几种

TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,
如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。 HTTP_GET:工作在第5层,向指定的URL执行http请求,
将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;
此外还可以指定http返回码来判断检测是否成功。
HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。 SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接 MISC_CHECK:用脚本来检测,脚本如果带有参数,
需将脚本和参数放入双引号内。脚本的返回值需为: 0) 检测成功 1) 检测失败,将从服务器池中移除 2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,
如退出码为200,权重自动调整为198=200-2。 SMTP_CHECK:用来检测邮件服务的smtp的

当把nginx与keepalived部署在同一台服务器上时

nginx做反向代理,keepalived做vip(重点还是nginx的反向代理)

同时配置BACKUP文件,重新做主从不替换

当keepalived的MASTER宕掉,BACKUP启动。再恢复MASTER会再次抢走vip,
但此时并不需要更换vip,如果业务量大的话,反而会对业务有影响。
此时将两台机器的keepalived同时设置为BACKUP,priority相同
两台服务器使用相同的keepalived的BACKUP配置文件
两台机器会抢vip,因为优先权相同。当谁先启动谁就拥有了vip
避免了更换从主的问题

nginx+keepalived双主模式

双主模式与普通主从模式的最大区别,充分使用两台服务器,不会有闲置BACKUP机器
注意:
配置中的虚拟路由标识virtual_router_id在MASTER和BACKUP处配置不能一样(但在主从模式下配置是一样的) 1)master负载机上的keepalived配置:
(注意,这里是双主配置,MASTER-BACKUP和BACKUP-MASTER;
如果是多主,比如三主,
就是MATER-BACKUP-BACKUP、BACKUP-MASTER-BACKUP和BACKUP-BACKUP-MASTER)
双主模式就是设置两个vrrp_instance VI_1和VI_2
vrrp_instance VI_1 {
state MASTER
virtual_router_id 51
priority 101
} vrrp_instance VI_2 {
state BACKUP
virtual_router_id 52
priority 99
} #在另一台机器上
vrrp_instance VI_1 {
state BACKUP
virtual_router_id 51
priority 99
} vrrp_instance VI_2 {
state MASTER
virtual_router_id 52
priority 101
} 主要就是这三项的变化
同一个虚拟的vrrp_instance相同
然后互为主从,权限不同

将nginx中配置的域名解析到这两个VIP地址上:(万网DNS解析配置)

103.110.98.20 www.chenhaoran.com

103.110.98.21 www.chenhaoran.com

参考链接

http://blog.chinaunix.net/uid-10480699-id-5179873.html

http://blog.csdn.net/qiandublog/article/details/52474450

http://www.keepalived.org/doc/introduction.html

推荐阅读

http://www.361way.com/keepalived-health-check/5218.html

https://www.cnblogs.com/kevingrace/p/6248941.html

双主模式参考

https://www.cnblogs.com/kevingrace/p/6146031.html

keepalived深度结合lvs_dr模式的更多相关文章

  1. LVS_DR模式构建配置

    一.环境准备 lvs负载均衡器 系统:centos6.8 ip:192.168.2.203 vip:192.168.2.17 web服务器RS1 系统:centos6.8 ip:192.168.2.2 ...

  2. Linux keepalived+nginx实现主从模式

    双机高可用方法目前分为两种: 主从模式:一台主服务器和一台从服务器,当配置了虚拟vip的主服务器发送故障时,从服务器将自动接管虚拟ip,服务将不会中断.但主服务器不出现故障的时候,从服务器永远处于浪费 ...

  3. [LVS] 用keepalived实现LVS NAT模式高可用性

    默认前提是LVS已经可以正常工作了. 因为是NAT模式,RS的路由要指向LVS的接口地址,所以需要一个统一的后台浮动地址,使得RS都指向这个浮动IP.否则在切换时,会导致RS回包到DOWN掉的LVS上 ...

  4. LVS + Keepalived + Nginx基于DR模式构建高可用方案

    在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡.这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度.当然为了解决单点故障的问题,还会做热备份方案.这里演示利用LVS做负载均衡器 ...

  5. 实验:keepalived双主抢占模式和非抢占模式和IPVS

    内容: 一:概念.原理   二:实验过程 一.概念 一.keepalived原理及配置解析 keepalived:vrrp协议的实现 vrrp协议:virtual router redundancy ...

  6. LVS+Keepalived深度理解,阐述你不知道的坑点

    1. LVS简介 1. 什么是LVS? LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内 ...

  7. 用pyhton配置LVS_DR模式

    import paramiko vip = '192.168.42.250' ds = '192.168.42.8' rs1 = '192.168.42.9' rs2 = '192.168.42.10 ...

  8. Nginx+keepalived双机热备(主从模式)

    负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行.关于负载均衡介绍,可以参考:linux负载 ...

  9. nginx + keepalived 主从模式

    转自:https://www.cnblogs.com/kevingrace/p/6138185.html 负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可 ...

随机推荐

  1. (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序

    一.创建新QT工程 一定要是全英文路径,比如"E:\android_qt_opencv\GO_GTD" 由于我们在安装的时候,选择android的工具链,所以在这里会出现以下选择, ...

  2. 3.If statements

    if 语句   电脑程序不只是执行命令.时常会需要做出选择.例如基于一个条件的选择.Python有这样几种条件运算:   >   greater than <   smaller than ...

  3. 51 nod 1203 JZPLCM

    原题链接 长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7.   例如:2 3 4 5,询问[1,3]区间的最小 ...

  4. hdu_1041(Computer Transformation) 大数加法模板+找规律

    Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  5. BZOJ 3105: [cqoi2013]新Nim游戏

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意是要取一些数使得剩余的数xor和的子集不为0 拟阵.求解极大线性无关组.贪心从大到小 ...

  6. hdu_1031_结构体排序

    题目很好理解,将列求和,取前k大的 我的代码思路:对列求和,后取出前k大的id加入结果数组,对比后面和第k大相同的评分id也加入到结果数组,最后对结果数组排序 代码: #include<cstd ...

  7. python程序的标准输入输出

    1,  A+B Problem : http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1000 #! ...

  8. hdu_2087 剪花布条(kmp)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. 最新版Sublime Text Build 3156 x64 的下载 + 注册码 + Install Package Control + 汉化教程

    一.Sublime Text  下载 神器 Sublime Text 最近开始更新到开发版本 Build 3156,本身英语不是太6,汉化党自然各种百度汉化教程,网上不是一堆绿色汉化包,就是让你下载汉 ...

  10. ThoughtWorks University之旅 —— 印度游记

    ThoughtWorks University是ThoughtWorks为新加入的员工提供的入职培训项目之一,会将世界各地office新入职的员工一起带到印度浦那,参加一次为期5周的培训,内容涵盖了公 ...