一.LVS介绍
1.1.LVS简介
LVS是Linux Virtual Server的简写,意思就是Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。
-
LVS技术点小结:
1、真正实现调度的工具是IPVS,工作在Linux内核层面。
2、LVS自带的IPVS命令行管理工具是ipvsadm。
3、keepalived实现管理IPVS及负载均衡器的高可用。
4、Red hat工具Piranha WEB管理实现调度的工具IPVS。
1.2 简单术语介绍
术语简写 | 术语含义 |
---|---|
CIP | 客户端的IP |
DIP | 负载均衡器对应的实际IP |
VIP | 虚拟IP,需要在调度器提供服务的IP |
RIP | 后端节点的IP |
LB | 负载均衡服务器 |
RS | 节点服务器,real server |
1.3 LVS调度算法
算法 | 说明 |
---|---|
rr | 轮循调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法很简单,但是只适合于RS节点处理性能相差不大的情况。 |
wrr | 加权轮循调度(Weighted Round-Robin),它将依据不同的RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数。 |
wlc | 加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值依次为Wi(I=1…n),当前的TCP连接次数依次为Ti(I=1…n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。 |
dh | 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
sh | 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS。 |
1.4 LVS参数
1.41创建资源池命令
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
参数说明:
-A:–add-service,表示添加一个虚拟服务器
-p: --会话保持时间 默认300s
-t:–tcp-service,指定这是一个tcp的虚拟服务器
-u:–udp-service,指定这是一个udp的虚拟服务器
10.0.0.3:80:表示提供服务的ip地址以及端口号
-s:–scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc.
1.42增加后端节点命令
#dr模式命令
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
#nat模式命令
ipvsadm -a -t 100.0.0.3:80 -r 192.168.1.2:80 -m -w 1
ipvsadm -a -t 100.0.0.3:80 -r 192.168.1.3:80 -m -w 1
#upstream server server
-a 添加server rs服务器
-t tcp
-u udp
-r 指定rs服务器ip:port
-g --gatewaying 直接路由模式 dr模式
-m --nat模式
-w weight 权重
1.43查看ipvs规则信息
ipvsadm -ln (-nl报错) #查看规则
ipvsadm -save
二.LVS工作模式
1.lvs-DR模式
1.1DR工作模式原理
原理:客户端向目标vip发出请求,lvs接收 ,LVS根据负载均衡算法选择一台活跃的的节点,将此节点的ip所在网卡的mac地址作为目标mac地址,发送到局域网里
节点在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送到局域网.此时IP包的目标ip是客户端,源ip是自己的vip地址。
1.2 特点
1.Director与RS必须在同一个交换机里,因为他们根据mac来通讯的;
2.直接路由,最大的特点是不更改源IP和目标IP,改变的是MAC地址
3.响应和处理 是后端rs服务器处理 处理直接响应给用户. 物流量产生,所以可以.lvs dr 支持更高并发(几万 几十万) nginx(1w)
4.lvs vip公网ip rs服务器也要有公网ip
5.用户请求过来的端口 无法修改的.
1.4VS-DR工作模式部署搭建
1.41主机IP规划表
服务器说明 | IP地址 | 主机名称规则 |
---|---|---|
LVS服务器 | 10.0.0.5/24 | lb01 |
LVS服务器 | 10.0.0.6/24 | lb02 |
Nginx服务器 | 10.0.0.7/24 | nginx |
Nginx服务器 | 10.0.0.8/24 | apache |
10.0.0.3/24 | 虚拟IP地址 |
1.42 安装软件
[root@nginx ~]# yum -y install ipvsadm
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
*****自动安装过程略****
Installed:
ipvsadm.x86_64 0:1.26-4.el6
1.43 服务端配置
为LVS服务器添加一个虚拟IP地址:
ip addr add 10.0.0.3/24 dev eth0 label eth0:0
#或者keepalived生成
清空以前的旧配置:
ipvsadm --help #<==查看ipvsadm的配置参数
ipvsadm -C #<==清空所有配置
ipvsadm --set 30 5 60 #设置tcp 超时时间
添加一个虚拟vserver(相当于Nginx的upstream):
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
参数说明:
-A:–add-service,表示添加一个虚拟服务器
-p: --会话保持时间 默认300s
-t:–tcp-service,指定这是一个tcp的虚拟服务器
-u:–udp-service,指定这是一个udp的虚拟服务器
10.0.0.3:80:表示提供服务的ip地址以及端口号
-s:–scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc.
为服务器添加real 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
#upstream server server
-a 添加server rs服务器
-t tcp
-u udp
-r 指定rs服务器ip:port
-g --gatewaying 直接路由模式 dr模式
-w weight 权重
1.44节点端配置
需要添加到LVS负载均衡器的节点都需做如下配置:
绑定VIP
在网卡lo绑定虚拟IP,该虚拟IP同LVS服务器的虚拟IP,即10.0.0.3/24
ip addr add 10.0.0.3/32 dev lo label lo:1
route add -host 10.0.0.3 dev lo:1
或者
[root@web01 ~]# cat /etc/sysconfig/networkscripts/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
设置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
q 抑制参数说明
arp_ignore:定义目标地址为本地IP的ARP询问不同的应答模式 | |
---|---|
0 | 默认值,回应任何网络接口上对任何本地IP地址的arp查询请求 |
1 | 只回答目标IP地址是本地地址(lo)的ARP查询请求 |
2 | 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。 |
3 | 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。 |
4-7 | 保留未使用。 |
8 | 不回应所有(本地地址)的arp查询 |
arp_announce:对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制。确定不同程序的限制,宣布对来自本地源IP地址发出的ARP请求接口。 | |
---|---|
0 | 默认值,在任意网络接口(eth0,eth1,lo)上任何本地地址。 |
1 | 尽量避免不在该网络子网段的地址作出arp回应。当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访者IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。 |
2 | 对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有网络接口的子网中外出访问子网中包目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地VIP地址作为优先的网络接口 |
设置APR抑制原因
在这里插入图片描述
访问10.0.0.21:80,查看结果是否轮循。
[root@lb01 ~]# curl 10.0.0.3
apache.www
[root@lb01 ~]# curl 10.0.0.3
www
[root@lb01 ~]# curl 10.0.0.3
apache.www
[root@lb01 ~]# curl 10.0.0.3
www
keepalived配置LVS服务
###############################
# LVS的配置部分 #
###############################
virtual_server 10.0.0.21 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
#persistence_timeout 50
protocol TCP
real_server 10.0.0.16 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.17 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1.5.Keepalived与LVS配合
1.keepalived配置文件
vim /etc/keepalived/keepalived.conf
#GLOBAL CONFIGURATION 全局定义部分
global_defs {
router_id lb02 #keepalived身份 id 每个
keepalived 不同
} #VRRPD CONFIGURATION vrrp实例部分 虚拟路由冗余协议
##vrrp
vrrp_instance oldboy { #实例名称 在同1对主备之间 要一
state BACKUP #MASTER BACKUP
interface eth0 #指定网卡 公网网卡
virtual_router_id 62 #虚拟路由id 同1对 主备之间要一致
priority 100 #优先级 主>备
advert_int 1 #interval 间隔 心跳间隔
authentication { #认证
auth_type PASS #简单认证
auth_pass 1234
}
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
[root@lb01 ~]# ip a a 10.0.0.4/24 dev eth0 label eth0:0
[root@lb01 ~]# ifconfig add eth0 10.0.0.5/24 up
#LVS CONFIGURATION 管理lvs
##ipvsadm 通过命令
##keepalived 通过 配置文件控制lvs
# vip 端口
#ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
virtual_server 10.0.0.3 80 {
delay_loop 6
lb_algo wrr #轮询算法 lc least conn 最小连接数
# 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 { #-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 #检查端口
}
}
#nginx负载均衡
#upstream web_pools {
#server 10.0.0.7:80 wegiht=1 max_fails=3 fail_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
}
}
}
2.lvs-nat模式
2.1 nat工作模式原理
lvs-nat也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,目标ip是cip,源Ip是rip,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈
2.2 特点:
1.每台节点服务器的网关地址必须是lvs服务器的内网地址。#返回数据时,目标IP是CIP,所以网关要指定好。目标不是vip,是vip的话就不需要大家都在同一个局域网内,就不需要找网关了。理解误区在这里。
2.请求报文和响应报文必须经由Director转发;
3.支持端口映射,可修改请求报文的目标端口;
4.director必须为Linux系统,RS可以为任意系统;
3.3 缺点:
1.请 求响应,流量的出和入都需要经过LVS服务器,为当集群扩展到一定程度后,Director容易成为整个集群系统的瓶颈。
2.效率会比DR模式差一些
4.4 lvs-nat配置部署
dir端配置
1.关闭防火墙 firewalled iptables selinux
2.创建资源池
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
3.增加后端节点
ipvsadm -a -t 10.0.0.3:80 -r 172.16.1.7:80 -m
ipvsadm -a -t 10.0.0.3:80 -r 172.16.1.8:80 -m
4. 开启路由转发功能
echo ’net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
#加载
sysctl -p
5.后端节点配置
后端节点路由指向dip内网
#检查路由
route -n
#设置路由指向网关指向dip内网
#第一种方法:网卡配置文件中设置
# 第二种:route命令
route add default gw 172.16.1.5
或者
route add -host 172.16.1.5 gw 172.16.1.5
3.lvs-tun工作模式
不在修改请求报文的ip首部,而是通过在原有的ip首部之外(>cip—vip<),在封装一个ip报文首部(dip<–>rip)
1、RIP,DIP,VIP都要是公网IP
三.LVS报错总结
1.
解决:重启reboot解决
2.
解决:执行命令ipvsadm-save > /etc/sysconfig/ipvsadm