LVS
定义
Linux Virtual Server
即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中
该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案
终端互联网用户从外部访问公司的外部负载均衡服务器,把终端用户的Web请求会发送给LVS调度器
调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器
比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器
但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器
得到的服务内容都是一样的,整个集群对用户而言都是透明的
最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户
LVS
工作模式
1、
NAT
模式转换一个ip地址,效率低
2、
TUN
模式ip隧道
3、
DR
模式调度器跟真正的服务器在同一网段,强行修改mac地址,并不改变ip地址
4、
FullNAT
模式访问来源ip跟访问目的ip,效率低,麻烦,需要编辑内核
LVS
的优点
1、高并发连接
LVS基于内核网络层面工作,有超强的承载能力和并发处理能力,单台LVS负载均衡器,可支持上万并发连接
2、稳定性强
是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低
3、成本低廉
硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高
4、配置简单
LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理
5、支持多种算法
支持多种论调算法,可根据业务场景灵活调配进行使用
6、支持多种工作模型
可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题
7、应用范围广
LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括HTTP、数据库、DNS、FTP服务等
lvs
的缺点
工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用
LVS
常见的四种算法
rr
轮询算法,它将请求依次分配给不同的节点,各个节点均摊分配
这种算法简单,但只适合各个节点处理性能差不多的情况
wrr
加权轮训调度,它将依据不同节点的权值分配任务
权值较高的节点将优先获得任务,并且分配到的连接数将比权值低的节点更多
相同权值的节点得到相同数目的连接数
lc
最小连接数调度,IPVS表存储了所有活动的连接
LVS服务器会比较将连接请求发送到当前连接最少的节点
wlc
加权最小连接数调度,在节点性能差异较大的时候,可以为节点自动调整权重
权重较高的节点承担更大比例的连接
NAT
模式
因为请求与应答都要经过LVS服务器,所以访问量过大LVS会形成瓶颈,一般要求10-20台节点
注:(节点指后面的真实web服务器)
每台节点服务器的网关地址必须是LVS服务器的内网地址
NAT模式支持对IP地址和端口进行转换
即用户请求的端口和真实服务器的端口可以不一致
NAT
的特性
1、节点应该使用私有地址
2、节点的网关的必须指向LVS
3、节点IP和lvs服务器IP必须在同一网段内
4、请求和响应的报文都得经过LVS服务器;在高负载场景中,LVS服务器很可能成为系统性能瓶颈
搭建环境
lVS(server1): 192.168.1.1/24 192.168.1.100/24
修改server1的ip地址,并且添加虚拟ip地址
server2: 192.168.1.2/24
gateway: 192.168.1.1/24
修改server2的ip地址,并且网关设定为server1的ip地址
server3: 192.168.1.3/24
gateway: 192.168.1.1/24
修改server3的ip地址,并且网关设定为server1的ip地址
systemctl stop firewalld
关闭 firewall
setenforce 0
关闭 SELinux
server1
modprobe ip_vs
加载 ip_vs 模块
yum install -y ipvsadm
安装 ipvsadm
vim /etc/sysconfig/ipvsadm-config
修改LVS服务的配置文件:no->yes
重启服务的时候保存策略
systemctl start ipvsadm
首次开启会报错,无法开启服务
cat /var/log/messages
在日志里面查看服务启动错误的原因
touch /etc/sysconfig/ipvsadm
建立编写策略的文件
systemctl start ipvsadm
再次开启服务,正常
systemctl enable ipvsadm
开启自启
设置NAT模式的访问策略
ipvsadm -A -t 192.168.1.100:80 -s rr
添加vip
-A
:添加虚拟服务器
-t
:指定vip及tcp端口
-s
:指定算法
rr
:轮询
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -m -w 1
ipvsadm -a -t 1192.168.1.100:80 -r 192.168.1.3:80 -m -w 1
-a
:添加节点
-t
:指定vip和端口
-r
:指定节点ip及端口
-m
:表示使用NAT模式
-w
:设置权重
ipvsadm -ln
查看当前节点信息
systemctl restart ipvsadm
重启服务
server2
yum install -y http
安装 http
systemctl start httpd
开启
systemctl enable httpd
开机自启
vim /var/www/html/index.html
建立测试页面
server2.example.com
测试页面内容
server3
yum install -y http
安装 http
systemctl start httpd
开启
systemctl enable httpd
开机自启
vim /var/www/html/index.html
建立测试页面
server3.example.com
测试页面内容
测试
curl 192.168.1.100
访问192.168.1.100可以看到 server2 与 server3 轮流响应请求
TUN
模式
TUN模式简称隧道模式,隧道模式就是修改请求报文的首部IP,再加一层IP报头
优点:DS和RS不需要在同一网段,可以实现不同网络之间的访问
数据包从客户端发往DS服务器,DS服务器会根据调度策略确定要把请求给哪台RS,会在数据包外面再加一层IP报头
此时源ip从CIP变为了vip
目的ip从VIP变为了rip,数据包的请求来源就是ds调度器
请求的目的地是rs,rs在接收到数据包之后,请求包的来源本来是cip
但是加了一层数据包之后变为了vip,而rs服务器上也有ip
所以rs会把ip包的报头拆开,拆开发现请求的数据包访问的还是自己的ip
这时rs就会回复客户端的请求(跟DR模式类似,只不过多加了一层ip报头,封装ip守护)
搭建环境
lVS(server1): 192.168.1.1/24
修改server1的ip地址
server2: 192.168.1.2/24
修改server2的ip地址
server3: 192.168.1.3/24
修改server3的ip地址
systemctl stop firewalld
关闭 firewall
setenforce 0
关闭 SELinux
server1
lsmod
查看模块(虚拟机上没有虚拟模块),准备加入隧道模块
lsmod | grep kvm
在虚拟机上查看没有虚拟模块,在真机上查看有虚拟机模块
modprobe ipip
加入隧道模块
ip a
多了一块网卡 tunl0
ip addr add 192.168.1.100/24 dev tunl0
放到隧道网卡上面
ip a
查看网卡的状态是down
ip link set up tunl0
激活网卡
设置TUN模式的访问策略
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -i -w 1
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.3:80 -i -w 1
systemctl restart ipvsadm
重启服务使设置生效
cat /etc/sysonfig/ipvsadm
查看策略文件
server2
modprobe ipip
添加隧道模块
ip addr add 192.168.1.100/24 dev tunl0
添加入口ip
ip link set up tunl0
激活网卡
修改反向过滤规则,防止丢包
sysctl -a | grep rp_filter
查看过滤表将所有的过滤规则都关闭
sysctl -w (规则)=0
sysctl -p
使设置生效
sysctl -a | grep rp_filter
再次查看
server3
modprobe ipip
添加隧道模块
ip addr add 192.168.1.100/24 dev tunl0
添加入口ip
ip link set up tunl0
激活网卡
修改反向过滤规则,防止丢包
sysctl -a | grep rp_filter
查看过滤表将所有的过滤规则都关闭
sysctl -w (规则)=0
sysctl -p
使设置生效
sysctl -a | grep rp_filter
再次查看
测试
curl 192.168.1.100
访问192.168.1.100可以看到 server2 与 server3 轮流响应请求
DR
模式
客户端向目标vip发出请求 -> LVS接收 -> LVS根据负载均衡算法选择一台活跃的的节点,将此节点的ip所在网卡的mac地址作为目标mac地址,发送到局域网 -> 节点在局域网中收到这个帧,拆开后发现目标ip(VIP)与本地匹配,于是处理这个报文 -> 随后重新封装报文,发送到局域网 -> 此时ip包的目标ip是客户端,源ip是自己的vip地址
工作原理
1、通过在调度器LB上修改数据包的目的MAC地址实现转发
注意源地址仍然是CIP,目的地址仍然是VIP地址
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务
搭建环境
lVS(server1): 192.168.1.1/24 192.168.1.100/24
修改server1的ip地址,并且添加虚拟ip地址
server2: 192.168.1.2/24 192.168.1.100/32
修改server2的ip地址,并且添加虚拟ip地址
server3: 192.168.1.3/24 192.168.1.100/32
修改server3的ip地址,并且添加虚拟ip地址
systemctl stop firewalld
关闭 firewall
setenforce 0
关闭 SELinux
server1
yum install -y ipvsadm
安装 ipvsadm
vim /etc/sysconfig/ipvsadm-config
修改LVS服务的配置文件:no->yes
重启服务的时候保存策略
systemctl start ipvsadm
首次开启会报错,无法开启服务
cat /var/log/messages
在日志里面查看服务启动错误的原因
touch /etc/sysconfig/ipvsadm
建立编写策略的文件
systemctl start ipvsadm
再次开启服务,正常
systemctl enable ipvsadm
开启自启
设置DR模式的访问策略
ipvsadm -A -t 192.168.1.100:80 -s rr
添加vip
-A
:添加虚拟服务器
-t
:指定vip及tcp端口
-s
:指定算法
rr
:轮询
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -g -w 1
ipvsadm -a -t 1192.168.1.100:80 -r 192.168.1.3:80 -g -w 1
-a
:添加节点
-t
:指定vip和端口
-r
:指定节点ip及端口
-m
:表示使用NAT模式
-w
:设置权重
ipvsadm -ln
查看当前节点信息
systemctl restart ipvsadm
重启服务
server2
yum install -y http
安装 http
systemctl start httpd
开启
systemctl enable httpd
开机自启
vim /var/www/html/index.html
建立测试页面
server2.example.com
测试页面内容
yum install -y arptables
安装 arptables
arptables -nL
查看策略
设置arptables的访问策略
arptables -A INPUT -d 192.168.1.100 -j DROP
192.168.1.100来源输入全部丢弃
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.2
192.168.1.100输出转化为192.168.1.2
cat /etc/sysconfig/arptables
查看规则
arptables-save > /etc/sysconfig/arptables
保存策略
cat /etc/sysconfig/arptables
再次查看,策略已保存
systemctl restart arptables
重启服务
server3
yum install -y http
安装 http
systemctl start httpd
开启
systemctl enable httpd
开机自启
vim /var/www/html/index.html
建立测试页面
server3.example.com
测试页面内容
yum install -y arptables
安装 arptables
arptables -nL
查看策略
设置arptables的访问策略
arptables -A INPUT -d 192.168.1.100 -j DROP
192.168.1.100来源输入全部丢弃
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.3
192.168.1.100输出转化为192.168.1.3
cat /etc/sysconfig/arptables
查看规则
arptables-save > /etc/sysconfig/arptables
保存策略
cat /etc/sysconfig/arptables
再次查看,策略已保存
systemctl restart arptables
重启服务
测试
curl 192.168.1.100
访问192.168.1.100可以看到 server2 与 server3 轮流响应请求
如果轮询未能正常响应,使用命令 arp -d 192.168.1.100 清除缓存
arp -an | grep ip
查看缓存是否存在
再次curl 192.168.1.100即可正常