文章目录

  • 前言
  • 搭建步骤
    • 配置真实服务器(RS)
    • 配置负载均衡服务器(DS主)
    • 配置负载均衡服务器(DS备)
  • 测试
    • 查看DS主备配置
    • 访问VIP验证负载均衡
    • 查看虚拟路由冗余协议(VRRP)数据包
    • 验证主备切换
    • 恢复DS(主)
    • 验证监控RS
    • 查看Keepalived进程
  • 其他问题
    • DS(主)Keepalived进程异常退出
    • 防火墙导致多个VIP
  • 参考链接

前言

参考这篇CSDN - 在Linux配置LVS实现负载均衡可以搭建LVS(Linux Virtual Server)实现负载均衡。但是它有下列主要缺陷:

  • 没有备机,LVS故障时将不能提供服务。就算准备了备机,也需要人为监控LVS状态,在故障的时候修复或者用备机顶替
  • 不能监控RS(Real Server)存活状态,如果有RS故障,将会有部分请求分发到这些机器,导致请求无法处理

Keepalived出现就是为了解决这些问题,它可以带来以下好处:

  • 根据Keepalived配置设置,自动配置LVS
  • 搭建主备负载均衡服务器(LVS),监控存活状态,在主机宕机后及时选出新主提供服务
  • 检测RS(Real Server)存活状态,及时剔除无效的RS,避免将请求转发到无效的RS上,也会将恢复的RS重新加入负载列表

这一篇搭建步骤其实很简单,安装配置下Keepalived就可以了,只不过在测试部分写的比较详细,篇幅相对较长一点。

搭建步骤

搭建RS的步骤和上面那篇文章是一样的,我们现在需要做的是准备2台及以上的负载均衡服务器DS(Director Server)作主备。在主备上都配置Keepalived。在这里我们用4台主机:

  • node1(DS主):IP为192.168.252.131
  • node2(RS):IP为192.168.252.132
  • node3(RS):IP为192.168.252.133
  • node4(DS备):IP为192.168.252.134

建议先关掉防火墙。

echo "停止、关闭防火墙" > /dev/null
systemctl stop firewalld
systemctl disable firewalld

配置真实服务器(RS)

这一步和CSDN - 在Linux配置LVS实现负载均衡中的步骤一样。

要注意的是,要先改ARP配置,再配置VIP,不然有可能会在配置ARP之前暴露VIP地址。

  • 修改内核地址解析协议(Address Resolution Protocol,ARP)内核参数映射文件让其他网卡不暴露VIP,保/证VIP对内(本机)可见,对外隐藏
  • 对虚拟环回网卡配置子接口,绑定VIP,并设置掩码为255.255.255.255,让RS能处理请求并能直接返回
echo "给ens33网卡接口配置" > /dev/null
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce echo "为了方便,给所有网卡接口配置" > /dev/null
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announceecho "对虚拟环回网卡配置子接口" > /dev/null
ifconfig lo:2 192.168.252.100 netmask 255.255.255.255

配置负载均衡服务器(DS主)

echo "安装keepalived和ipvs管理工具" > /dev/null
yum install keepalived ipvsadm -yecho "备份keepalived配置文件" > /dev/null
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bakecho "将配置覆盖到keepalived配置文件" > /dev/null
echo '! Configuration File for keepalived
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.252.100/24 dev ens33 label  ens33:2}
}virtual_server 192.168.252.100 80 {delay_loop 6lb_algo rrlb_kind DRnat_mask 255.255.255.0    persistence_timeout 0protocol TCPreal_server 192.168.252.132 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.252.133 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}' > /etc/keepalived/keepalived.confecho "启动keepalived" > /dev/null
service keepalived start

下面是配置中每个参数的解释。如果安装了Linux/Unix环境下命令与函数的帮助文档(Manual page)可以执行man 5 keepalived.conf查看相关配置文档。也可以访问Keepalived官网的Keepalived Configuration Manual Page。

vrrp_instance VI_1 { # 虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP),监控LVS主和RS存活状态走这个协议state MASTER # 这台机器初始状态,MASTER|BACKUPinterface ens33 # VRRP使用的网卡接口virtual_router_id 51 # Keepalived可以配置多套LVS,同一套LVS使用相同的虚拟路由IDpriority 100 # 优先级,按优先级选主,一般服务器性能好的优先级配高点advert_int 1 # VRRP通告间隔(秒)authentication {auth_type PASS # 鉴权类型,PASS|AH,官网推荐的是PASS简单密码验证auth_pass 1111 # 密码}virtual_ipaddress { # 配置VIP192.168.252.100/24 dev ens33 label ens33:2 # 使用ens33创建(dev)子接口命名(label)为ens33:2,VIP为192.168.252.100,子网掩码为255.255.255.0(/24)}
}virtual_server 192.168.252.100 80 { # 配置LVS虚拟服务指定IP和端口号delay_loop 6 # 健康监测时间间隔(秒)lb_algo rr # 负载均衡算法为轮询(rr)lb_kind DR # 类型为直接路由(DR)nat_mask 255.255.255.0 # 子网掩码persistence_timeout 0 # 保证在这个时间内(秒)同一客户端的请求发送到相同的RS,避免每次请求跟不同RS建立连接。LVS会记录TCP握手数据包所以是知道之前哪个IP转发到了哪台RS,我们为了测试能实时看到切换效果设置成0protocol TCP # TCP协议real_server 192.168.252.132 80 { # RS配置,指定IP和监听的端口weight 1 # 权重HTTP_GET { # 健康检查,HTTP_GET|SSL_GETurl {path / # 请求路径status_code 200 # 返回状态码为这个视作正常}connect_timeout 3 # 超时时间(秒)nb_get_retry 3 # 重试次数delay_before_retry 3 # 重试时间间隔(秒)}}
}

配置负载均衡服务器(DS备)

备机配置和主机几乎一样,只需要将Keepalived配置中初始状态(state)改成BACKUP,优先级(priority)设置比主低一点。

测试

查看DS主备配置

  • 查看DS(主)配置
echo "查看网卡接口" > /dev/null
ifconfigecho "查看ipvs路由规则" > /dev/null
ipvsadm -ln

可以看到Keepalived根据我们的配置生成了VIP网卡接口(ens33:2)和IPVS路由表规则。客户端可以通过VIP来访问。

  • 查看DS(备)配置

使用相同的方式在备机只能看到IPVS路由表配置,但是看不到配置VIP的网卡接口。没有VIP,客户端无法通过VIP访问,IPVS就算配置了也不会生效,因为是备机,主机正常的情况下不生效是对的。

这一步我们验证的出了主备之间差异就在于只有主有VIP,有VIP才能对外提供服务。

访问VIP验证负载均衡

给两台RS(node2、node3)都安装httpd,并分别指定不同的httpd主页内容,测试时好区分。

echo "安装" > /dev/null
yum -y install httpdecho "启动" > /dev/null
service httpd startecho "覆盖指定httpd主页内容" > /dev/null
echo 'node2' > /var/www/html/index.html

我们通过命令行或者浏览器(浏览器可能有GET缓存,不切换等几秒缓存过期)访问VIP(192.168.252.100)可以看从返回结果看到在两个RS间轮询切换。

我们可以在DS(主)上看到IPVS连接记录。

ipvsadm -lcn

但是在DS(备)上就看不到了,因为没有VIP,是无法提供服务的。

这一步我们验证出主机成功实现了负载均衡,而备机啥也没干。

查看虚拟路由冗余协议(VRRP)数据包

echo "安装tcpdump" > /dev/null
yum install tcpdump -yecho "查看ens33网卡接口数据" > /dev/null
tcpdump -i ens33 vrrp -n

在主备执行,都可以看到主节点向VRRP组播地址(224.0.0.18)发送报文,报文内容包我们在Keepalived配置的信息,如:含虚拟路由ID(vrid 51)、优先级(prio 100)、简单密码验证(authtype simple)等等。

验证主备切换

将DS(主)关机,或者宕掉VIP和VRRP网卡。

ifconfig ens33 down

我们还是可以继续访问VIP,查看备机网卡配置可以发现新增了VIP。

查看备机IPVS连接记录,可以看到请求都到达了备机上。

而对于客户端来说,整个切换过程无感知,也不知道备机的存在。

恢复DS(主)

重启主节点或者,重新启动网卡。会看到主节点重新配置了VIP、IPVS路由表规则,再次成为了主对外提供服务。而备机VIP配置被清除,不能再对外提供服务。对客户端而言,这个过程同样是透明的。

ifconfig ens33 up

验证监控RS

我们宕掉一台RS,或者停掉RS的httpd。

service httpd stop

等待IPVS一段时间重试之后,查看主(node1)备(node4)的IPVS路由条目可以看到,路由条目中宕掉的node2(192.168.252.132)已被剔除。

客户端访问VIP也只会转发到健康的node3(192.168.252.133)上。

如果恢复宕掉的node2,将会看到IPVS路由条目中会恢复,访问VIP也会看到有请求负载到node2。

到这一步,我们验证了IPVS监控RS,及时剔除和恢复负载。

查看Keepalived进程

ps -ef | grep keepalived

从主备都可以看到有3个相关进程,①是进程ID,②是进程的父进程ID。

主进程(12138)通告自己健康状态;两个子进程(12139、12140)分别连接两个RS,检查它们的存活状态。

其他问题

DS(主)Keepalived进程异常退出

如果我们让DS(主)的Keepalived进程异常退出(如:kill -9),它就无法清除IPVS配置,主机仍然有VIP和IPVS路由规则,且能对外提供服务。

然后DS(备)没收到DS(主)的健康报文,顶替成为主,添加VIP,也能对外提供服务。

这样就导致了网络中有两个VIP存在,那就就可能一个TCP握手中,客户端两次发送的包分别给了不同的VIP,导致连接失败。所以Keepalived在这种情况下还是有缺陷。

下面这段是我测试客户端在这种情况下访问结果,纯粹好奇,作用不大。

但是我查看客户端的ARP缓存发现,出现上面这种情况后,缓存中VIP对应的MAC地址由指向DS(主)的更新成了指向DS(备)的。

arp -an

客户端能正常访问VIP。

请求都到了备机的VIP上。

清空客户端的ARP缓存,又会发现VIP地址重新指向了DS(主机),然后请求又重新到了DS主上。

虽然不是很正常,但用起来居然没出问题,也许是都在同一局域网,网络关系简单,但是同时存在多个VIP这种情况还是不要出现。

防火墙导致多个VIP

问题是主机启动Keepalived后,自动添加了VIP,然后备机也启动,也直接绑定了VIP。原因是备机的防火墙限制VRRP协议导致没收到主机报文,备机认为主机故障,自己直接顶替成了主机。

解决办法是让防火墙允许接收VRRP。细节可以参考CSDN - keepalived出现主备机同时绑定vip的解决方法。

echo "设置防火墙允许接收VRRP" > /dev/null
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPTecho "刷新防火墙" > /dev/null
firewall-cmd --reload

或者将防火墙关掉。

参考链接

Keepalived Configuration Manual Page

Keepalived官网

CSDN - keepalived出现主备机同时绑定vip的解决方法

在Linux基于Keepalived搭建LVS实现高可用负载均衡相关推荐

  1. haproxy负载均衡_基于mycat+haproxy+keepalived搭建mysql数据库高可用负载均衡

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  2. keepalive+nginx实现负载均衡高可用_超详细的LVS+keepalived+nginx实现高性能高可用负载均衡集群教程...

    概述 前面已经介绍了前两部分内容,下面主要介绍在nginx服务器方面的配置和测试整个集群是否可用. 在realserver端配置VIP 1.两台nginx服务器都要执行下面脚本: #vi /etc/r ...

  3. ngnix+keepalived 实现N主高可用负载均衡web群集

    ngnix+keepalived 实现N主高可用负载均衡web群集 思路: 总结一下最近学习的nginx+keepalived 的负载均衡架构,发现linux的群集系统都是负载均衡层加服务器群组层,实 ...

  4. Keepalived+LVS-DR模式配置高可用负载均衡集群

    环境: 虚拟机:VMware Workstation 操作系统:CentOS 5.5 一.keepalived+lvs-DR模式配置高可用负载均衡 拓扑如下: 二.服务器ip配置信息 1. ip_lb ...

  5. Hapoxy+keepalived实现双主高可用负载均衡

    在测试了Nginx+Keepalived的负载均衡后,也对Haproxy+Keepalived双主模式做了测试,双主的模式充分利用了服务器资源,这样不会导致服务器浪费. 这里举例说明: 默认情况下,第 ...

  6. keepalived + LVS实现高可用负载均衡集群

    4个节点: keepalived1: IP:172.16.20.10 hostname:knode1.lushenle.com OS:CentOS Linux release 7.1.1503 (Co ...

  7. Keepalived+Nginx实现高可用负载均衡集群

    转载自 https://www.cnblogs.com/mrlapulga/p/6857294.html 一 环境介绍 1.操作系统 CentOS Linux release 7.2.1511 (Co ...

  8. 高可用负载均衡反向代理服务

    高可用负载均衡&反向代理服务 概念简介 什么是高可用 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. ...

  9. 基于HAProxy+Keepalived高可用负载均衡web服务的搭建

    一 原理简介 1.HAProxy HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的we ...

最新文章

  1. 网络工程师_想要记录下来的一些题_5
  2. php 添加行_php 多行数据同时插入
  3. 话里话外:“按单制造”的业务特点(二)
  4. Vi编辑器的使用方法
  5. html输入框只能输入几个,input 两个input框只能允许同时输入一个
  6. c语言输入1显示good,求助 无论输入什么输出的结果是个0
  7. 用自己的数据集训练Mask-RCNN实现过程中的坑
  8. linux 查看网站目录权限,解决SELinux对网站目录权限控制的不当的问题
  9. WAN killer
  10. MATLAB电路仿真搭建教程
  11. LabVIEW 2021 工具包
  12. REST Assured——断言实现
  13. Unity Blend命令
  14. plsql的安装与配置
  15. 【回顾】巨杉数据库中标东莞农商银行非结构化内容管理平台项目
  16. 利用JS来设计夜场的倒计时以及进入页面
  17. [电路]10-支路电流法
  18. 推荐系统实践(项亮)读书笔记
  19. java正则表达式类_java中正则表达式之Pattern类与Matcher类
  20. [附源码]Python计算机毕业设计办公用品管理系统Django(程序+LW)

热门文章

  1. 解决小程序页面路径最多只能十层限制
  2. 史上最全的支付宝二维码扫码优化技术方案
  3. C语言0x00在无符号数组使用中的注意事项
  4. 人力资本:柳传志 二十年驭人成就柳氏联想
  5. 中国平安Java岗面经分享(已拿offer)
  6. css3 动画加旋转 例子
  7. Attention gated networks: Learning to leverage salient regions in medical images
  8. 《Minecraft》这款游戏为何如此让人着迷?
  9. Android禁止自动同步网络时间
  10. python学习 | 将CIFAR-10数据集中的图片按类别存放并生成组合图片