# 负载均衡
# 七层负载均衡
nginx是基于反向代理的负载均衡,做了三次握手
# 四层负载均衡
请求到达传输控制层的时候只是看了一下端口号,做数据包转发,并没有走三次握手
# 负载均衡的模式
# D-NAT(目标地址转换)
- 非对称的
- 发送数据包小,回复的数据包大
# DR(直接路由模式)
如何隐藏VIP
对外隐藏,对内可见
kernel parameter: 目标mac地址为全F,交换机触发广播 /proc/sys/net/ipv4/conf/IF/ arp_ignore: 定义接收到ARP请求时的响应级别; 0:只要本地配置的有相应地址,就给予响应; 1:仅在请求的目标(MAC)地址配置请求 到达的接口上的时候,才给予响应;
arp_announce:定义将自己地址向外通告时的通告级别; 0:将本地任何接口上的任何地址向外通告; 1:试图仅向目标网络通告与其网络匹配的地址; 2:仅向与本地接口上地址匹配的网络进行通告;
# TUN(隧道技术 )
- DIP->RIP数据包背上CIP->VIP
- VPN
# LVS
Linux内核集成了LVS叫ipvs模块,管理程序ipvsadmin
# 调度算法
# 静态调度方法
rr
轮循
wrr
加权轮询,根据权重轮询
dh:
sh:
# 动态调度方法
lc: 最少连接
wlc: 加权最少连接
sed: 最短期望延迟
nq: never queue
LBLC: 基于本地的最少连接
DH:
LBLCR: 基于本地的带复制功能的最少连接
# 如何知道哪个负载机负载了多少?
偷窥——只看不动手
偷窥握手和分手包信息,对负载机的负载进行管理
# LVS搭建
安装管理程序
yum install ipvsadmin -y
1
# LVS配置
管理集群服务
- 添加:-A -t|u|f service-address [-s scheduler] -t: TCP协议的集群 -u: UDP协议的集群 service-address: IP:PORT -f: FWM: 防火墙标记 service-address: Mark Number
- 修改:-E
- 删除:-D -t|u|f service-address
ipvsadm -A -t 192.168.9.100:80 -s rr
1管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight] -t|u|f service-address:事先定义好的某集群服务 -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m] : LVS类型
-g: DR -i: TUN -m: NAT
[ -w weight] 定义服务器权重
ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
1
2修改:-e
删除:-d -t|u|f service-address -r server-address
查看 -L|l -n: 数字格式显示主机地址和端口 --stats:统计数据 --rate: 速率 --timeout: 显示tcp、tcpfin和udp的会话超时时长 -:c 显示当前的ipvs连接状况
删除所有集群服务 -C:清空ipvs规则
保存规则 -S
ipvsadm -S > /path/to/somefile
1载入此前的规则: -R
ipvsadm -R < /path/form/somefile
1
# LVS实验
# 拓扑图
# 配置网络
node01
ifconfig eth0:8 192.168.150.100/24
1
node02 & node03
修改内核协议
cd /proc/sys/net/ipv4/conf/ cd eth0 echo 1 > arp_ignore echo 2 > arp_annonce cd ../all echo 1 > arp_ignore echo 2 > arp_annonce
1
2
3
4
5
6
7设置隐藏的vip
ifconfig lo2 192.168.150.100 netmark **255.255.255.255** #ifconfig lo2 down
1
2
# 安装启动服务
node02~node03:
yum install httpd -y service httpd start vi /var/www/html/index.html # from 192.168.150.1x
1
2
3
4
# LVS服务配置
node01:
yum install ipvsadm ipvsadm -A -t 192.168.150.100:80 -s rr ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.12 -g -w 1 ipvsadm -a -t 192.168.150.100:80 -r 192.168.150.13 -g -w 1 ipvsadm -ln
1
2
3
4
5
# 验证
浏览器访问 192.168.150.100 看到负载 疯狂F5 node01: netstat -natp 结论看不到socket连接 node02~node03: netstat -natp 结论看到很多的socket连接 node01: ipvsadm -lnc 查看偷窥记录本 TCP 00:57 FIN_WAIT 192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80 FIN_WAIT: 连接过,偷窥了所有的包 SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题
# 高用用
# 故障点
# lvs单点问题
影响
业务下线
解决
# RS(Real Server)故障
影响
部分部分用户请求异常,lvs还存有这个rs的负载记录
如何判断故障
访问一下,返回200 ok ,底层验证的是应用层的http协议
# 解决方案分析
单点问题
一变多
主备
如何判断主挂了?
- 方向性
- 主定时广播
- 备定时询问
- 效率性
- 定义判断条件
- 方向性
主主
实现
修改源码加逻辑
第三方
人定期观察
不可靠
企业追求自动化,把人解耦
程序实现HA
keeplived
RS故障
# keepalived
# 职责
- 监控自己的服务
- Master通告自己还活着,backup监听master状态,Master挂了,一堆backup推举出新的Master
- 配置,ip添加ipvs,keepalived是有配置文件的
- 对后端Server做健康检查
# 实验
主机: node01~node04
node01:
ipvsadm -C ifconfig eth0:8 down
1
2
node01,node04:
- 安装程序
yum install keepalived ipvsadm -y
1配置:
cd /etc/keepalived/ cp keepalived.conf keepalived.conf.bak vi keepalived.conf
1
2
3node01: vrrp:虚拟路由冗余协议!
vrrp_instance VI_1 { state MASTER // node04 BACKUP interface eth0 // 企业中一般会加多块网卡,用于传输不同的数据 virtual_router_id 51 priority 100 // 权重node04 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.150.100/24 dev eth0 label eth0:3 } } virtual_server 192.168.150.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 0 // session的时间,生产环境中需要设置一个合适值 protocol TCP real_server 192.168.150.12 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.150.13 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 scp ./keepalived.conf root@node04:
pwd
启动
service keepalived start
# 特点
Master挂掉恢复之后会抢回主
RS故障恢复之后
keepalived能自动检查到并恢复提供服务
keepalived启动之后有三个keepalived进程
主进程:广播自己还活着
另外两个子进程:做RS的健康检查
杀死keepalived进程
造成两个lvs主机都配置了VIP,从到导致客户端数据包出现紊乱,握手包或者分手包可能会负载给不同的RS,破坏了原子性。出现不能建立连接或者丢包。
为了解决上面的问题引入了一个不可靠的keepalived,出现了新的问题