LVS
Posted dezasseis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS相关的知识,希望对你有一定的参考价值。
文章目录
一、7.6版本虚拟机封装
母盘:
改时区,最小化安装,自动分区,关闭Enable kdump
关闭selinux,开机时按 E
输入selinux=0
[root@server1 ~]# hostnamectl set-hostname server1
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# cat rhel7.repo
[rhel7.6]
name=rhel7.6
baseurl=http://172.25.2.250/rhel7.6
gpgcheck=0
[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# vim ifcfg-eth0
[root@server1 network-scripts]# cat ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.2.1
PREFIX=24
GATEWAY=172.25.2.250
DNS1=114.114.114.114
[root@server1 ~]# systemctl restart network
[root@server1 ~]# systemctl disable NetworkManager
[root@server1 ~]# systemctl disable --now NetworkManager
[root@server1 ~]# yum install -y vim bash-* lftp
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.2.1 server1
172.25.2.2 server2
172.25.2.3 server3
172.25.2.4 server4
172.25.2.5 server5
172.25.2.6 server6
172.25.2.250 foundation2.ilt.example.com
[root@server1 ~]# ls
[root@server1 ~]# rm -rf anaconda-ks.cfg
[root@server1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@server1 ~]# systemctl disable firewalld
[root@server1 ~]# poweroff
[root@foundation2 images]# ls
demo1 demo3 demo5 server1 server3 server5 vm2
demo2 demo4 rhel7.6.qcow2 server2 server4 vm1
当没有 virt-sysprep时,
yum install libguestfs-tools -y
[root@foundation2 images]# virt-sysprep -d rhel7.6(虚拟机母盘名字)
[root@foundation2 images]# virt-sparsify --compress rhel7.6.qcow2 rhel7.6-demo.qcow2
[root@foundation2 images]# du -h *
[root@foundation2 images]# rm -rf rhel7.6.qcow2
[root@foundation2 images]# qemu-img create -f qcow2 -b rhel7.6-demo.qcow2 vm1
[root@foundation2 images]# qemu-img create -f qcow2 -b rhel7.6-demo.qcow2 vm2
在vm2中
[root@server2 ~]# hostnamectl set-hostname server2
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@server2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.2.2
PREFIX=24
GATEWAY=172.25.2.250
DNS1=114.114.114.114
[root@server2 ~]# systemctl restart network
二、LVS简介
LVS中文站点:http://zh.linuxvirtualserver.org/
LVS官网:http://www.linuxvirtualserver.org/
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。
该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户。
LVS工作模式分为NAT模式、TUN模式、以及DR模式。
三、LVS体系架构
1_Load Balancer:负载均衡层
LVS的核心部分,负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。
2_Server Array:服务器群组层
该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。
3_Shared Storage:数据共享存储层
主要是提高上一层数据和为上一层保持数据一致。
三、LVS三种工作模式的解析
01_基于NAT的LVS模式负载均衡
-
NAT(Network Address
Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。VS/NAT工作模式拓扑结构如图2所示,LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual
IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real
Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。第二步,用户将请求发送至124.126.147.168,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。
第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。
不足:
- RS/ROUTER配置策略路由
02_基于TUN的LVS负载均衡
- 在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如图3所示。其中,IP隧道(IP
tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real
Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
不足:
- RS配置复杂(IPIP模块等)
- RS上绑定VIP,风险大;
03_基于DR的LVS负载均衡
- 在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
不足:
- LVS-RS间必须在同一个VLAN;
- RS上绑定VIP,风险大
四、LVS负载均衡调度算法
静态调度:
1.轮询调度Round Robin 简称’RR’
轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
2.加权轮询调度WRR
加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3目标地址散列调度DH
目标地址散列调度(Destination Hashing 简称’DH’)算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
4.源地址散列调度SH
动态调度
源地址散列调度(Source Hashing 简称’SH’)算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
5.最小连接调度 LC
最小连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
6.加权最小连接调度 WLC
加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
7.基于局部的最少连接LBLC
基于局部的最少连接调度(Locality-Based Least Connections 简称’LBLC’)算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。
8.带复制的基于局部性的最少连接LBLCR
带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication 简称’LBLCR’)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
9.最短的期望的延迟SED
最短的期望的延迟调度(Shortest Expected Delay 简称’SED’)算法基于WLC算法。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算
A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。
10.最少队列调度NQ
最少队列调度(Never Queue 简称’NQ’)算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。
五、ipvsadm
从2.4版本开始,linux内核默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。
LVS的结构主要分为两部分:
- 工作在内核空间的IPVS模块。LVS的能力实际上都是由IVPS模块实现。
- 工作在用户空间的ipvsadm管理工具。其作用是向用户提供一个命令接口,用于将配置的虚拟服务、真实服务等传给IPVS模块。
ipvsadm -ln:查看添加的规则
Forward :转发方式
Weight:权重
ActiveConn:活动连接数
InActConn:非活动连接数
ipvsadm -ln -c:查看当前的IPVS连接
pro:协议
expire:还有多长时间过期
state:TCP状态
source:源地址:随机端口
virtual:虚拟集群服务
destination:被lvs-server调度到的RealServer
ipvsadm -ln --stats:查看自规则生效以来的ipvs统计信息
Conns:已经转发过的连接数
InPkts:流入包个数
OutPkts:流出包个数
InBytes:进入流量(字节)
OutBytes:流出流量(字节)
ipvsadm -ln --rate:查看速率信息
CPS:每秒的连接数
InPPS:每秒流入包个数
OutPPS:每秒流出包个数
InBPS:每秒进入流量(字节)
OutBPS:每秒流出流量(字节)
六、VS/DR基本配置
01_基本环境
Director Server: 负载均衡服务器
hostname:server1
IPADDR:10.4.17.201
GATEWAY:10.4.17.166
VIP:10.4.17.100
Real Server: 真实服务器
server2:10.4.17.202
server3:10.4.17.203
02_Director Server 配置
hostname:server1
IPADDR:10.4.17.201
GATEWAY:10.4.17.166
VIP:10.4.17.100
- 安装ipvs
yum install -y ipvsadm
- 绑定VIP
ip addr add 10.4.17.100/24 dev eth0
- 设置ipvs规则
ipvsadm -A -t 10.4.17.100:80 -s rr :添加集群(指定rr调度算法)
ipvsadm -a -t 10.4.17.100:80 -r 10.4.17.202:80 -g :添加RS到集群(tcp服务)
ipvsadm -a -t 10.4.17.100:80 -r 10.4.17.203:80 -g
- 显示虚拟服务器表
ipvsadm -ln
02_Real Server配置
server2和server3中:
- 安装Apache
yum install httpd -y
systemctl enable --now httpd
- 添加VIP
ip addr add 10.4.17.100/24 dev eth0
- 编辑默认发布页面
echo server2 > /var/www/html/index.html
echo server3 > /var/www/html/index.html
03_测试访问
- 在清除缓存后再次测试可能出现不经过调度去直接访问服务器的情况
- 解决方法:在(RS)server2、3中
yum install -y arptables_jf:安装arptables
arptables -A INPUT -d 10.4.17.100 -j DROP :drop通过10.4.17.100输入的动作
arptables -A OUTPUT -s 10.4.17.100 -j mangle --mangle-ip-s 10.4.17.202 :输出源地址转换为10.4.17.100 转换为10.4.17.202
- 清除缓存后,测试成功!
(删除arptables规则用arptables -F)
- 在负载均衡器查看调度情况
操作系统访问控制:.
iptables -> tcpwarp -> xinetd -> service -> filesystem(rwx/selinux)
七、lvs健康检测脚本
01_问题
- 某台Real Server在down了怎么办?
- LVS本身down了怎么办?
问题模拟:
- Real Server down
systemctl stop httpd.service
- LVS仍调度到down的RS上
02_lvs健康检测脚本
- vim check_lvs.sh
#!/bin/bash
VIP=10.4.17.100
PORT=80
RS=(10.4.17.202 10.4.17.203)
LOG=check_lvs.log
addrs() {
ipvsadm -a -t $VIP:$PORT -r $1:$PORT -g
echo "add $1 to ipvs" >> $LOG
}
delrs() {
ipvsadm -d -t $VIP:$PORT -r $1
echo "del $1 to ipvs" >> $LOG
}
checkrs() {
for i in ${RS[*]}
do
num=`curl -I -s -o /dev/null -w %{http_code} http://$i`
if [ $num -eq 200 -a $(ipvsadm -ln|grep $i|wc -l) -eq 0 ];then
addrs $i
elif [ $num -ne 200 -a $(ipvsadm -ln|grep $i|wc -l) -ne 0 ];then
delrs $i
fi
done
}
while true
do
checkrs
sleep 5
done
- 加权限
chmod 777 check_lvs.sh
- 打入后台运行
sh check_lvs.sh &
- 监控LVS调度情况
watch -n 3 ipvsadm -ln
- 停掉RS2
systemctl stop httpd.service
八、keepalived与lvs
keepalived是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:
- hacmp是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如心跳检测和资源接管,检测集群中的系统服务,在集群节点间转移共享ip地址所有者等,hacmp功能强大,但是部署和使用相对麻烦,同时也是商业化软件.
- keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然他没有hacmp功能强大,但是keepalived部署使用相对简单,所有配置只需要一个配置文件即可完成.
01_keepalived 体系结构
keepalived的体系结构从整体上分为两层,分别是用户空间层和内核空间层。
- SchedulerI/OMultiplexer是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求;
- Memory Mngt是一个内存管理机制,这个框架提供了访问内存的一些通用方法;
- Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析;
- Core componets 这部分主要包含了5个部分;
- Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
- Checkers:这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
健康监测
- VRRP Stack:这是keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。负责负载均衡器之间的失败切换FailOver;
实现高可用,节点冗余
- IPVS wrapper:这个是IPVS功能的一个实现,IPVSwarrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
- Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,
02_keepalived 进程
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
- core:负责主进程的启动,维护和全局配置文件的加载;
- check:负责健康检查
- vrrp:用来实现vrrp协议(主备冗余)
03_keepalived 配置
主DS:server1
备DS:server4
server1配置:
- 安装keepalived
yum install -y keepalived
- 免密
ssh-keygen
ssh-copy-id server4
- 删除之前添加的VIP
ip addr del 172.25.2.100/24 dev eth0
ipvsadm -C
- 修改配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #邮件报警
root@localhost
}
notification_email_from keepalived@localhost #指定发件人
smtp_server 127.0.0.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #负载均衡标识,在局域网内应该是唯一的
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0 #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定该keepalived节点的初始状态
interface eth0 #vrrp实例绑定的接口,用于发送VRRP包
virtual_router_id 51 #指定VRRP实例ID,唯一(范围是0-255)
priority 100 #指定优先级
advert_int 1 #指定发送VRRP通告的间隔。单位是秒
authentication {
auth_type PASS #指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐
auth_pass 1111 #指定认证所使用的密码。最多8位
}
virtual_ipaddress { #指定VIP地址
172.25.2.100
}
}
virtual_server 172.25.2.100 80 {
delay_loop 6 #健康检查的时间间隔
lb_algo rr #LVS调度算法RR
lb_kind DR #LVS模式DR
#persistence_timeout 50
protocol TCP #4层协议(TCP|UDP|SCTP)
real_server 172.25.2.2 80 {
weight 1 #给服务器指定权重。默认是1
TCP_CHECK {#real_server中的健康检查
connect_timeout 3 #连接超时时间
nb_get_retry 3 #尝试次数
delay_before_retry 3 #尝试之前延迟时间
}
}
real_server 172.25.2.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
scp /etc/keepalived/keepalived.conf server4:/etc/keepalived/
server4配置:
- 安装ipvsadm keepalived
yum install -y ipvsadm
yum install -y keepalived
- 修改配置文件
vim /etc/keepalived/keepalived.conf
state BACKUP
priority 50
04_keepalived测试
开启服务后,主lvs自动增加ipvsadm规则并自动绑定VIP到指定接口:curl命令测试后,arp得到的物理地址也与主lvs主机物理地址相对应
- 关server1的keepalived,备用lvs会自动接管RS(
systemctl stop keepalived.service
- 开server1的keepalived
systemctl start keepalived.service
以上是关于LVS的主要内容,如果未能解决你的问题,请参考以下文章