高可用之KeepAlived(2):keepalived+lvs
KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
本文只给出几个keepalived+lvs(VS/DR模式)的配置示例,关于keepalived的配置文件说明见:高可用之KeepAlived(一):基本概念和配置文件分析。
在实验开始前,需要说明几点:
- 使用keepalived配置lvs的VS/DR模式时,vip建议绑定在别名接口上。如果VIP使用单独的网卡,在lvs的高可用问题上就会出现问题:使用独立网卡配置VIP的vrrp实例将总是master角色,除非它完全死机。
- 既然VIP要绑定在某个接口别名上,那么VIP必须和这个接口在同一网段,否则无法正确配置VIP相关的路由(router到VIP部分)。因此对于keepalived+lvs来说,VIP和rip应该设置在同一网段。除非已经考虑清楚不使用vrrp的高可用功能,这样VIP不用绑定在网卡别名上,也就可以和rip在不同网段。
- 既然VIP和RIP在同一网段,那么内网路由器上就无需设置rp_filter。
1.keepalived+lvs:健康状况检查示例
实验环境如下:
RS上操作:
yum -y install httpd
echo "rs1:192.168.100.49" > /var/www/html/index.html # RS1上操作
echo "rs1:192.168.100.50" > /var/www/html/index.html # RS2上操作
service httpd start
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.100.10/32 up
route add -host 192.168.100.10 dev lo
route add default gw 192.168.100.51
Router上操作:
echo 1 >/proc/sys/net/ipv4/ip_forward
Director上操作:
[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0
}
}
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.49 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
测试是否能实现连接的负载均衡。
2.keepalived+lvs:高可用+健康检查示例
KeepAlived通过vrrp的冗余路由切换协议实现高可用功能,主要用于lvs Director的高可用。
在配置KeepAlived高可用功能时,需要注意以下几点:
- 两台(或多台)Director上的vrrp实例名称要一致,vrid(virtual_router_id)要一致,认证机制以及认证密码要一致,global定义的服务器标识router_id不能一致。
- 不同机器上的优先级priority的值不能一致。priority直接决定谁是master,谁是backup,而无论vrrp实例的state值是MASTER还是BACKUP。
- VIP不能使用独立的网卡,而应该绑定在别名接口上。如果使用独立的网卡地址作为VIP,则这个vrrp实例将总是master角色,直至它死机或者该网卡down掉。
- keepalived的vrrp组件不依赖于lvs,它可以独立提供高可用服务。
实验环境如下:
RS1、RS2、Router、director_lvs(master)和前文实验的配置一致,不需修改。因此,只需提供director_lvs(backup)的配置文件即可。
以下是master上的操作。
[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_2 # 和master不同
}
vrrp_instance VI_1 { # 和master相同
state BACKUP # 和master不同
interface eth0
virtual_router_id 51 # 和master相同
priority 50 # 和maste不同
advert_int 1
authentication {
auth_type PASS # 和master相同
auth_pass 12345678 # 和master相同
}
virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0
}
}
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.49 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
启动两Director,查看是否只有master上设置了VIP。注意:ipvs规则在master和backup上都设置了,但由于backup没有VIP,因此backup设置的ipvs规则暂时是没有意义的。当backup切换为master状态时,只会设置VIP。
然后查看master是否已经生效。生效后,将master断开。观察原来的backup切换为master的日志:
Mar 1 20:52:19 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar 1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
可以看到,切换速度极快(1秒以内)。
再测试将原来的master(高优先级)启动,发现它再次成为master,切换速度也是极快。
将RS1上的httpd停止。再查看主、备director上的ipvs规则。
[root@xuexi ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.100.10:80 wrr
-> 192.168.100.50:80 Route 1 0 0
发现master和backup两边都把不健康的RealServer1节点给踢出去了。由此可以知道,健康检查是master和backup都会循环进行的,并不是只有master进行检查。
再将RS1上的httpd启动。然后查看ipvs规则。发现没过几秒钟就把规则添加回来了。
3.keepalived+lvs:多实例+高可用(双主)
keepalive的vrrp多实例可以管理多个director和vip,进而可以实现"双主模型"的高可用。
实验环境如下图:
其中Director1的vrrp实例1上是R1的master,vrrp实例2是R2的backup,Director2的vrrp实例1是R1的backup,vrrp实例2是R2的master。
这里略过4个RS的配置步骤(如有问题,参照前文配置RS1、RS2的过程)。
以下是Director1和Director2的keepalived.conf不同部分和相同部分的内容:
# 以下是两台Director上相同部分的内容
! Configuration File for keepalived |! Configuration File for keepalived
|
global_defs { |global_defs {
router_id LVS_1 | router_id LVS_2
} |}
|
vrrp_instance VI_1 { |vrrp_instance VI_1 {
state MASTER | state BACKUP
interface eth0 | interface eth0
virtual_router_id 51 | virtual_router_id 51
priority 100 | priority 50
advert_int 1 | advert_int 1
authentication { | authentication {
auth_type PASS | auth_type PASS
auth_pass 12345678 | auth_pass 12345678
} | }
virtual_ipaddress { | virtual_ipaddress {
192.168.100.10/32 dev eth0 label eth0:0 | 192.168.100.10/32 dev eth0 label eth0:0
} | }
} |}
# 不同vrrp实例绑定在同一接口上,vrid必须不能相同 |# 不同vrrp实例绑定在同一接口上,vrid必须不能相同
vrrp_instance VI_2 { |vrrp_instance VI_2 {
state BACKUP | state MASTER
interface eth0 | interface eth0
virtual_router_id 55 | virtual_router_id 55
priority 50 | priority 100
advert_int 1 | advert_int 1
authentication { | authentication {
auth_type PASS | auth_type PASS
auth_pass 12345678 | auth_pass 12345678
} | }
virtual_ipaddress { | virtual_ipaddress {
192.168.100.11/32 dev eth0 label eth0:1 | 192.168.100.11/32 dev eth0 label eth0:1
} | }
} |}
#########################################################################################
# 以下是两台Director上相同部分的内容
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.49 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
virtual_server 192.168.100.11 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 192.168.100.57 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
real_server 192.168.100.58 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
分别测试访问两个VIP:http://192.168.100.10
和http://192.168.100.11
。其中前者目前只能调度R1:RS1和R1:RS2,后者只能调度R2:RS1和R2:RS2。将任一Director断开,测试4个RS是否仍能继续提供服务。
4.提供sorry server和local RS
如果所有RS都宕了,对于外界来说就真的无法再访问网站了,这显然不适合。这时可以通过keepalived来配置一个服务页面。例如告诉外界客户端网站正在维护状态,或者只提供一个网站的一个主页面。
一般来说,因为是在所有RS都宕机的情况下sorry server提供的临时服务才生效,因此通常将sorry server配置在virtual_server中而非real_server中。
配置时,只需在keepalived配置文件的virtual_server段落中添加sorry_server指令即可。并且,如果启用了vrrp的高可用,应该在master和backup节点上都加上sorry server。
virtual_server 192.168.100.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
重启keepalived后,再在每个vrrp机器上配置好httpd。
yum -y install httpd
echo "web Maintenancing" >/var/www/html/index.html
service httpd start
然后将所有的RS节点的httpd服务停掉。再看keepalived上的ipvs规则,发现已经将VIP作为规则添加进来了,于是下次访问VIP时将调度这台sorry server。当某一台RS恢复的时候,ipvs规则又会变更为RS的节点。
对于集群系统不大的情况下,LVS Director一般会比较空闲,这样就比较浪费资源。这时通常会将LVS Director自身也作为一个RS,一边提供web服务,一边提供调度功能,不过应该将它的调度权重设置低一点,以免影响负载均衡的性能。这称为local RS,local RS的RIP可以写Director上的任意地址(127.0.0.1都可以)。例如:
real_server 127.0.0.1 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
local RS和sorry server不应该同时设置,因为如果local RS坏了,sorry server肯定无法被调度到。
高可用之KeepAlived(2):keepalived+lvs的更多相关文章
- 高可用群集HA介绍与LVS+keepalived高可用群集
一.Keepalived介绍 通常使用keepalived技术配合LVS对director和存储进行双机热备,防止单点故障,keepalived专为LVS和HA设计的一款健康检查工具,但演变为后来不仅 ...
- 高可用Mysql架构_Haproxy+keepalived+mycat集群的配置
接上一篇文章http://www.cnblogs.com/wt645631686/p/8310891.html,虽然已经在原有两台mycat基础上增加了Haproxy作为mycat的中间服务器,不足的 ...
- 高可用集群之keepalived+lvs实战-技术流ken
keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...
- 高可用集群之keepalived+lvs实战2
keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...
- 高可用集群之keepalived+lvs实战
keepalived简介 lvs在我之前的博客<高负载集群实战之lvs负载均衡-技术流ken>中已经进行了详细的介绍和应用,在这里就不再赘述.这篇博文将把lvs与keepalived相结合 ...
- LVS负载均衡+动静分离+高可用(nginx+tomcat+keepalived)
文章目录 [隐藏] 一.环境介绍 二.环境安装 1.安装JDK 2.两台服务器安装tomcat 3.nginx安装 4.keepalive安装 三.负载均衡 四.动静分离 五.keepalive高可用 ...
- 你需要了解的高可用方案之使用keepalived搭建双机热备一览
在之前一篇使用nginx搭建高可用的解决方案的时候,很多同学会问,如果nginx挂掉怎么办,比如下面这张图: 你可以清楚的看到,如果192.168.2.100这台机器挂掉了,那么整个集群就下线了,这个 ...
- MySQL高可用架构:mysql+keepalived实现
系统环境及架构 #主机名 系统版本 mysql版本 ip地址 mysqlMaster <a href="https://www.linuxprobe.com/" title= ...
- Mysql - 高可用方案之MM+Keepalived
一.概述 本文将介绍mysql的MM+Keepalived方案.该方案由两个mysql服务器组成,这两个mysql互为主备.其中一台主作为写服务器,另一台主作为读服务器.通过keepalived软件管 ...
- 打造kubernetes 高可用集群(nginx+keepalived)
一.添加master 部署高可用k8s架构 1.拷贝/opt/kubernetes目录到新的master上(注意如果新机上部署了etcd要排除掉) scp -r /opt/kubernetes/ ro ...
随机推荐
- html5移动端meta自动适应标签
控制显示区域各种属性: <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc ...
- Spring Boot:在Spring Boot中使用Mysql和JPA
本文向你展示如何在Spring Boot的Web应用中使用Mysq数据库,也充分展示Spring Boot的优势(尽可能少的代码和配置).数据访问层我们将使用Spring Data JPA和Hiber ...
- nginx添加编译lua模块
一 .安装LuaJit 1.下载LuaJit # wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 2.编译安装 # tar xzvf LuaJI ...
- 可等待计时器添加APC测试
可等待计时器和用户计时器的最大区别在于用户计时器需要在应用程序中使用大量的用户界面基础设施,从而消耗更多的资源.此外,可等待计时器是内核对象,这意味着他们不仅可以在多个线程间共享,而且具备安全性. 用 ...
- 1.NET是什么
- Oracle多行记录合并的几种方法
今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nulla ...
- linkin大话数据结构--泛型
泛型(Generic) 什么是泛型? java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数 ...
- 学Java分布式和高架构,必懂的两大知识点!
今天小编为你们分享阿里巴巴2018年招聘应届毕业生,Java工程师的面试考题,主要分为三种 Java中获取 mysql连接的方式: 第一部分:分布式 三步变成:分布式 1.将你的整个软件视为一个系 ...
- lvs+keepalive构建高可用集群
大纲 一.前言 二.Keepalived 详解 三.环境准备 四.LVS+Keepalived 实现高可用的前端负载均衡器 一.前言 Keepalived使用的vrrp协议方式,虚拟路由 ...
- 关于Scanner类
Scanner类 1.常用的两个方法: public int nextInt():获取一个int类型的值 public String nextLine():获取一个St ...