LVS简介

LVS简介

Ivs

nginx的负载均衡

四层代理 ip+端口

七层代理 对http的请求进行处理

Ivs也是负载均衡的一种方式:

lvs是四层的负载均衡。

lvs :linux virtual server

Is是基于集群的方式实现

集群和分布式:

分布式:把不同组件部署在不同的服务器上,组件之间(应用)依靠网路进行通信,实现定制化的功能。

集群:

多个应用。相同的应用,部署在不同的服务器,提供统一的服务,以及同样的功能。

系统性能扩展方式

单节点的扩展方式

  • 垂直扩展,向上扩展,提升计算机的性能(硬件性能)。性能提升是有瓶颈的。

  • 水平扩展,向外扩展,增加设备的方式提供性能。这就是集群的由来

集群的类型

负载均衡 LB (load balancing)

HA (high Availiablity)高可用

负载均衡的高可用

主备高可用 (keepalive) 用的就是vrrp

系统的可靠性指标

值范围: 0-1

MTBF:平均无故障时间

MTTR:平均恢复时间

A= MTBF/(MTBF+MTTR)*100%

A的值要无限接近于1

三个9:

99.9

1年=365=8,760小时

(1-99.9)*8,760=8.76小小时

停机时间:不算在故障时间范围之内。

计划内停机时间:这个是不算在故障时间

计划外的停机时间:算在故障时间内。

Ivs集群的术语

  • VS virtual server:Ivs的逻辑名字,外部访问lvs的ip地址和端口
  • DS director server:Ivs集群当中的主服务器,调度器,是整个集群的核心,接受客户端的请求然后根据负载均衡的算法转发到后端的RS
  • RS real server:lvs集群中的真实服务器,也就是后端服务器,接受调取器转发过来的请求
  • CIP client ip:客户端的ip地址
  • VIP virtual ip:集群对外提供好的虚拟ip地址
  • DIP:调度器的ip地址
  • RIP:后端服务器的ip地址

Ivs负载均衡的方式

  • NAT:NAT方式是最常用的负载均衡方式之一
  • DR:直连路由模式,性能是最高的。
  • TUN:隧道模式 vpn(需要运营商提供vpn的地址)

ipvsadm的操作命令

ipvsadm用来管理和配置lvs集群的工具,集成在linux系统的内核当中。

csharp 复制代码
-A:添加虚拟服务器
-D:删除整个虚拟服务器,虚拟服务器对应的就是后台的真实服务器
-s:指定负载均衡点算法,加载时必须要声明算法(rr轮询 wrr加权轮询 lc最小连接数 wlc加权最小连接数 )
-a:添加真实服务器
-m:表示集群使用nat模式
-g:表示使用DR模式
-i:表示使用tun模式
-w:设置权重
-l:列表形式
-n:数字化的显示ip和端口
-t:指定调度器的vp地址的ip和端口
-r:指定RIP的ip地址和端口

NAT

  1. 做源地址转换
  2. 调度器要做数据包转发生
  3. 后端服务器的地址在一个网段
  4. 根据负载均衡的算法转发到RS
  5. RS处理请求响应客户端
  6. 调度器响应给客户端
  7. 这个调度的IP地址一般是一个可以和公网进行通信的ip地址
  • NAT的性能较差,第一要进行转换,第二要进行数据包的路由
  • 调度器的压力很大,地址转换,负责均衡算法 数据包转发,响应。非常影响性能。
  • NAT模式的后端真实服务器10-30台之间。

创建流程

nginx1调度器 192.168.246.6 12.0.0.10

csharp 复制代码
vim /etc/netplan/01-network-manager-all.yaml
network:
  ethernets:
    ens33:
      dhcp4: no
      addresses: [192.168.246.6/24]
      gateway4: 192.168.246.2
      nameservers:
        addresses: [218.2.135.1]
    ens38:
      dhcp4: no
      addresses: [12.0.0.10/24]

netplan apply
apt -y install ipvsadm
modprobe ip_vs  #手动加载ip_vs模块


#cat /proc/net/ip_vs   #查看策略
#ipvsadm -ln  #查看策略
#ipvsadm -C  #清空所有策略
#ipvsadm -d -r 192.168.233.62:80 -t 12.0.0.10:80   #删除指定节点

systemctl restart ipvsadm.service
systemctl status ipvsadm.service

#命令行输入
ipvsadm -A -t 12.0.0.10:80 -s rr
ipvsadm -a -t 12.0.0.10:80 -r 192.168.246.7:80 -m
ipvsadm -a -t 12.0.0.10:80 -r 192.168.246.8:80 -m
#当访问12.0.0.10时,数据包可以转发到的真实服务器之一

vim /etc/sysctl.conf
#28行 
net.ipv4.ip_forward=1

sysctl -p   #启动
iptables -t nat -A POSTROUTING -s 192.168.246.0/24 -o ens37 -j SNAT --to 12.0.0.10

nginx2 后端真实服务器1 192.168.246.7

csharp 复制代码
root@u2:~# echo 123 > /usr/local/nginx/html/index.html 
root@u2:~# systemctl restart nginx
root@u2:~# vim /etc/netplan/01-network-manager-all.yaml
#网断改为12.0.0.10
root@u2:~# netplan apply

nginx3 后端真实服务器1 192.168.246.8

csharp 复制代码
root@u3:~# echo 123 > /usr/local/nginx/html/index.html 
root@u3:~# systemctl restart nginx
root@u3:~# vim /etc/netplan/01-network-manager-all.yaml
#网断改为12.0.0.10
root@u3:~# netplan apply

使用客户端连接需要更改ip与网段

csharp 复制代码
root@u4:~# curl 12.0.0.10
123
root@u4:~# curl 12.0.0.10
456

加权轮询的加权方式

csharp 复制代码
ipvsadm -A -t 12.0.0.10:80 -s wrr
ipvsadm -a -t 12.0.0.10:80 -r 192.168.246.7:80 -m -w 3
ipvsadm -a -t 12.0.0.10:80 -r 192.168.246.8:80 -m -w 1

DR

直连(接)路由模式

DR模式虚拟出一个ip,这个虚拟访问用来访问的。客户端都是访问虚拟的ip地址。

虚拟ip地址也是在调度器上,调度器根据负责均衡算法选择一条RS,RS处理完请求之后直接响应给客户端,不是由调度器再来影响客户端。

直接路由模式就是二层转发

  • 调度器的ip和真实服务器的ip必须在同一网段,同一网段才能进行二层转发。
  • 内核来进行判断,数据包判断目标是本机的VIP,ipvs对数据包的请求进行分析,是否在集群的服务范围之内。
  • 是的话,对数据包进行重新封装,源MAC地址是vip地址,目标MAC地址是真是服务器的地址。
  • 源IP和目的ip地址都没有发生变化。

DR模式的特点

  1. 调度器和真实服务器必要在同一个网段
  2. 真实服务器的地址可以是内网也是公网,如果RIP是公网可以直接(没有这么做)
  3. vip地址在调度器上有,在真实服务器也需要配置。
    ARP根据MAC地址,找到对应IP地址。如果不配置调度服务器和真实服务器之间无法通信。
    修改内核的方式,让真实的物理地址来响应请求。
  4. 所有真实服务器的网关不能指向到调度器的ip地址。真实服务器的服务器的数据不通过调度器进行转发。
csharp 复制代码
vim /etc/sysctl.conf
#调度器末尾添加
net.ipv4.conf.all.send_redirects=0
#禁止系统发送icmp重定向的消息net.ipv4.conf.default.send_redirects=0
#禁用网络接口发送icmp重定向net.ipv4.conf.ens33.send_redirects=0
#指定ens33发送重定向

route add -host 192.168.233.100 dev ens33
csharp 复制代码
vim /etc/sysctl.conf
#真机末尾添加
net.ipv4.conf.ens33.arp_ignore = 1
#设置ens33接口忽略来自任何接口的ARP请求
net.ipv4.conf.ens33.arp_announce = 2
#设置接口仅仅公告本地的ip,不再告知虚拟的ip地址
route add -host 192.168.233.100 dev ens33

keepalive(高可用集群)

代理服务器和调度器都是单点模式,keepalive就是用来实现调度器的高可用集群。

工作原理

keepalive是专门为了Ivs集群开发出来的,但是适用场景不仅仅局限于Ivs

而且keepalive为后台的真实服务器做了一个健康检查,当服务不可用时,会自动的移除ipvs的转发策略,服务恢复时,会自动重新把策略加入到ipvs。

基于vrrp协议实现的调度器的高可用方案。

vrrp:虚拟路由的冗余协议。

keepalive实现

  1. 主备切换,优先级,当主故障时,可以自动切换到备,主恢复之后,如果主的优先级比备高,还是会自动的切换到主
  2. 故障检测和恢复功能
  3. 主备之间通过组播地址:224.0.0.18,互相发送健康检查的报文,确定主和备之间的通信(确定双方是否工作正常。)
  4. 通过配置vip来实现集群的入口,vrrp是一个冗余协议,主在工作时,备完全不参与集群的工作,只是监听主的状态。

架构配置

u1 主调度器

vip:192.168.246.100

u2 备调度器

u3真实服务器1

u4 真实服务器2

u5 访问测试的客户端

调度器

csharp 复制代码
#u1 u2安装
apt -y install ipvsadm keepalived
cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf
csharp 复制代码
vim /etc/keepalived/keepalived.conf

 1 ! Configuration File for keepalived
 2 
 3 global_defs {
 4    notification_email {
 5      acassen
 6    }
 7    notification_email_from Alexandre.Cassen@firewall.loc
 8    smtp_server 127.0.0.1
 #本地邮件服务,可以删除不要
 9    smtp_connect_timeout 30
 #本地邮件服务,可以删除不要
 10    router_id LVS_01
 #确定主备服务器的id号,必须不同
 11    vrrp_iptables
 #配置了之后keepalived重启之后不会添加iptables的策略。
 12 }
 13 
 14 vrrp_instance VI_1 {
 15     state MASTER
 #确定服务器的身份 主
 16     interface ens33
 #指定网卡设备
 17     virtual_router_id 50
 #虚拟路由的id,主备保持一致
 18     priority 100
 #优先级。谁数字大就是主
 19     advert_int 1
 #主备之间检查的心跳率
 20     virtual_ipaddress {
 21         192.168.224.100
 #集群的vip地址
 22     }
 23 }
 24 
 25 virtual_server 192.168.246.100 80 {
 26     delay_loop 6
 #健康检查的间隔时间
 27     lb_algo rr
 #负载均衡的算法
 28     lb_kind DR
 #lvs的模式
 29     persistence_timeout 50
 #连接保持的时间
 30     protocol TCP
 #服务采用的协议
 31     #指定的后台真实的服务器 
 32     real_server 192.168.246.8 80 {
 33         weight 1
 34         TCP_CHECK {
 35             connect_port 80
                #检查的目标端口是80
 36             connect_timeout 3
                #连接检查的超时时间3秒
 37             retry 3
                #重试的次数
 38             delay_before_retry 3
                #重试的间隔时间
 39         }
 40     }
 41     real_server 192.168.246.9 80 {
 42     weight 1
 43     TCP_CHECK {
 44         connect_port 80
 45         connect_timeout 3
 46         retry 3
 47         delay_before_retry 3
 48     }
 49 }

global_defs:整个vrrp的全局配置

vrrp_instance Vi1:指定网卡设备和vip地址的模块,以及确定vrrp中主备的关系

virtual server:指定转发的策略,以及Ivs的工作模式和负载均衡的算法

check:负责健康检查,只要是检查服务的端口。(监控服务状态一般都是监听端口。)

script:文本模式。也可以支持脚本形式的监控监控。

csharp 复制代码
root@u1:~# 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@u1:~# sysctl -p
root@u1:~# systemctl restart keepalived.service
root@u1:~# 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.246.100:80 rr persistent 50
  -> 192.168.246.8:80             Route   1      0          0         
  -> 192.168.246.9:80             Route   1      0          0  

真实服务器

csharp 复制代码
root@u3:~# vim /etc/netplan/01-network-manager-all.yaml
#将ens38网卡配置为192.168.246.100
root@u3:~# netplan apply
root@u3:~# vim /etc/sysctl.conf
root@u3:~# sysctl -p
net.ipv4.conf.ens38.arp_ignore = 1
net.ipv4.conf.ens38.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
root@u3:~# route add -host 192.168.246.100 dev ens38
root@u3:~# echo u3 > /usr/local/nginx/html/index.html

客户端

csharp 复制代码
root@u5:~# curl 192.168.246.100
u3

检查流程

1、检查配置的转发策略是否生效

2、检查主的vip地址是否生成

3、检查备服务器上是否有vip地址

4、模拟故障切换,主的vip能否飘到备服务器

5、主恢复之后vip是否能够会到主服务器

nginx实现keepalive的高可用

主nginx1

备nginx2

/usr/local/nginx/conf/nginx.conf中添加

脑裂

在HA系统,只要是通过vip这个机制实现的,都有可能会出现这个问题。

vip地址同时出现在了主和备上。

  1. 防火强屏蔽了主备的之间224.0.0.18的报文,导致互相都收不到,就认为对都已经挂起了。都认为自己是主
  2. 网卡出现故障(硬件故障),配置出问题:ip地址冲突。
  3. 心跳线:网线之间连接故障,断开,老化。
  4. keepalived的配置文件有问题,配置的相关项出现问题(80%)

解决脑裂的办法

软件层面

  • 抓包进行定位,查看组播的报文是否正常
  • 配置文件进行排查(网卡配置,应用配置)

硬件

  • 更换心跳线(网线)进行测试
  • 网卡硬件的问题
  • 内存和cpu,磁盘空间不足,也会出现脑裂。
相关推荐
七夜zippoe5 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6487 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满7 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9037 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技8 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀9 小时前
Linux环境变量
linux·运维·服务器
zzzsde9 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º10 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~10 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化