LVS+Heartbeat+Linux内核编译

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dream_ya/article/details/81291713

一、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

猜你喜欢

转载自blog.csdn.net/Dream_ya/article/details/81291713
今日推荐