1.LVS简单介绍
1.lvs定义LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
2.LVS的特点:具有可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
十种调度算法:
rr:Round Bobin,轮询,将客户端的请求交替分配给RS
wrr:Weighted Round Bobin,加权轮询,根据RS的性能不同,让他们来承担不同比例的用户请求
dh:Destination Hashing,目标地址哈希调度,基于用户所请求的地址做哈希表
作用:实现将对于相同的地址的请求调度到同一个RS之上
sh:Source Hashing,源地址的哈希调度,基于用户的ip地址做哈希表
作用:实现将同一个客户端调度到相同的RS之上
lc:Least Connection,最小连接数调度,本质是调度到当前负载最低的主机上
wlc:Weighted Least Connection,加权最小连接数调度,本质是调度到当前负载最低的主机上
SED:是wlc补充
NQ:Never queue,算法基本和sed相同,为了避免性能差的RS长时间处于空闲状态
lblc:基于目标地址的最小连接数调度,这种算法那是lc和dh的组合,适应于cache场景
lblcr:带有复制功能的lblc
2.DR模式
实验准备:
主机 |
服务 |
server1:172.25.16.1 |
提供ipvsadm服务 |
server2:172.25.16.2 |
提供apache服务、realeserver |
server3:172.25.16.3 |
提供apache服务、realeserver |
物理机:172.25.16.250 |
客户端、测试端 |
DR模式(直接路由)
DR模式性能最佳,但必须要求在一个vlan中。
数据包流向:client–>vs–>rs–> client
DR模式下收到客户端请求,lvs会将vs的mac地址修改为某一台rs的mac地址(注:ip地址是逻辑地址,mac地址才是真正的通信地址,所以我们才可以通过修改mac地址发送到指定的rs),然后这个数据包会被转发到相应的rs处理(此时源ip和目标ip未变)。如数据帧流向所示,客户端请求由lvs接收,但返回的时候不经过lvs,而是直接向源ip返回,由真实服务器直接返回给用户。
优点:效率最高,负载均衡器只用分发请求,应答包通过单独的路由返回给客户端,提高了服务器并发能力。
缺点:负载均衡器的网卡必须和物理网卡在同一网段上
安装lvs的管理工具:ipvsadm
yum install ipvsadm -y ##企业7版本之后的ipvsadm安装包直接在内核中就可以找到,但之前版本需要手动创建高级yum源(从镜像里查找)
ip addr add 172.25.16.100/24 dev eth0 ##给调度器一个vip
systemctl start ipvsadm
vim /etc/sysconfig/ipvsadm-config ##修改配置文件,让服务重启时加载策略文件
写入策略:
ipvsadm -A -t 172.25.16.100:80 -s rr
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -g
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.3:80 -g
ipvsadm -ln ##加n不做解析查看ipvsadm策略
systemctl restart ipvsadm ##此时重启ipvsadm会出现错误,需先创建文件/etc/sysconfig/ipvsadm(用来写入策略)
touch /etc/sysconfig/ipvsadm
在server2、server3进行设置:
需要给两个真实的web服务器加上vip,因为数据时从真实服务器直接返还给客户端的。
[root@server2 ~]# ip addr add 172.25.16.100/24 dev eth0
[root@server3 ~]# ip addr add 172.25.16.100/24 dev eth0
此时在物理机进行测试,会出现无法轮询的情况。
原因:
因为次是两台真实主机与lvs调度器都有vip,客户端并没有确定到底会访问哪台主机,所以这样可能会出现直接访问到主机的问题,因为本地缓存到real主机的mac地址后会跳过lvs调度器直接对真实主机进行访问,如果遭到DDOS恶意攻击,主机就很可能会无法正常使用。
解决方法:
在real主机都上安装基于mac地址的arptables来拒绝所有对172.25.16.100的访问。
yum install arptables.x86_64 -y
arptables -A INPUT -d 172.25.16.100 -j DROP ##将所有对121的访问都丢弃掉
arptables -A OUTPUT -s 172.25.16.100 -j mangle --mangle-ip-s 172.25.16.2 ##以100的ip输出的数据的源ip是2
arptables-save > /etc/sysconfig/arptables ##手动导入策略到文件,不然就是临时生效
systemctl start arptables.service
测试:
arp-d 172.25.16.100 ##清除原来100的缓存mac地址
curl172.25.16.100 ##看是否轮询访问
3.NAT模式
NAT模式下收到客户端请求,lvs会做目的地址转换(DNAT),将目标ip改为rs的ip。rs接收到该数据包直接进行处理,返回响应时,目标ip即为cip,源ip即为rs的ip。然后,rs的数据包通过lvs中转,lvs进行源地址转换(SNAT),将数据包的源地址(rip)改为vip发送至客户端(rip不会直接响应cip),整个过程对于客户端来说是不可见的。
缺点:扩展性有限。高负载模式下,director可能成为瓶颈
优点:支持任意操作系统,节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。
实验环境同上:
1.server1:
yum install ipvsadm-1.27-7.el7.x86_64 -y
vim /etc/sysconfig/ipvsadm-config修改参数为IPVS_SAVE_ON_RESTART="yes"重启后加载策略
touch /etc/sysconfig/ipvsadm创建文件,没有的话无法重启(策略写的地方)
systemctl start ipvsadm.service
systemctl status ipvsadm.service
给server1添加一个网卡eth1
Ip addr add 172.25.254.100/24 dev eth1
Ip link set up eth1
打开内核路由:
Vim /etc/sysctl.conf ##写入net.ipv4.ip_forward=1
添加策略:
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.16.2:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 172.25.16.3:80 -m
server2、server3同样操作:
Systemctl start httpd
Route add default gw 172.25.16.1 #添加ipvsadm内网网段ip
测试:
在物理机:curl 172.25.254.100
4.TUN隧道模式
TUN:隧道模式下,vs 收到客户端请求,封装数据包,使源 ip 成为 vip,目标 ip 成为
rip,当 rs 收到数据包时,进行解封装,还原数据包,处理后,利用 vip 发出响应
从 rip 所在的接口发出,直接达到客户端。
优点:实现了异地容载,避免了一个机房故障导致网站无法访问。
缺点:RS配置复杂
实验环境:同上DR
lvs调度器的配置:(需要手动安装隧道模块)
ipvsadm -C ##在开始另一个模式的配置前,把原来的策略清除掉
lsmod ##查看本机安装的模块
modprobe ipip ##安装隧道模块
ip a ##查看是否多了一个隧道接口,此时处与关闭状态
ip addr del 172.25.16.100/24 dev eth0 ##把vip从eth0网卡上删掉,并把vip添加到隧道接口
ip addr add 172.25.16.100/24 dev tunl0
ip link set up tunl0 ##启用隧道接口,可以看到它的状态不再是关闭并且有vip
##添加调度策略:
ipvsadm -A -t 172.25.16.100:80 -s rr ##选择轮询算法
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -i ##-i表示隧道模式
ipvsadm -a -t 172.25.21.121:80 -r 172.25.16.3:80 -i
systemctl restart ipvsadm.service ##使策略生效
ipvsadm -ln
(2)
real服务器的设定(没有特殊说明则两台服务器的设定都是相同的):
modprobe ipip ##同样也要安装隧道模块
ip addr del 172.25.16.100/24 dev eth0 ##将vip从eth0上删除并添加到隧道上
ip addr add 172.25.16.100/24 dev tunl0
ip link set up tunl0 ##启用隧道接口
ip a ##查看隧道是否启用
sysctl -a | grep rp_filter ##查看隧道反向过滤的策略,应该把这些策略全部关闭,否则在数据传输时可能会出现问题
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -a | grep rp_filter ##确认策略全部关闭
server3同server2操作
测试:
4.通过ldirectord程序从集群中自动移除节点
ldirectord作用:当一台real服务器出现问题不能访问时,将它从集群中自动去除,使客户端的访问不受影响。
将各项配置改回DR模式
在server1上安装ldirectord软件
注意:在红帽的企业7版本中没有这个软件,但是企业6中的软件在这里也可以用,但是需要配置高可用的依赖环境,首先进入7.5的镜像目录,找到高可用的具体位置,在7.5中把高可用和负载均衡放在同一个目录下,并且没有了企业6中的其他资源
配置yum源,在原来的yum源文件中配置即可
vim /etc/yum.repos.d/westos ##配置yum源
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.21.250/rhel7.5/addons/HighAvailability/
gpgcheck=0
yum repolist ##查看是否成功
首先安装ldirectord,本机使用的软件包为ldirectord-3.9.5-3.1.x86_64.rpm,可以在企业6的镜像中获取这个软件包,在yum源搭建好以后,注意在ldirectord软件包的所在的目录下才可以直接通过yum安装
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y ##安装软件
rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm ##查看软件安装后产生的目录与文件
开启服务,因为这是企业6上的软件包,所以要用脚本的方式来启动服务
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/ ##把模板复制到配置文件目录下
vim /etc/ha.d/ldirectord.cf ##修改配置文件
yum install httpd -y ##在调度器上安装apache,当真实主机web1和web2都出问题时,让客户端访问调度器并给客户端一个提示信息
vim /var/www/html/index.html
systemctl start httpd ##开启服务
modprobe -r ipip ##卸载ipip模块
ip addr add 172.25.21.121/24 dev eth0
ipvsadm -C ##清空策略并重新写入
ipvsadm -A -t 172.25.16.100:80 -s rr
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -g
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.3:80 -g
cat /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service
/etc/init.d/ldirectord start ##在启动服务之前记得关掉上一个实验的隧道接口并删掉它的ip,不然可能会发生冲突
chkconfig --list ##查看所有以脚本方式运行的服务,一般不全为off就是开机自启动的
server2、sever3
modprobe -r ipip
ip addr add 172.25.16.100 dev eth0
测试:
关闭server2的apache服务
关闭server3的apache服务
5.通过keepalived管理调度器和节点
keepalived作用:当调度器出问题时,使用keepalived服务管理,实现两台或者多台调度器的主备,当主调度器(MASTER)出问题时,可以将访问和服务都转到备用调度器(BACKUP)上,并且还可以设置邮件提醒在出现问题时进行提示,并且MASTER在运行过程中会一直给BACKUP发送心电信号,来告知BACKUP自己的运行状态良好。
环境准备:还原到DR模式时的配置
重新打开一台虚拟机server4:172.25.16.4做备用调度器
注意:在ipvsadm服务端即server1不需要设置vip
然后需要下载安装包,这个安装包可以直接在官网www.keepalived.org上下载
本机下载的是最新版keepalived-2.0.17.tar.gz
yum install gcc openssl-devel -y ##因为需要编译源码,所以安装编译软件
tar zxf keepalived-2.0.17.tar.gz ##解压安装包
./configure --prefix=/usr/local/keepalived --with-init=systemd ##进行编译
make && make install
ln -s /usr/local/keepalived/etc/keepalived/ /etc/ ##创建一个软链接
/etc/init.d/ldirectord stop ##关闭ldirectord服务并关闭开机自启动,否则可能会发生冲突
chkconfig ldirectord off
修改server1配置文件
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived
server4同样操作:
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived
测试:
仍能实现轮询
server1日志:
server4日志: