第六十三集 LVS负载均衡❤群集 (✿◡‿◡) DR模式 + Keepalived部署

LVS负载均衡群集DR模式+Keepalived部署

  • LVS-DR数据包流量分析
    • LVS-DR中的ARP问题
    • 解决ARP的两个问题的设置方法
    • Keepalived
    • LVS调度服务器配置(主-备)
    • web服务器配置
    • Keepalived安装设置


LVS-DR数据包流量分析

同一局域网中

客户端向目标VIP发送请求,负载均衡器接收
负载均衡器根据负载均衡算法选择后端真实服务器,不修改也不封装IP报文,而是将数据帧的
MAC地址改为后端真实服务器的MAC地址,然后在局域网上发送
后端真实服务器收到这个帧,解封装后发现目标IP与本机匹配(事先绑定了VIP),于是处理
这个报文。
随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出客户端将收到回复报文;客户端认为得到正常的服务,而不会知道是哪一台服务器处理的如果跨网段,则报文通过路由器经由 internet 返回给用户

LVS-DR中的ARP问题

在LVS-DR负载均衡集样中,负载均衡与节点服务器都要配置相同的VIP地址
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
对节点服务器进行处理,使其不响应针对VIP的ARP请求
解决方法
使用虚接口 lo:0 承载VIP地址设置内核参数 arp_ignore=1:系统只响应目的IP为本地 IP 的ARP请求
RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使
用发送接口的IP地址如:ens33
路由器收到ARP请求后,将更新ARP表项
原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
路由器根据ARP表项,会将新来的请求报文转发给Realserver,导致Director的VIP失效
解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

解决ARP的两个问题的设置方法

修改 /etc/sysctl.conf 文件
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

Keepalived

Keepalived
支持故障自动切换(Failover)
支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点(优先级)。

Keepalived实现原理剖析
keepalived采用VRRP热备份协议实现Linux 服务器的多机热备功能
VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案。
由多台路由器组成一个热备份组,通过共用的虚拟IP地址对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

snmp 通过网络管理服务器、交换机、路由器等设备的一种协议
在keepalived SNMP管理的是健康检查(状态)
PS: 在监控中也会通过snmp 监控、获取被监控服务器的数据

LVS调度服务器配置(主-备)


LVS-01:

[root@lvs-01 ~]# yum install -y ipvsadm keepalived
[root@lvs-01 ~]# modprobe ip_vs			#加载ip_vs模块
[root@lvs-01 ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn


##配置VIP
[root@lvs-01 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs-01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs-01 network-scripts]# vim ifcfg-ens33:0		#删除原本内容,添加以下内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.118.66
NETMASK=255.255.255.255
[root@lvs-01 network-scripts]# ifup ens33:0
[root@lvs-01 network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.118.66  netmask 255.255.255.0  broadcast 192.168.118.255
        ether 00:0c:29:4e:ad:4a  txqueuelen 1000  (Ethernet)


## 设置proc参数,关闭linux内核参数,关闭转发和重定向
[root@lvs-01 network-scripts]# vim /etc/sysctl.conf    #再后面插入以下内容
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs-01 network-scripts]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0


##开启ipvsadm
[root@lvs-01 network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs-01 network-scripts]# systemctl start ipvsadm
[root@lvs-01 network-scripts]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled)
   Active: active (exited) since 星期一 2021-07-26 15:36:20 CST; 9s ago


##用脚本创建ipvsadm规则
[root@lvs-01 network-scripts]# vim /opt/gz.sh
#!/bin/bash
ipvsadm -C
ipvsadm -A -t 192.168.118.66:80 -s rr			##设置为轮询
ipvsadm -a -t 192.168.118.66:80 -r 192.168.118.50:80 -g
ipvsadm -a -t 192.168.118.66:80 -r 192.168.118.55:80 -g
ipvsadm
[root@lvs-01 network-scripts]# chmod +x /opt/gz.sh
[root@lvs-01 network-scripts]# /opt/gz.sh		#开启ipvsadm,(在配置完web服务器后执行)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lvs-01:http rr
  -> 192.168.118.50:http          Route   1      0          0         
  -> 192.168.118.55:http          Route   1      0          0 

LVS-02:

[root@lvs-02 ~]# yum -y install ipvsadm keepalived
[root@lvs-02 ~]# modprobe ip_vs 
[root@lvs-02 ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lvs-02 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs-02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs-02 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.118.88
NETMASK=255.255.255.255
[root@lvs-02 network-scripts]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs-02 network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs-02 network-scripts]# systemctl start ipvsadm
[root@lvs-02 network-scripts]# vim /opt/gz.sh
#!/bin/bash
ipvsadm -C
ipvsadm -A -t 192.168.118.66:80 -s rr
ipvsadm -a -t 192.168.118.66:80 -r 192.168.118.50:80 -g
ipvsadm -a -t 192.168.118.66:80 -r 192.168.118.55:80 -g
ipvsadm
[root@lvs-02 network-scripts]# chmod +x /opt/gz.sh
[root@lvs-02 network-scripts]# /opt/gz.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lvs-02:http rr
  -> 192.168.118.50:http          Route   1      0          0         
  -> 192.168.118.55:http          Route   1      0          0 

web服务器配置



server1:

[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@server1 network-scripts]# vim /ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.118.66
NETMASK=255.255.255.255
[root@server1 network-scripts]# ifup lo:0
[root@server1 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.118.66  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)


##禁锢路由
[root@server1 network-scripts]# route add -host 192.168.118.66 dev lo:0
[root@server1 network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.118.2   0.0.0.0         UG    100    0        0 ens33
192.168.118.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.118.66  0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
###也可以配置启动管理来执行路由禁锢
[root@server1 network-scripts]# vim /etc/rc.local ##再最后添加以下内容
/sbin/route add -host 192.168.118.66 dev lo:0


##下载安装httpd
[root@server1 network-scripts]# yum install -y httpd
[root@server1 network-scripts]# vim /etc/sysctl.conf  		#调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免冲突
net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@server1 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@server1 network-scripts]# systemctl start httpd		#开启apache
[root@server1 network-scripts]# vim /var/www/html/index.html		#设置web1的网页
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is server1</h1>
</body>
</html>

server2:

[root@server2 ~]# cd /etc/sysconfig/network-scripts/
[root@server2 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@server2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.118.66
NETMASK=255.255.255.255
[root@server2 network-scripts]# ifup ifcfg-lo:0
[root@server2 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.118.66  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)
[root@server2 network-scripts]# route add -host 192.168.118.66 dev lo:0
[root@server2 network-scripts]# vim /etc/rc.local 
/sbin/route add -host 192.168.118.66 dev lo:0
[root@server2 network-scripts]# yum install -y httpd
[root@server2 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@server2 network-scripts]# systemctl start httpd
[root@server2 network-scripts]# vim /var/www/html/index.html
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is server2</h1>
</body>
</html>
~         

此时可以在浏览器上查看网页(不断刷新),同时在负载调度器上实时观察
[root@lvs-01 network-scripts]# watch -n 1 ipvsadm -Lnc



Keepalived安装设置

LVS-01:

[root@lvs-01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {            			 #定义全局参数
      router_id lvs_01  		   	 #热备组内的设备名称不能一致
}
vrrp_instance vi_1 {       			 #定义VRRP热备实例参数
      state MASTER         			 #指定热备状态,主为master,备为backup
      interface ens33      			 #指定承载vip地址的物理接口
      virtual_router_id 51 			 #指定虚拟路由器的ID号,每个热备组保持一致
      priority 110		   			 #指定优先级,数值越大越优先
      advert_int 1
      authentication {
           auth_type PASS
           auth_pass 6666
 }
virtual_ipaddress {        			 #指定集群VIP地址
      192.168.118.66
}
}
#指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
virtual_server 192.168.118.66 80 { 
      lb_algo rr               		 #指定调度算法,轮询(rr)
      lb_kind DR			  	 	 #指定集群工作模式,直接路由DR
      persistence_timeout 6			 #健康检查的间隔时间
      protocol TCP					 #应用服务采用的是TCP协议
#指定第一个web节点的地址,端口
real_server 192.168.118.50 80 {
      weight 1						 #节点权重
      TCP_CHECK {
          connect_port 80			 #添加检查的目标端口
          connect_timeout 3			 #添加连接超时
          nb_get_retry 3			 #添加重试次数
          delay_before_retry 3		 #添加重试间隔
   }
}
#指定第二个web节点的地址,端口
real_server 192.168.118.55 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
   }
}
}
[root@lvs-01 ~]# systemctl start keepalived.service 		#开启keepalived
[root@lvs-01 ~]# systemctl status keepalived.service 
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 星期一 2021-07-26 21:45:42 CST; 7s ago
  Process: 83249 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
           

LVS-02:

[root@lvs-02 network-scripts]# vim /etc/keepalived/keepalived.conf 
global_defs {             
      router_id lvs_02          		#这里得更改序号
}
vrrp_instance vi_1 {       
      state BACKUP         
      interface ens33      
      virtual_router_id 51 
      priority 100       				#优先级改为100        
      advert_int 1
      authentication {
           auth_type PASS
           auth_pass 6666
 }
virtual_ipaddress {        
      192.168.226.100
}
}
virtual_server 192.168.118.66 80 { 
      lb_algo rr                
      lb_kind DR                                
      persistence_timeout 6             
global_defs {
      router_id lvs_01
}
vrrp_instance vi_1 {
      interface ens33
      virtual_router_id 51
      priority 110      
      advert_int 1
           auth_pass 6666
 }         
      192.168.118.66
}     
}     
virtual_server 192.168.118.66 80 {
      protocol TCP
real_server 192.168.118.50 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
   }
}
real_server 192.168.118.55 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
   }
}
}
[root@lvs-02 network-scripts]# systemctl start keepalived.service 
[root@lvs-02 network-scripts]# systemctl status keepalived.service 
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2021-07-26 21:46:28 CST; 11s ago
  Process: 79523 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

此时在LVS-02上用“ip a”看不到VIP地址,假设LVS-01发生故障(关闭keepalived),再查看LVS-02的IP地址详细信息
[root@lvs-01 ~]# systemctl stop keepalived.service 

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…