一、LVS的简单介绍

1.后面会经常提到的一些名词解释:

vs:virtual server
rs:real server,后面真实的服务器
director:调度器
balancer:负载均衡器

客户端向调度器发送请求时:
客户端的ip=cip(client ip)
接收客户端请求的ip=vip(virtual server ip)
真实服务器的ip=rip(real server ip)

2.四种模式的简介

(1)DR模式(直接路由)
DR模式性能最佳,但必须要求在一个vlan中。
数据包流向:client–>vs–>rs–> client
DR模式下收到客户端请求,lvs会将vs的mac地址修改为某一台rs的mac地址(注:ip地址是逻辑地址,mac地址才是真正的通信地址,所以我们才可以通过修改mac地址发送到指定的rs),然后这个数据包会被转发到相应的rs处理(此时源ip和目标ip未变)。如数据帧流向所示,客户端请求由lvs接收,但返回的时候不经过lvs,而是直接向源ip返回,由真实服务器直接返回给用户。

优点:效率最高,负载均衡器只用分发请求,应答包通过单独的路由返回给客户端,提高了服务器并发能力。
缺点:负载均衡器的网卡必须和物理网卡在同一网段上
(2)NAT模式(多目标DNAT)
NAT模式下收到客户端请求,lvs会做目的地址转换(DNAT),将目标ip改为rs的ip。rs接收到该数据包直接进行处理,返回响应时,目标ip即为cip,源ip即为rs的ip。然后,rs的数据包通过lvs中转,lvs进行源地址转换(SNAT),将数据包的源地址(rip)改为vip发送至客户端(rip不会直接响应cip),整个过程对于客户端来说是不可见的。

缺点:扩展性有限。高负载模式下,director可能成为瓶颈
优点:支持任意操作系统,节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。
(3)TUNNEL(隧道)模式
隧道模式下,vs 收到客户端请求,封装数据包,使源 ip 成为 vip,目标 ip 成为
rip,当 rs 收到数据包时,进行解封装,还原数据包,处理后,利用 vip 发出响应
从 rip 所在的接口发出,直接达到客户端。

优点:实现了异地容灾,避免了一个机房故障导致网站无法访问。
缺点:RS配置复杂

(4)FULLNAT模式
FULLNAT模式可以解决lvs和rs跨vlan的问题,从此lvs和rs不再存在vlan上的从属关系,可以作到多个lvs对应多个rs,解决水平扩容的问题。
FULLNAT在NAT模式上做了如下改进:
在DNAT时,源地址从客户端的ip被替换成了lvs内网ip。而内网ip之间,可以通过多个交换机跨vlan通信。当rs返回经过处理的数据包时,会将这个数据包返回到lvs的内网ip上,此时lvs进行源地址转换(SNAT),把数据包的目的地址从lvs内网ip替换为客户端ip。

3.简单介绍10种调度算法

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

二、DR模式的配置

1.环境准备

lvs调度器server1,ip:172.25.21.1
真实web服务器server2,ip:172.25.21.2
第二个真实web服务器server3,ip:172.25.21.3

2.配置DR
安装lvs的管理工具:ipvsadm
yum install ipvsadm -y			##企业7版本之后的ipvsadm安装包直接在内核中就可以找到,
							##但是之前的版本需要手动导入把模块导入,即在yum源里添加这些软件包
						##在第四部分使用ldirectord程序监视集群节点里会写有例子
ip addr add 172.25.21.121/24 dev eth0		##给调度器一个vip
vim /etc/sysconfig/ipvsadm-config			##修改配置文件,让服务重启时写入策略文件

lvs dr模式原理 回环 lvs dr模式配置_集群和节点

##添加ipvsadm策略
ipvsadm -A -t 172.25.21.121:80 -s rr					##rr是轮询算法
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.2:80 -g		##-g是DR模式
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.3:80 -g
systemctl start ipvsadm.service							##第一次启动服务失败,查看日志发现启动时缺少了一个文件/etc/sysconfig/ipvsadm
mkdir /etc/sysconfig/ipvsadm							##把这个文件建立之后再次启动即可成功
systemctl restart ipvsadm
ipvsadm -ln												##查看策略,加上n不解析,命令响应时间变快

lvs dr模式原理 回环 lvs dr模式配置_lvs_02

需要给两个真实的web服务器加上vip,因为数据时从真实服务器直接返还给客户端的。

[root@server2 ~]# ip addr add 172.25.21.121/24 dev eth0
[root@server3 ~]# ip addr add 172.25.21.121/24 dev eth0

此时在一台与lvs同一网络下的主机测试,可能会出现无法轮询的问题,因为次是两台真实主机与lvs调度器都有vip,客户端并没有确定到底会访问哪台主机,所以这样可能会出现直接访问到主机的问题,因为本地缓存到real主机的mac地址后会跳过lvs调度器直接对真实主机进行访问,如果遭到DDOS恶意攻击,主机就很可能会无法正常使用。
解决方法是在real主机上安装基于mac地址的arptables来拒绝所有对172.25.21.121的访问

配置方法:
yum install arptables.x86_64 -y
arptables -A INPUT -d 172.25.21.121 -j DROP			##将所有对121的访问都丢弃掉
arptables -A OUTPUT -s 172.25.21.121 -j mangle --mangle-ip-s 172.25.21.2		##以121的ip输出的数据的源ip是2
arptables-save > /etc/sysconfig/arptables			##手动导入策略到文件,不然就是临时生效
systemctl start arptables.service

lvs dr模式原理 回环 lvs dr模式配置_客户端_03

在一台与lvs同一网段下的主机进行测试:
curl 172.25.21.121					##查看默认发布文件,应该以轮询的方式出现

lvs dr模式原理 回环 lvs dr模式配置_lvs dr模式原理 回环_04

三、隧道模式的配置

1.环境准备与DR模式的环境配置相同
2.隧道配置
(1)
lvs调度器的配置:(需要手动安装隧道模块)
ipvsadm -C							##在开始另一个模式的配置前,把原来的策略清除掉
lsmod								##查看本机安装的模块
modprobe ipip						##安装隧道模块
ip a								##查看是否多了一个隧道接口,此时处与关闭状态
ip addr del 172.25.21.121/24 dev eth0		##把vip从eth0网卡上删掉,并把vip添加到隧道接口上
ip addr add 172.25.21.121/24 dev tunl0
ip link set up tunl0				##启用隧道接口,可以看到它的状态不再是关闭并且有vip

lvs dr模式原理 回环 lvs dr模式配置_客户端_05

##添加调度策略:
ipvsadm -A -t 172.25.21.121:80 -s rr					##选择轮询算法
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.2:80 -i		##-i表示隧道模式
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.3:80 -i
systemctl restart ipvsadm.service						##使策略生效
ipvsadm -ln

lvs dr模式原理 回环 lvs dr模式配置_集群和节点_06

(2)
real服务器的设定(没有特殊说明则两台服务器的设定都是相同的):
modprobe ipip							##同样也要安装隧道模块
ip addr del 172.25.21.121/24 dev eth0	##将vip从eth0上删除并添加到隧道上
ip addr add 172.25.21.121/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				##确认策略全部关闭

lvs dr模式原理 回环 lvs dr模式配置_客户端_07

(3)
在一台与lvs调度器同一网络下的主机上进行测试:			##注意:这里与DR模式同一网段的限制不同
curl 172.25.21.121								##查看默认发布文件,应该以轮询的方式出现

lvs dr模式原理 回环 lvs dr模式配置_lvs dr模式原理 回环_08

四、通过ldirectord程序从集群中自动移除节点

1.作用:当一台real服务器出现问题不能访问时,将它从集群中自动去除,使客户端的访问不受影响
2.环境准备(ip配置与DR模式相同):
在红帽的企业7版本中没有这个软件,但是企业6中的软件在这里也可以用,但是需要配置高可用的依赖环境
首先进入7.5的镜像目录,找到高可用的具体位置,在7.5中把高可用和负载均衡放在同一个目录下,并且没有了企业6中的其他资源

lvs dr模式原理 回环 lvs dr模式配置_lvs_09

配置yum源,在原来的yum源文件中配置即可
vim /etc/yum.repos.d/rhel.repo			##配置yum源
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.21.250/rhel7.5/addons/HighAvailability/
gpgcheck=0
yum repolist							##查看是否成功

lvs dr模式原理 回环 lvs dr模式配置_lvs_10

3.ldirectord的管理使用:
(1)
首先安装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				##查看软件安装后产生的目录与文件

lvs dr模式原理 回环 lvs dr模式配置_lvs dr模式原理 回环_11

(2)
开启服务,因为这是企业6上的软件包,所以要用脚本的方式来启动服务
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/			##把模板复制到配置文件目录下
vim /etc/ha.d/ldirectord.cf											##修改配置文件

lvs dr模式原理 回环 lvs dr模式配置_集群和节点_12

yum install httpd -y	##在调度器上安装apache,当真实主机web1和web2都出问题时,让客户端访问调度器并给客户端一个提示信息
vim /var/www/html/index.html	
systemctl start httpd	##开启服务

ip addr del dev tunl0					##清除掉上一个隧道模式实验的ip并把隧道模块卸载掉
ip addr del 172.25.21.121/24 dev tunl0
ip addr add 172.25.21.121/24 dev eth0
modprobe -r ipip
ipvsadm -C								##清空策略并重新写入
ipvsadm -A -t 172.25.21.121:80 -s rr
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.2:80 -g
ipvsadm -a -t 172.25.21.121:80 -r 172.25.21.3:80 -g
cat /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service

/etc/init.d/ldirectord start		##在启动服务之前记得关掉上一个实验的隧道接口并删掉它的ip,不然可能会发生冲突
chkconfig --list					##查看所有以脚本方式运行的服务,一般不全为off就是开机自启动的

lvs dr模式原理 回环 lvs dr模式配置_集群和节点_13

(3)测试:
效果应该为:关闭一台服务器,会自动访问另一台,如果两台都出问题,可以让它访问调度器,并给他一个访问不到内容了的提示
curl 172.25.21.121

当调度器的内容无法访问时,很有可能是因为在之前的实验中把apache的端口设为了8080,改回80重启服务即可

lvs dr模式原理 回环 lvs dr模式配置_集群和节点_14

五、通过keepalived管理调度器和节点

1.作用:当调度器出问题时,使用keepalived服务管理,实现两台或者多台调度器的主备,当主调度器(MASTER)出问题时,可以将访问和服务都转到备用调度器(BACKUP)上,并且还可以设置邮件提醒在出现问题时进行提示,并且MASTER在运行过程中会一直给BACKUP发送心电信号,来告知BACKUP自己的运行状态良好。
2.环境准备
首先再开启一台虚拟机server4,因为模拟调度器的主备就需要两台调度器,两台真实主机,把server4的ip设定为172.25.21.4
##注意:此时,server1和server4是调度器,server2和server3是真实主机,没有特殊说明ip都没有变化
然后需要下载安装包,这个安装包可以直接在官网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
3.服务配置
vim /etc/keepalived/keepalived.conf				##修改配置文件,两个调度器的设置有所不同
server1的修改:
systemctl start keepalived						##开启服务

lvs dr模式原理 回环 lvs dr模式配置_客户端_15


lvs dr模式原理 回环 lvs dr模式配置_调度器_16

server4文件的修改:

lvs dr模式原理 回环 lvs dr模式配置_客户端_17


lvs dr模式原理 回环 lvs dr模式配置_客户端_18

4.测试:
(1)将server1调度器关闭,可以看到vip和服务都被server4继承,客户端访问不受影响
curl 172.25.21.121
server1上:systemctl stop keepalived			##关闭一个调度器,查看server4的日志可以看到继承vip等信息

lvs dr模式原理 回环 lvs dr模式配置_客户端_19

(2)
再次将server1启用,因为我们设定它的优先级较高,所以服务会自动切换到server1上,我们可以查看server4的日志

lvs dr模式原理 回环 lvs dr模式配置_lvs_20