LVS+Heartbeat+Linux内核编译

一、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)LBLVS就属于负载均衡器
真实服务器(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操作系统功能
server110.10.10.1redhat6.5LVS:实现负载调度
server210.10.10.2redhat6.5Apache:提供WEB页面
server310.10.10.3redhat6.5Apache:提供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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wielun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值