一、LVS简介
1、介绍
LVS是 Linux Virtual Server 的简称,是Linux虚拟服务器,是一个虚拟的服务器集群系统,其内核要求2.4以上的。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性,我们可以通过官网来查看它的资料。
2、常用名词解释
名称 | 简写 | 介绍 |
---|---|---|
虚拟IP地址(Virtual IP Address) | VIP | 远程客户端提供服务的外部IP地址 |
真实IP地址(Real Server IP Address) | RIP | 后端realserver的IP地址 |
Director IP地址(Director IP Address) | DIP | 用于连接外网和内网的IP地址 |
客户端IP地址(Client IP Address) | CIP | 用户请求集群服务器的IP地址 |
负载均衡器(Load Balancer) | LB | LVS就属于负载均衡器 |
真实服务器(Real Server) | RS | 后端提供真实服务的server |
虚拟服务器(Virtual Server) | VS | 虚拟服务器,也称为Director |
3、LVS程序组成
- ipvs(ip virtual server):工作在内核层面
- ipvsadm:工作在用户空间,管理LVS的工具,工作在外围
4、LVS负载调度算法
名称 | 简写 | 功能说明 |
---|---|---|
轮叫(Round Robin) | RR | 它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 |
加权轮叫(Weighted Round Robin) | WRR | 根据真实服务器的不同处理能力来调度访问请求,这样可以保证处理能力强的服务器处理更多的访问流量。 |
最少链接(Least Connections) | LC | 将网络请求调度到已建立的链接数最少的服务器上,如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。 |
加权最少链接(Weighted Least Connections) | WLC | 在集群系统中的服务器性能差异较大的情况下,具有较高权值的服务器将承受较大比例的活动连接负载。 |
基于局部性的最少链接(Locality-Based Least Connections) | LBLC | 根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,将请求发送到该服务器。 |
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication) | LBLCR | 针对目标IP地址的负载均衡,目前主要用于Cache集群系统。 |
目标地址散列(Destination Hashing) | DH | 根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 |
源地址散列(Source Hashing) | SH | 根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 |
5、LVS四种工作模式
(1)DR模式(常用)
1)工作原理:Client访问时,访问的是LVS的VIP,到时LVS的是CIP和VIP数据包,LVS会先查看自己ARP的缓存里查看是否有后端RS的MAC地址,没有边通过ARP广播获取,所以两者必须是在同一网段,再通过调度算法将RS对应的MAC地址封装到CIP和VIP数据包上,从而访问到RS。因为RS配置了ARP抑制,因此数据包可以用VIP和CIP在数据包出去时直接和Client进行连接,不需要经过LVS服务器,因此其传输效率最快。
2)优点:
- 由于速度较快,支持高并发
3)不足:
- LVS-RS间必须在同一个VLAN
- RS上绑定VIP,风险大
(2)NAT模式
1)工作原理:Client发送的数据包为CIP和VIP,LVS通过DNAT目标地址转换将VIP转换成RIP,到达RS,RS通过配置LVS的内部网管找到LVS,再通过LVS将RIP转换为VIP发送给Client。
2)优点:
- 支持VIP和RIP不在同一网段
3)不足:
- LVS需要有双网卡,且需要开启路由机制
- RS/ROUTER配置策略路由
4)开启路由机制方法:
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
(3)TUNNEL模式
1)工作原理:Client发送数据包为CIP和VIP,到达LVS服务器时通过封装数据包到达RS,RS获取到VIP和CIP,RS需要有VIP和ARP抑制,通过隧道返回到Client。
2)优点:
- 适用于WLAN环境,可以支持IPIP隧道技术,实现对数据的封装
- 适用于LVS和RS不在同一个物理环境的场景
3)不足:
- RS配置复杂(IPIP模块等)
- RS上绑定VIP,风险大
(4)FULLNAT模式
1)工作原理:通过DNAT+SNAT以及SNAT+DNAT实现源地址和目标地址互相转换,引入local address(内网ip地址),cip-vip转 换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通 讯。
2)优点:
- 可以跨VLAN通讯,功能多,支持的主机数量更大
3)缺点:
- 需要进行内核编译
速度:DR > TUNNEL > NAT >FULLNAT
二、实验环境
安装包下载地址: https://pan.baidu.com/s/1oUabUbwTJTX0nhco5YJPtw 密码: et92
1、安装说明
主机名 | IP | 操作系统 | 功能 |
---|---|---|---|
server1 | 10.10.10.1 | redhat6.5 | LVS:实现负载调度 |
server2 | 10.10.10.2 | redhat6.5 | Apache:提供WEB页面 |
server3 | 10.10.10.3 | redhat6.5 | Apache:提供WEB页面 |
2、yum源
vim /etc/yum.repos.d/yum.repo
[rhel6.5]
name=rhel6.5
baseurl=http://10.10.10.250/rhel6.5
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://10.10.10.250/rhel6.5/HighAvailability
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://10.10.10.250/rhel6.5/LoadBalancer
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://10.10.10.250/rhel6.5/ScalableFileSystem
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://10.10.10.250/rhel6.5/ResilientStorage
gpgcheck=0
三、LVS(DR模式)
注意:由于rr演示效果更加好,因此我们使用此负载调度算法来做实验!!!
1、安装ipvsadm
[root@server1 ~]# yum install -y ipvsadm
2、查看支持的几种模式
[root@server1 ~]# ipvsadm -h
我们可以发现没有FULLNAT模式,此模式需要我们编译内核(kernel-2.6.32-220.23.1.el6),在执行此命令发现会多一个-b参数,后面我们会介绍如何进行内核编译。
3、配置RS策略
[root@server1 ~]# ip addr add 10.10.10.100/24 dev eth0 ###用ip addr可以查看到此VIP,也可以写到lo
[root@server1 ~]# ipvsadm -A -t 10.10.10.100:80 -s rr ###使用rr
[root@server1 ~]# ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.2:80 -g ###访问100的跳转到2上,-g:使用DR模式
[root@server1 ~]# ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.3:80 -g ###访问100的跳转到3上
[root@server1 ~]# /etc/init.d/ipvsadm save ###保存加入的策略,保存在/etc/sysconfig/ipvsadm中
[root@server1 ~]# ipvsadm -ln ###查看刚加入的策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr
-> 10.10.10.2:80 Route 1 0 0
-> 10.10.10.3:80 Route 1 0 0
4、配置ARP策略
arp缓存用来存储IP地址和MAC地址的缓冲区(arp -an:查看自己的arp缓存)。arptables:用于过滤arp包,处理arp协议的包,先进行arptables抑制,再进行iptables抑制!!!
(1)安装arptables
[root@server2 ~]# yum install -y arptables_jf
(2)配置策略
注意:server3也要进行策略的添加,自需要把10.10.10.2的IP换成10.10.10.3即可!!!
[root@server2 ~]# ip addr add 10.10.10.100/24 dev eth0 ###添加VIP
[root@server2 ~]# arptables -A IN -d 10.10.10.100 -j DROP ###对100不回应
[root@server2 ~]# arptables -A OUT -s 10.10.10.100 -j mangle --mangle-ip-s 10.10.10.2 ###把来自100的转换成访问2的
[root@server2 ~]# /etc/init.d/arptables_jf save ###保存
Saving current rules to /etc/sysconfig/arptables: [ OK ]
[root@server2 ~]# arptables -L ###查看加入的策略
Chain IN (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
DROP anywhere 10.10.10.100 anywhere anywhere any any any any
Chain OUT (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
mangle 10.10.10.100 anywhere anywhere anywhere any any any any --mangle-ip-s server2
Chain FORWARD (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
5、安装Apache(server2、3)
[root@server2 ~]# yum install -y httpd
[root@server2 ~]# echo "server2" >/var/www/html/index.html
[root@server2 ~]# /etc/init.d/httpd restart
6、测试
注意:不能用10.10.10.1(RS)来进行测试,找除这三台的虚拟机进行测试即可,这里我用真机来进行测试!!!
[root@dream ~]# curl 10.10.10.100
[root@server2 ~]# /etc/init.d/httpd stop
总结:lvs对后端RS没有健康检查,如果后端服务挂掉不能进行,前端还会对后端访问,这也是需要我们考虑的问题,最常用的我们是加入keepalived来进行健康检查,这里我们用Heartbeat来做实验!!!
四、LVS+Heartbeat
注意:下面的操作是在上述环境中接着进行的!!!
Heartbeat是基于主机或网络的服务的高可用方式!!!
ldirectord:Heartbeat的一样插件,我们可以通过使用它来对lvs进行健康检查,后端服务故障自动进行清除,恢复自动加入!!!
1、安装ldirectord
[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
[root@server1 ~]# rpm -qlp ldirectord-3.9.5-3.1.x86_64.rpm ###查看其生成的文件
warning: ldirectord-3.9.5-3.1.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 7b709911: NOKEY
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/ldirectord-3.9.5
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
2、配置ldirectord.cf
[root@server1 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ~]# vim /etc/ha.d/ldirectord.cf
virtual=10.10.10.100:80
real=10.10.10.2:80 gate
real=10.10.10.3:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600 ###是否一直连接
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
# receive="Test Page" ###测试,只有html内容为:Test Page
# virtualhost=x.y.z ###虚拟主机
[root@server1 ~]# /etc/init.d/ldirectord restart
3、测试
[root@dream ~]# curl 10.10.10.100 ###真机中进行测试
[root@server2 ~]# /etc/init.d/httpd start
我们不难可以发现当server2关掉时,不会访问到server2,启动httpd后自动加入集群中进行访问!!!
五、编译内核
由于FULLNAT模式并不支持,因此下面讲解下内核编译,其用法就不过多介绍了!!!
FULLNAT:有抗攻击模块,支持多个vlan,实现不同vlan的互通;进来DNAT+SNAT,出去SNAT+DNAT!!!
编译内核官网网址:http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY
1、查看原始内核
[root@server1 ~]# uname -r
2.6.32-431.el6.x86_64
[root@server1 ~]# ls
asciidoc-8.4.5-4.1.el6.noarch.rpm newt-devel-0.52.11-3.el6.x86_64.rpm
kernel-2.6.32-220.23.1.el6.src.rpm slang-devel-2.2.1-1.el6.x86_64.rpm
Lvs-fullnat-synproxy.tar.gz ldirectord-3.9.5-3.1.x86_64.rpm
2、安装内核
[root@server1 ~]# rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm
[root@server1 ~]# yum install -y rpm-build
3、解决依赖
[root@server1 ~]# rpmbuild -bp /root/rpmbuild/SPECS/kernel.spec
error: Failed build dependencies:
gcc >= 3.4.2 is needed by kernel-2.6.32-220.23.1.el6.x86_64
redhat-rpm-config is needed by kernel-2.6.32-220.23.1.el6.x86_64
patchutils is needed by kernel-2.6.32-220.23.1.el6.x86_64
xmlto is needed by kernel-2.6.32-220.23.1.el6.x86_64
asciidoc is needed by kernel-2.6.32-220.23.1.el6.x86_64
elfutils-libelf-devel is needed by kernel-2.6.32-220.23.1.el6.x86_64
zlib-devel is needed by kernel-2.6.32-220.23.1.el6.x86_64
binutils-devel is needed by kernel-2.6.32-220.23.1.el6.x86_64
newt-devel is needed by kernel-2.6.32-220.23.1.el6.x86_64
python-devel is needed by kernel-2.6.32-220.23.1.el6.x86_64
perl(ExtUtils::Embed) is needed by kernel-2.6.32-220.23.1.el6.x86_64
hmaccalc is needed by kernel-2.6.32-220.23.1.el6.x86_64
[root@server1 ~]# yum install -y gcc redhat-rpm-config patchutils xmlto elfutils-libelf-devel zlib-devel python-devel binutils-devel perl-ExtUtils-Embed hmaccalc
[root@server1 ~]# yum install -y slang-devel-2.2.1-1.el6.x86_64.rpm newt-devel-0.52.11-3.el6.x86_64.rpm asciidoc-8.4.5-4.1.el6.noarch.rpm
4、打补丁
[root@server1 ~]# rpmbuild -bp /root/rpmbuild/SPECS/kernel.spec
###打开另外一个shell,下载rngd命令,使用其生成随机字符
[root@server1 ~]# yum install -y rng-tools
[root@server1 ~]# rngd -r /dev/urandom ###可多执行几次,如果还是没反应的话
[root@server1 ~]# tar xf /root/Lvs-fullnat-synproxy.tar.gz
[root@server1 ~]# cd
[root@server1 ~]# cp /root/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
[root@server1 ~]# cd /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# patch -p1 <lvs-2.6.32-220.23.1.el6.patch
5、编译
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make -j 2 ###我们可以使用-j参数使用多个线程
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make modules_install
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make install ###写入/boot分区
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# grep CONFIG_IP_VS_TAB_BITS .config ###之前为12,hash表的大小
CONFIG_IP_VS_TAB_BITS=22
6、修改启动项
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# vim /boot/grub/grub.conf
#boot=/dev/sda
default=0 ###我们把默认启动项设置为我们刚编译好的内核
timeout=5
7、重启查看
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# reboot
[root@server1 ~]# uname -r
2.6.32
内核就编译完成,下面接着编译ipvsadm!!!
8、编译ipvsadm
[root@server1 ~]# cd /root/lvs-fullnat-synproxy/
[root@server1 lvs-fullnat-synproxy]# tar xf lvs-tools.tar.gz
[root@server1 lvs-fullnat-synproxy]# cd tools/keepalived/
[root@server1 keepalived]# yum install -y openssl-devel popt-devel ###解决依赖
[root@server1 keepalived]# ./configure --with-kernel-dir="/lib/modules/`uname -r`/build"
[root@server1 keepalived]# make && make install
[root@server1 keepalived]# cd /root/lvs-fullnat-synproxy/tools/ipvsadm/
[root@server1 ipvsadm]# make && make install
9、查看结果
[root@server1 ipvsadm]# ipvsadm -h |grep fullnat
--fullnat -b fullnat mode