Day06-01-lvs
- 0. 核心内容
- 1.负载均衡项目 选择
- 故障:
- 2.lvs 预备姿势-arp
- 3.lvs 概述
- 4. lvs工作模式
- 4.1 预备姿势
- 4.2 lvs-dr模式
- 4.3 lvs-nat模式
- 4.4 小结
- 5. lvs-dr模式
- 5.1 环境准备
- 5.2 lvs-dr模式配置流程
- 1) lvs服务端配置
- 2) web服务器 RS服务端配置
- 3) 小结
- 4) 调试
- 5.3 抓包查看lvs dr
- 5.4 lvs规则 备份与恢复
- 6. lvs 负载均衡排错流程
- 7. lvs 与keepalived配合
- 8. lvs
0. 核心内容
- 负载均衡选型项目
- 负载均衡 lvs 工作模式 : dr nat tun full nat
- 部署后通过wireshark抓包
1.负载均衡项目 选择
star法则:表达故障/项目 如何说的更流畅或逻辑性
- s situation 场景/在什么情况下?
- t task/target 目标/你要完成什么?
- a action 动作/你是怎么做的?
- r result 结果/最终结果如何?
负载均衡选择项目 | |
---|---|
s | 公司演变用户量越来越多.选择负载均衡 搭建多台web服务器.对比与选择 负载均衡 |
T | 选择1款 适合负载均衡 |
A | 1.找出市面上常见负载均衡: 硬件F5 A10 开源软件: lvs,nginx,haproxy 2.对比 3.根据公司实际需求选择 |
R | 根据当前访问量,选择 nginx负载均衡 nginx proxy缓存. |
常见负载均衡对比 | 优势 | 缺点 |
---|---|---|
硬件:F5 | 性能好 技术支持 | 价格昂贵 购买2台1对 . |
lvs | 工作四层 效率极其高 对数据做的转发 负载均衡 | 部署 维护(运维成本较高) |
nginx/tengine/openresty(lua) | 使用简单 支持4层(1.9版本后支持)和7层 反向代理 缓存 流量镜像(mirror) | 处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以上) 卡 |
haproxy | 相对复杂 支持4层和7层 反向代理 动态加载配置文件 | 处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以上 比nginx多) 卡 |
云服务: clb(slb) | clb 4层和7层 | 只能支持url或者域名的转发 |
alb | alb 7层 | 支持更多的7层的转发功能 基于用户请求头 http_user_agent 用户语言 镜像流量(申请,深圳) |
- 4层 lb vs 7层 lb
- 4层负载均衡 传输层 负载均衡最多认识到端口
- 7层负载均衡 应用层 url uri 转发 http https
-
负载均衡: Lvs 对数据进行转发
-
反向代理: nginx/haproxy 做的代理 代替用户找,找到后发送给用户
-
lvs vs ngx区别
lvs | ngx | |
---|---|---|
区别01 | 仅工作在4层,性能好 | 4层和7层,配置方便 |
区别02 | lvs(DR模式)处理数据流程是转发 | ngx对处理进行代理(2次请求,2次响应) |
故障:
一.多个虚拟主机通过域名访问 直接访问web服务器ok 通过负载均衡 访问 只显示 第1个虚拟主机.
负载均衡向后端发出请求的时候 请求Host upstream 池塘 名称. 所以相当于是使用ip访问后端服务器.
访问第1个虚拟主机.
proxy_set_header Host $host;
二.使用负载均衡后端web服务器记录用户真实ip(客户端ip)地址
proxy_set_header X-Forwarded-For $remote_addr;
2.lvs 预备姿势-arp
-
DNS 域名解析 域名 -->ip
-
arp协议 地址解析协议 IP----->mac地址 3层协议工作在2层
- ip(网络层 3层)
- mac (2层)
-
arp解析过程
- 发出广播 请求ip对应的mac地址是? Who has 10.0.0.8? Tell 10.0.0.7
- 发出响应 单播 告诉对方我的mac地址是xxxx
- 0.8 发请请求 询问 .7的mac地址 单播
- 0.7 把自己mac地址 发送给.8
- 0.7缓存1份mac地址(arp缓存)
- arp病毒
- 老男孩教育-arp欺骗
- 员工入职的时候 记录号 mac 或 mac和ip绑定
- 找出mac 在网络设备 屏蔽
3.lvs 概述
- sersync /jumpserver
- linux virtual server linux虚拟服务器 负载均衡
- lvs 放到Linux内核中 内核模块 ip_vs
- 通过命令行管理工具或服务,间接管理lvs
- 命令行管理命令 ipvsadm ()
- 服务: keepalived通过配置文件的方式管理lvs. ( keepalived for lvs ) 控制管理 ip_vs内核模块
4. lvs工作模式
-
dr direct routing 直接路由模式
-
nat
-
tun 隧道
-
full nat 完全nat模式
4.1 预备姿势
名称 | 单词 | 含义 |
---|---|---|
CIP | client ip | 客户端ip地址 |
VIP | Virtual ip | 虚拟ip |
DIP | director ip | 负载均衡本身的ip |
RS服务器 | real server | 真实服务器 处理用户请求. |
RIP | Real erver IP | real server ip 真实服务器的ip地址 |
4.2 lvs-dr模式
- 特点
- lvs dr模式中lvs只负责转发并修改用户的目标IP的mac地址 dmact
- lvs dr模式中服务端给用户的响应是通过后端rs服务器处理直接响应给用户. 不需要再通过lvs.
- lvs vip公网ip,rs服务器也要有公网ip.
- 优势
- lvs dr支持更高并发(几万 几十万) ,nginx(1w)
- 局限性
- lvs服务器和后端rs服务器,必须要在同1个局域网,涉及到arp解析
- 用户请求过来的端口,无法修改的. 用户的请求是什么端口 ,后端rs服务器就要开端口
- lvs dr模式需要lvs服务器进行配置,同时还要在后端rs服务端:lo网卡绑定vip;抑制arp解析
4.3 lvs-nat模式
- lvs-nat模式特点
- lvs服务器与rs服务器可以不在同一局域网
- nat模式:流量进出都要经过lvs,效率性能不高 .
- 端口也可以不同
- 基于nat模式进阶模式 full-nat模式(数据流入的时候与nat模式一致,数据流出的时候类似于dr模型,直接响应给用户)
4.4 小结
- lvs dr模式 nat模式 tun(隧道模式) full nat模式
- 官网传送门http://www.linuxvirtualserver.org/zh/lvs3.html#google_vignette
5. lvs-dr模式
5.1 环境准备
主机 | 服务 | ip |
---|---|---|
lb01 | lvs | 10.0.0.5 |
vip | vip | 10.0.0.3 |
lb02 | 10.0.0.6 | |
web01 | nginx | 10.0.0.7 |
web02 | nginx | 10.0.0.8 |
- lvs.oldboylinux.com
lb01 lb02 #nginx 关闭
web01 web02 lvs.oldboylinux.com
/code/lvs/index.html
#web01
cat index.html
lvs web01
#web02
cat index.html
lvs web02
[root@web01 ~]# cat /etc/nginx/conf.d/lvs.oldboylinux.com.conf
server {
listen 80;
server_name lvs.oldboylinux.cn;
root /app/code/lvs;
location / {
index index.html ;
}
}
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com 172.16.1.7
lvs web01 10.0.0.7 172.16.1.7
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com 172.16.1.8
lvs web02 10.0.0.8 172.16.1.8
#lb01 lb02
##关闭 keepalived nginx负载均衡
systemctl stop keepalived nginx
systemctl disable keepalived nginx
yum install -y ipvsadm
#软件包内容
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm #管理lvs规则 ip_vs
/usr/sbin/ipvsadm-restore #恢复从文件中恢复lvs规则
/usr/sbin/ipvsadm-save #保存lvs规则
#检查 ip_vs 内核模块是否加载
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs 145497 0
nf_conntrack 139264 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
5.2 lvs-dr模式配置流程
1) lvs服务端配置
#01.手动添加vip,后面是由keepalived生成
ip addr add 10.0.0.3/24 dev eth0 label eth0:0
#02. 查看lvs规则
[root@lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
#03. 清空规则,要备份
ipvsadm -C #clear清除 #iptables -F flush
#04. 设置 tcp超时时间
ipvsadm --set 30 5 60 #设置tcp 超时时间
#05. 添加规则
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
#添加规则 ngx upstream
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#-A --add-service 创建池塘
#-t --tcp-service tcp协议
#10.0.0.3:80 组名称
#-s scheduler 轮询算法 wrr weight 加权轮询 rr lc wlc
#-p persistent 会话保持时间
#添加规则 向upsteam中添加server
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
ipvsadm -ln
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
#-a 添加 rs服务器
#-t tcp协议
#-r 指定rs服务器ip
#-g --gatewaying dr模式 默认的
#-w 权重
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
[root@lb01 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port
TCP 10.0.0.3:80 0 0 0 0 0
-> 10.0.0.7:80 0 0 0 0 0
-> 10.0.0.8:80 0 0 0 0 0
upstream web_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
location / {
proxy_pass http://web_pools;
}
}
- 加载lvs内核模块
[root@lb01 ~]# lsmod |grep ip_vs
[root@lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs 145497 0
nf_conntrack 133095 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
- lb负载均衡 规则的备份与恢复
#ipvsadm 规则的备份与恢复
[root@lb01 ~]# ipvsadm-save -n >/root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward WeightActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb01 ~]# ipvsadm-restore <root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
2) web服务器 RS服务端配置
#lo网卡绑定 vip
#ip addr add 10.0.0.3/32 dev lo label lo:1
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
[root@web01 ~]# systemctl restart network
[root@web02 ~]# ip a s lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc
noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.3/32 brd 10.0.0.3 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
#抑制arp解析
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
3) 小结
- lvs服务器: 配置
- 后端rs服务: 配置:lo vip ;抑制arp解析
4) 调试
-
不要在lvs本地进行测试
-
lvs应对高并发负载均衡,访问量比较少的时候,不会像nginx 1:1
-
抓包wireshark
-
测试 准备 wireshark 抓包
-
curl 10.0.0.[7-8]
-
浏览器10.0.0.3/index.html
-
不要在 lvs本地进行测试 curl
-
lvs 高并发 大访问量使用的 nginx 接近于1:1
5.3 抓包查看lvs dr
5.4 lvs规则 备份与恢复
- 后面我们通过keepalived管理lvs
- ipvsadm-save -n
- ipvsadm-restore <
[root@lb01 ~]# ipvsadm-save -n
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
-A -t 10.0.0.4:80 -s wrr -p 20
-a -t 10.0.0.4:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.4:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb01 ~]# ipvsadm-restore < /root/ipvsadm.conf
[root@lb01 ~]# ipvsadm-restore < /root/ipvsadm.conf
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
TCP 10.0.0.4:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
6. lvs 负载均衡排错流程
故障:
- 不通过浏览器访问 命令行进行访问 测试 10.0.0.3
- ping/telnet
- 直接访问后端rs服务器进行测试
- 某一台web服务器配置是否正常
7. lvs 与keepalived配合
-
keepalived for lvs
-
配置文件分为几个部分?
#GLOBAL CONFIGURATION 全局配置部分
route_id 每个keepalived软件 独一无二 id
#VRRPD CONFIGURATION 配置vip vrrp实例部分
#LVS CONFIGURATION 配置管理lvs
#GLOBAL CONFIGURATION 全局定义部分
global_defs {
router_id lb01 #keepalived身份 id 每个keepalived 不同
}
#VRRPD CONFIGURATION vrrp实例部分 虚拟路由冗余协议vrrp
vrrp_instance oldboy { #实例名称 在同1对主备之间 要一致
state MASTER #MASTER BACKUP
interface eth0 #指定网卡 公网网卡
virtual_router_id 62 #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同
priority 100 #优先级 主>备 相差50
advert_int 1 #interval 间隔 心跳间隔 秒 每隔1秒检查
authentication { #认证 方式
auth_type PASS #简单认证
auth_pass 1234 #在同1对 主备之间一直
}
virtual_ipaddress { #vip
10.0.0.3/24 dev eth0 label eth0:0 #ip addr add 10.0.0.3/24 dev eth0 label eth0:0
}
}
#ip addr add
#LVS CONFIGURATION 管理lvs
##ipvsadm 通过命令
##keepalived 通过 配置文件控制lvs
# vip 端口
#ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#相当于ngx的upstream
virtual_server 10.0.0.3 80 { #创建组 池塘
##ipvsadm -A -t 10.0.0.3:80 -s wrr -p 50
delay_loop 6
lb_algo wrr #轮询算法 lc least conn 最小连接数 或者 lvs_sched
# wlc
#weighted round robin
lb_kind DR # lvs DR模式 lvs_method
nat_mask 255.255.255.0 #vip对应的子网掩码
persistence_timeout 20 #会话保持时间 -p
protocol TCP #协议 -t
#ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
#指定rs服务器
real_server 10.0.0.7 80 { #rs服务器的配置
weight 1 #权重
TCP_CHECK { #-t TCP_CHECK 检查 传输层 tcp/udp 端口
#三次握手 建立连接 与你的端口建立连接
#四次挥手
# 或者 指定url进行http检查 HTTP_GET
connect_timeout 8
nb_get_retry 3 #number of get retry重试的次数
delay_before_retry 3 #每次检查之前 等待3秒
connect_port 80 #检查端口
}
}
# HTTP_GET {
# url {
# #path指定uri
# # path /nginx_status
# status_code 200
# }
# connect_timeout 8
# nb_get_retry 3
# delay_before_retry 3
# }
#nginx负载均衡
#upstream web_pools {
#server 10.0.0.7:80 wegiht=1 max_fails=3fail_timeout=30s ;
#}
real_server 10.0.0.8 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
virtual_server 10.0.0.3 80 { #创建组 池塘
delay_loop 6
lb_algo wrr #轮询算法 lc leastconn 最小连接数
# wlc
#weighted round robin
lb_kind DR # lvs DR模式
nat_mask 255.255.255.0 #vip对应的子网掩码
persistence_timeout 50 #会话保持时间 -p
protocol TCP #协议 -t
#ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g-w 1
real_server 10.0.0.7 80 { #添加rs服务器
weight 1
TCP_CHECK { #健康检查 检查端口
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
real_server 10.0.0.8 80 { #添加rs服务器
weight 1
TCP_CHECK { #健康检查 检查端口
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 10.0.0.3 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.0.0.7 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.8 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
- 搭建与检测
- 关闭keepalived 是否切换 ok
- 关闭某一个web服务器:nginx
8. lvs
- lvs-arp ip(3层) -->mac(2层) 工作在哪层? 3层协议工作在2层.
- lvs 常见模式 dr nat tun(隧道) full nat
- lvs+keepalived