简介
LVS是Linux虚拟服务器,LVS由用户空间的ipvsadm和内核空间的IPVS组成。ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作。LVS是一个高效的负载均衡器
LVS的特点
- 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力
- 成本低:只需要一台服务器就能免费部署使用
- 配置简单:仅需要几行命令就可完成配置
- 算法多样:支持多种算法,可根据不同场景灵活使用
- 工作模型:根据不同的场景,可以使用不同的工作模式来高效的处理问题
工作过程
- 客户端发送的web请求直接发送到LVS负载均衡器上,LVS通过自己预先设计的算法将请求发送给后端的某web服务器
- 后端的web服务器连接的数据是一样的,所以不管访问的是哪台服务器最后访问的数据都是一样的
- 最后根据LVS工作模式的不同,服务器会以不同的方式将数据发送回客户
LVS体系结构
LVS集群系统有三个部分组成
1、最前端的负载均衡层DS
- 由负载均衡调度器组成,LVS就安装在负载均衡调度器上
- 也可以是一个真实的server,主要作用类似于一个路由器
- 含有完成LVS功能所设定的路由表,通过路由表将请求发送给服务器集群层的应用服务器上
- 在负载均衡层也要安装对负载均衡器健康检测的监控模块来保证负载均衡层的安全
2、中间的服务器群组层RS
- 由一组实际运行的机器组成,真实服务器可以是WEB服务器、FTP服务器等众多服务器中的一个或者多个
- 每个RS之间通过高速网络连接
- 可以使用所有的系统平台,Linux、Windows等
3、最底层的数据共享存储层
- 是为所有RS提供共享存储空间和内容一致的存储区域
- 物理实现:一般由磁盘阵列设备组成
- 为了提供内容的一致性,一般可以通过网络共享文件系统实现
调度算法
LVS的调度算法决定了如何在集群节点之间分步工作负荷
当DS收到客户端访问VIP上的集群服务的入栈请求时,DS就要决定哪个节点来处理请求
调度算法类型:
固定调度算法:rr、wrr、dh、sh
动态调度算法:wlc、lc、lblc、lblcr
调度算法一般产生的环境选择:
一般的网络服务,如http,mail,mysql等
rr:基本轮询调度
wlc:加权最小连接调度
wrc:加权轮询调度
基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache
源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一
LVS-DR工作模式(默认工作模式)
![](https://img-blog.csdnimg.cn/4d07f0056c514009b7e09eb375e31036.png)
实现原理
- 客户端发送的请求会先到达内核空间的PREROUTING链,报文源地址为CIP和CIP-MAC,目标地址为VIP和VIP-MAC
- PRERROUTING链检查数据包的目标IP是否为自己,若是本机则将数据包发送给INPUT链
- 在INPUT链上面工作的IPVS会判断数据包的请求是否为集群服务,若是则将数据包中的源MAC地址修改为DIP的MAC地址,将目标的MAC地址修改为RIP的MAC地址
- 由于DS与RS在同一个网络中,所以是通过数据链路层来传输的(需要用MAC地址来识别)
- POSTROUTING链检查目标的MAC地址为RIP的MAC地址,将数据包发送到RS上
- RS发现请求报文的MAC地址是自己的MAC地址,接收报文进行处理
- 处理完后将响应报文通过lo接口发送给ens33网卡然后发出,相应报文的源地址为VIP和VIP-MAC,目标地址是CIP和CIP-MAC
特点:
- DS与RS在同一网络中(与NAT的DS的DIP与RS的RIP不同)
- 请求报文经过DS,但是相应报文不经过DS,可以解决NAT模式中DS瓶颈的问题
- DS与RS之间由于是通过二层(数据链路层)转发的报文,所以不需要IP参与,所以请求报文的目标IP和源IP不发生变化,响应报文直接以VIP的身份将报文返回给客户端,不需要再通过DS获取CIP
- 通过二层转发的报文不支持端口映射
LVS实战:
1、LVS是集成到Linux的内核中的,可以直接查看到
命令:grep -i -C 10 ipvs /boot/config-3.10.0-1127.el7.x86_64
2、安装ipvsadm工具包,这个工具包是用来对LVS的工作模式调度算法已经连接RS的相关配置的配置工具,也就是说我们通过这个工具包来具体进行LVS服务器的个性化配置。
yum install ipvsadm
rpm -ql ipvsadm
LVS-NAT工作模式的搭建
首先要搭建四个服务器并改名,然后对RS服务器开启http服务:
- 一台模拟客户端:(Centos6)
- 一台LVS服务器:(Centos7)
- 两台RS服务器:(Centos7)
以RS为例改名并开启服务:
改名命令:hostnamectl set-hostname RS1 然后退出重新连接
开启服务:
- yum -y install httpd 【下载httpd】
- systemctl start httpd 【开启httpd】
- systemctl enabled httpd 【设为开机自启项】
- echo RS1 Server on 192.168.175.130:80 > /var/www/html/index.html 【服务映射资源】
- curl 192.168.175.130 【测试连接】
其中LVS服务器需要添加一个网卡:
- 客户机的网卡和LVS服务器的网卡2设置为仅主机模式
- RS服务器和LVS服务器的另一块网卡设置为NAT模式
- RS服务器的网关设置为LVS的IP
Centos系统配置网卡ip:
网络的配置文件在/etc/sysconfig/network-scripts/目录下,这个目录下默认有ifcfg-ens33配置文件,如果没有IPADDR和GATEWAY就自行添加即可,BOOTPROTO默认是DHCP,这种情况下是随机ip,每次重启虚拟机ip都会变,而我们的实验和ip紧密相关,实际中ip也是固定不变的,所以一定要改成static。(注意:NAT模式的网卡需要修改,仅主机的网卡不需要,重启之后ip不会变,当然也可以修改,修改方式和这个一致,不过新建网卡之后并不会有多的配置文件自动生成,但是可以手动复制一个出来,将ens33复制一份,改成新网卡的名字即可。)
修改后重启network服务命令:service network restart即可
查看网络配置命令:route -n。
网络配置如下:(大家可以按照喜好来,不一定要这样)
- Client 192.168.92.129 用户名:admin 密码:123123
- LVS 192.168.175.134 192.168.92.128 用户名:root 密码:123123
- RS1 192.168.175.130 用户名:root 密码:123123
- RS2 192.168.175.131 用户名:root 密码:123123
配置完成可以查看LVS的当前网络可以看到有两个ip,分别对应两个网卡,模拟的是LVS的转发功能。命令:hostname -I
至此网络环境已经配置完成!!!下面开始LVS的配置
LVS配置:
1、配置LVS的ip_forward功能才可以实现转发
命令:vim /etc/sysctl.conf 然后添加一行:net.ipv4.ip_forward = 1
保存修改:sysctl -p
2、配置LVS转发规则,添加集群并添加RS服务器。
查看LVS状态命令:ipvsadm -Ln
目前是空的状态,没有集群
添加集群命令:ipvsadm -A -t 192.168.92.128:80 -s rr
说明:-A 添加集群 -t代表http协议 后面是IP:端口 rr是轮询转发算法
添加RS命令:
- ipvsadm -a -t 192.168.92.128:80 -r 192.168.175.130 -m
- ipvsadm -a -t 192.168.92.128:80 -r 192.168.175.131 -m
说明:-a 添加RS服务器 -t代表http协议 添加到的集群IP:端口 RS的IP:端口 -m是工作模式
-m:NAT工作模式 -g:DR工作模式 -i:TUN工作模式
再次查看LVS状态,此时的规则已经有了RS服务器
3、然后启动LVS服务
- 开启命令:systemctl start ipvsadm.service
到此LVS配置完毕,接下来进行验证!
【验证LVS配置】
在Client模拟机上访问LVS服务器,查看转发规则,理论上是轮询,一次到RS1,一次到RS2
【注意】如果发现并不通,那一定是防火墙的问题,把RS1、RS2、LVS的防火墙都关掉即可。
- 查看防火墙状态 命令:systemctl status firewalld
- 关闭防火墙状态 命令:systemctl stop firewalld
到此,LVS的NAT工作模式搭建实验完成!
【拓展思考】
问题:此时我们的ipvsadm服务启动了嘛???
答案:
1、我们好像并没有去启动服务文件,查看当前服务状态
已经启动了,当前的服务执行的是我们添加进去的LVS规则,并没有执行真正的配置文件,所以意味着我们的配置规则并没有进行保存,重启之后就会消失。下面我们来将我们的规则写到服务启动时候会自动索引执行的文件中,并将服务配置为开机自启,这样我们的配置规则就会自动执行,开机即用。
找到索引文件:打开ipvsadm的service文件 命令:cat /usr/lib/systemd/system/ipvsadm.service
将当前规则保存到文件 命令:ipvsadm -Sn > /etc/sysconfig/ipvsadm
写入之后,我们把当前规则清除,直接启动ipvsadm.service服务,就会自动索引该文件中的规则,同样可以实现我们想要的配置。
清除命令:ipvsadm -C
重新执行ipvsadm.service服务 命令:ipvsadm -R < /etc/sysconfig/ipvsadm
再次从客户机访问可以看到,依旧可以实现转发。
当我们的规则保存到配置文件中之后,我们可以直接启动ipvsadm.service即可
systemctl start ipvsadm.service
服务设置为开机自启:
systemctl enable ipvsadm.service
【ipvsadm工具包的用法】