LVS
一、概述
1.常见负载均衡
常见负载均衡对比 | 优势 | 缺点 |
---|---|---|
硬件: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 用户语言 |
2. 4层lb vs 7层lb
4层负载均衡 传输层 负载均衡最多认识到端口
7层负载均衡 应用层 url,uri 转发 http https
3.负载均衡 vs 反向代理
负载均衡: lvs 对数据进行转发
反向代理 :nginx/haproxy 做的代理 代替用户找 找到后发送给用户
lvs | ngx | |
---|---|---|
区别01 | 仅工作在4层,性能好 | 4层和7层,配置方便 |
区别02 | lvs(DR模式)处理数据流程是转发 | ngx对处理进行代理(2次请求,2次响应) |
4.lvs 概述
linux virtual server linux虚拟服务器 负载均衡
lvs 放到Linux内核中内核模块 ip_vs
通过命令行管理工具或服务,间接管理lvs
- 命令行管理命令 ipvsadm ()
- 服务: keepalived通过配置文件的方式管理lvs. ( keepalived for lvs ) 控制管理 ip_vs内核模块
二、lvs工作模式
dr direct routing 直接路由模式
nat
tun 隧道
full nat 完全nat模式
1.一些名词
名称 | 单词 | 含义 |
---|---|---|
CIP | client ip | 客户端ip地址 |
VIP | Virtual ip | 虚拟ip |
DIP | director ip | 负载均衡本身的ip |
RS服务器 | real server | 真实服务器 处理用户请求. |
RIP | Real erver IP | real server ip 真实服务器的ip地址 |
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解析
3.lvs - nat模式
特点
- lvs服务器与rs服务器可以不在同一局域网
- nat模式:流量进出都要经过lvs,效率性能不高
- 端口也可以不同
基于nat模式进阶模式 full-nat模式(数据流入的时候与nat模式一致,数据流出的时候类似于dr模型,直接响应给用户)
三、dr模式
1.环境准备
主机 | 服务 | ip |
---|---|---|
vip | vip | 10.0.0.3 |
lb01 | lvs | 10.0.0.5 |
web01 | nginx | 10.0.0.7 |
web01 | nginx | 10.0.0.8 |
2.准备web环境
#web01
[root@web01 ~]# mkdir -p /app/code/lvs
[root@web01 ~]# echo "`hostname` `hostname -I`" >/app/code/lvs/index.html
[root@web01 ~]# cat /etc/nginx/conf.d/lvs.conf
server {
listen 80;
server_name lvs.cn;
root /app/code/lvs;
location / {
index index.html ;
}
}
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# curl -H Host:lvs.cn http://172.16.1.7
#web02
[root@web02 ~]# mkdir -p /app/code/lvs
[root@web02 ~]# echo "`hostname` `hostname -I`" >/app/code/lvs/index.html
[root@web02 ~]# cat /etc/nginx/conf.d/lvs.conf
server {
listen 80;
server_name lvs.cn;
root /app/code/lvs;
location / {
index index.html ;
}
}
[root@web02 ~]# systemctl restart nginx
3.关闭lb的keepliaved nginx
[root@lb01 ~]# systemctl stop keepalived.service nginx.service
4.lb安装lvs
[root@lb01 ~]# yum -y install 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 145458 0
nf_conntrack 139264 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
5.lvs服务端配置
#手动添加vip,后面是由keepalived生成
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
[root@lb01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:fb:43:58 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/24 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefb:4358/64 scope link
valid_lft forever preferred_lft forever
#查看lvs规则
[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 ~]# ipvsadm -C
#设置 tcp超时时间
[root@lb01 ~]# ipvsadm --set 30 5 60
#添加规则 ngx upstream
[root@lb01 ~]# 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 会话保持时间
[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
#添加规则 向upsteam中添加server
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
#-a 添加 rs服务器
#-t tcp协议
#-r 指定rs服务器ip
#-g gatewaying dr模式 默认的
#-w 权重
[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
#规则的备份与恢复
ipvsadm-save -n > /root/ipvs.txt
ipvsadm-restore < /root/ipvs.txt
6.web服务器 RS服务端配置
#lo网卡绑定 vip
[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@web01 ~]# 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 brd 00: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
[root@web02 ~]# 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@web02 ~]# 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 brd 00: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解析
[root@web01 ~]# 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
[root@web01 ~]# sysctl -p
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
[root@web02 ~]# 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
[root@web02 ~]# sysctl -p
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
7.调试
不要在lvs本地进行测试
lvs应对高并发负载均衡,访问量比较少的时候,不会像nginx 1:1
C:\Windows\System32\drivers\etc
10.0.0.3 lvs.cn
8.lvs 与keepalived配合
#加注释
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
#添加rs服务器
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
}
}
#ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
#添加rs服务器
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
}
}
}
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
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
}
}
}
[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 ~]# systemctl start keepalived.service
标签:10.0,00,LVS,lvs,lo,linux,80,root
From: https://www.cnblogs.com/world-of-yuan/p/17331539.html