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. kmalloc、vmalloc、__get_free_pages()的区别

    一.分布位置上的区别: kmalloc()和__get_free_pages()函数申请的内存位于物理内存的映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在简单的线性 ...

  2. Python日志监控系统处理日志(pyinotify)

    前言 最近项目中遇到一个用于监控日志文件的Python包pyinotify,结合自己的项目经验和网上的一些资料总结一下,总的原理是利用pyinotify模块监控日志文件夹,当日志到来的情况下,触发相应 ...

  3. Windows10 环境下安装 ElasticSearch

    环境与版本 操作系统:windows 10 Elasticsearch 版本:6.1.1 Java 版本:9.0.1 ik 分词器版本:6.1.1 安装步骤 前置要求 操作系统中需要安装有 java ...

  4. Java与算法之(8) - 堆排序

    堆是一种特殊的完全二叉树,其特点是所有父节点都比子节点要小,或者所有父节点都比字节点要大.前一种称为最小堆,后一种称为最大堆. 比如下面这两个: 那么这个特性有什么作用?既然题目是堆排序,那么肯定能用 ...

  5. 使用 webpack + react + redux + es6 开发组件化前端项目

    因为最近在工作中尝试了 webpack.react.redux.es6 技术栈,所以总结出了一套 boilerplate,以便下次做项目时可以快速开始,并进行持续优化.对应的项目地址:webpack- ...

  6. GDOI 2016 & APIO 2016 游记

    缓慢施工中...... UPD:APIO游记已烂尾......因为Cu滚粗+生病一直没心情写..过了几天就发现APIO的事都快忘光了...去看KPM的就可以啦 今年apio竟然没和gdoi撞...智障 ...

  7. SecureCRT连接虚拟机中的Linux系统(Ubuntu)_Linux教程

    有道云笔记链接地址: https://note.youdao.com/share/?id=826781e7ca1fd1223f6a43f4dc2c9b5d&type=note#/

  8. js闭包的真正理解

    <高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. 这个说的太晦涩了,而且我觉得很容易理解错,闭包就是一个嵌套函数嘛?但是我觉得 ...

  9. 开始使用 HBuilder 和 Mui - 1 - 分析 index.html ;

    转自:http://ask.dcloud.net.cn/article/240 好吧,在比较了 Codenameone 和 HBuilder 以后,俺反复考虑后,终于还是决定使用 HBuilder 这 ...

  10. 最小生成树之Prim算法

    描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来--小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...