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
- 做源地址转换
- 调度器要做数据包转发生
- 后端服务器的地址在一个网段
- 根据负载均衡的算法转发到RS
- RS处理请求响应客户端
- 调度器响应给客户端
- 这个调度的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模式的特点
- 调度器和真实服务器必要在同一个网段
- 真实服务器的地址可以是内网也是公网,如果RIP是公网可以直接(没有这么做)
- vip地址在调度器上有,在真实服务器也需要配置。
ARP根据MAC地址,找到对应IP地址。如果不配置调度服务器和真实服务器之间无法通信。
修改内核的方式,让真实的物理地址来响应请求。 - 所有真实服务器的网关不能指向到调度器的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实现
- 主备切换,优先级,当主故障时,可以自动切换到备,主恢复之后,如果主的优先级比备高,还是会自动的切换到主
- 故障检测和恢复功能
- 主备之间通过组播地址:224.0.0.18,互相发送健康检查的报文,确定主和备之间的通信(确定双方是否工作正常。)
- 通过配置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地址同时出现在了主和备上。
- 防火强屏蔽了主备的之间224.0.0.18的报文,导致互相都收不到,就认为对都已经挂起了。都认为自己是主
- 网卡出现故障(硬件故障),配置出问题:ip地址冲突。
- 心跳线:网线之间连接故障,断开,老化。
- keepalived的配置文件有问题,配置的相关项出现问题(80%)
解决脑裂的办法
软件层面
- 抓包进行定位,查看组播的报文是否正常
- 配置文件进行排查(网卡配置,应用配置)
硬件
- 更换心跳线(网线)进行测试
- 网卡硬件的问题
- 内存和cpu,磁盘空间不足,也会出现脑裂。