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,磁盘空间不足,也会出现脑裂。
相关推荐
这题怎么做?!?14 分钟前
ARP协议及其具体过程
运维·服务器·网络
Lay_鑫辰15 分钟前
禾川HCQ1系列PAC脉冲控制步进驱动器
运维·人工智能·单片机·嵌入式硬件·自动化
路飞雪吖~24 分钟前
【Linux】进程控制
linux·运维·服务器
wy02_28 分钟前
Linux基本命令
linux·运维
见欢.31 分钟前
Nginx解析漏洞靶场通关(nginx_parsing&CVE-2013-454)
nginx
北京华人开创公司40 分钟前
京准电钟:电厂自控NTP时间同步服务器技术方案
运维·服务器·卫星时钟服务器·ntp时间服务器·时间同步服务器·网络时间服务器·北斗授时服务器
一只小爪子1 小时前
Redis 常用配置项说明
linux·运维·数据库·redis
痞老板21 小时前
【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化
运维·安全·fiddler·代理模式
Joyner20182 小时前
ubuntu批量依赖库拷贝(ldd)
linux·运维·ubuntu
csdn_金手指2 小时前
Jenkins持续交付web应用,通过docker制作相关的镜像进行发布部署
运维·jenkins