运维项目实训—LVS+Keepalived

1.LVS简介

LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。
【1】技术简介
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
【2】集群采用三层结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
【3】调度器
调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。
对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。
【4】分布式锁管理器
此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。
负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。
【5】监视器
Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。

2.相关简介

1.IPVS
IPVS 是 lvs的第一部分负载调度器(load balancer)的实现 ,也就是最核心的部分,用来进行负载均衡,所以 ipvs主要实现了四种IP负载均衡技术 + 十种调度算法 来实现lvs的负载均衡功能。
<1>IP负载均衡技术
NAT工作模式,简单来说就是传统的NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。
TUN工作模式,即IP Tunneling模式。这种模式中,调度器将进入的包重新包成一个IP包,然后发送给选定的目的服务器,目的服务器处理后,直接将应答发送给客户(当然该重新封装的报文的源IP地址还是要填成调度器的)。
DR工作模式,即Direct Routing模式。这种模式中,调度器直接重写进入包的mac地址,将其改为选定的目标服务器的mac地址,这样就可以到达服务器。但这样的话需要要求IPVS服务器需要和真实服务器在同一局域网内,且真实服务器必须有真实网卡(这样重写了mac地址的报文才可以才可以到达该服务器)
FULLNAT工作模式
<2>调度算法
IPVS在内核中的负载均衡调度是以连接为粒度的。在HTTP协议(非持久)中,每个对象从WEB服务器上获取都需要建立一个TCP连接,同一用户的不同请求会被调度到不同的服务器上,所以这种细粒度的调度在一定程度上可以避免单个用户访问的突发性引起服务器间的负载不平衡。

在内核中的连接调度算法上,IPVS已实现了以下十种调度算法:

轮叫调度(Round-Robin Scheduling)
加权轮叫调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
最短预期延时调度(Shortest Expected Delay Scheduling)
不排队调度(Never Queue Scheduling)

2.Heartbeat
Heartbeat 项目是 Linux-HA 工程的一个组成部分,其与lvs在本质上无关。
Heartbeat提供了2个核心的功能正是lvs所需要的,心跳监测部分和资源接管,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,安装了 Heartbeat 的两台机器会通过心跳检测互相检测对方的状态,当检测到对方失效的时候会调用资源接管来做接管服务器,保证高可靠性。
在一个高可靠的lvs集群中,负载调度IPVS部分一般由2台服务器组成,一台负责调度,一台负责备用,当负责调度的服务器出现问题的时候迅速切换到备用机器上,而heartbeat 就是负责检测,负载调度 IPVS 的可用性,并在出现问题的时候切换到备用 IPVS 上面。

3.ldirectord
ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。
ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真是服务器发送请求进行监控,如果 服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过ipvsadm 进行添加。

4.Keepalived
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现 。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。
在lvs体系中,Keepalived主要有如下3个功能:
1 管理LVS负载均衡软件
2 实现对LVS集群节点的健康检查功能
3 作为系统网络服务的高可用功能
即 Keepalived 实现了 heartbeat + ldirectord 的功能。


LVS的两种实现方法(heartbeat与KeepAlived)
第一种集群方式 : LVS+heartbeat+ldirectord实现集群负载
第二种集群方式:LVS+KeepAlived集群负载
本文主要介绍 第二种集群方式:LVS+KeepAlived集群负载


3.实验

实验环境:

Server1:
Server2:
Server3:
物理机:


实验一:LVS负载均衡
Server1:
<1>添加yum源完整的安装包

[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo 
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.51.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.51.250/rhel6.5/LoadBalancer
gpgcheck=0

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.51.250/rhel6.5/HighAvailability
gpgcheck=0

[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.51.250/rhel6.5/ResilientStorage
gpgcheck=0

[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.51.250/rhel6.5/ScalableFileSystem
gpgcheck=0

示图1:6.5版本yum源完整的安装包

这里写图片描述

示图2:物理机查看版本6.5镜像yum源完整的安装包
这里写图片描述
<2>安装管理集群服务ipvsadm

[root@server1 ~]# yum install ipvsadm -y

<3>临时添加ip,并设置为lvs的vip
rr:表示论询算法,-t:TCP,-s:sheduler

[root@server1 ~]# ip addr add 172.25.51.100/24 dev eth0  ##临时添加ip
[root@server1 ~]# ipvsadm -A -t 172.25.51.100:80 -s rr

示图1:添加ip后
这里写图片描述
示图2:查询ipvsadm状态
这里写图片描述
<4>vip添加RS地址,并设置为DR模式
-r:RS地址,-g:DR模式

[root@server1 ~]# ipvsadm -a -t 172.25.51.100:80 -r 172.25.51.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.51.100:80 -r 172.25.51.3:80 -g

示图:查询ipvsadm状态
这里写图片描述
<5>保存ipvsadm操作

[root@server1 ~]# /etc/init.d/ipvsadm save

Server2:
<1>修改Apache服务测试页内容,并开启httpd服务

[root@server2 ~]# vim /var/www/html/index.html 

这里写图片描述
示图:本机测试
这里写图片描述
<2>Realserver同样添加虚拟ip地址,与调度器虚拟ip地址一致

[root@server2 ~]# ip addr add 172.25.12.100/32 dev eth0

这里写图片描述
<3>安装arp防火墙
arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip

[root@server2 ~]# yum install arptables_jf -y

<4>设置arp抑制

[root@server2 ~]# arptables -A IN -d 172.25.51.100 -j DROP ##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server2 ~]# arptables -A OUT -s 172.25.51.100 -j mangle --mangle-ip-s 172.25.51.2  ##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
[root@server2 ~]# /etc/init.d/arptables_jf save

示图:查看arp防火墙状态
这里写图片描述

Server3:
<1>修改Apache服务测试页内容,并开启httpd服务

[root@server3 ~]# vim /var/www/html/index.html 

这里写图片描述
示图:本机测试
这里写图片描述
<2>Real server同样添加虚拟ip地址,与调度器虚拟ip地址一致

[root@server2 ~]# ip addr add 172.25.12.100/32 dev eth0

这里写图片描述
<3>安装arp防火墙
arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip

[root@server3 ~]#  yum install arptables_jf -y

<4>设置arp抑制

[root@server3 ~]# arptables -A IN -d 172.25.51.100 -j DROP ##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server3 ~]# arptables -A OUT -s 172.25.51.100 -j mangle --mangle-ip-s 172.25.51.3  ##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
[root@server3 ~]# /etc/init.d/arptables_jf save

示图:查看arp防火墙状态
这里写图片描述
测试:
1.负载均衡
示图1:物理机访问172.25.51.100
这里写图片描述
示图2:server1查看ipvsadm状态,server2、3负载均衡
这里写图片描述
2.显示arp缓冲区中的条目
示图:arp缓冲区中MAC地址与server1的MAC地址相同
这里写图片描述
这里写图片描述


实验二:LVS健康检查
server1:
<1>下载并安装监控软件

lftp 172.25.51.250:/pub> get ldirectord-3.9.5-3.1.x86_64.rpm 
[root@server1 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm   

<2>修改配置文件

[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm  ##查找配置文件
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# ls
resource.d  shellfuncs
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# vim ldirectord.cf   ##修改配置文件
virtual=172.25.51.100:80
        real=172.25.51.2:80 gate 
        real=172.25.51.3:80 gate
        fallback=127.0.0.1:80 gate  ##server2、3服务down后,访问本机80端口
        service=http
        scheduler=rr                ##调度模式:轮询
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80                ##端口
        request="index.html"        ##文件
#       receive="Test Page"
#       virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ldirectord start  开启服务

示图:修改配置文件
这里写图片描述
示图:查找配置文件
这里写图片描述
<3>测试页

[root@server1 ha.d]# vim /var/www/html/index.html
此网站正在维护中...

<4>监听端口80

[root@server1 html]# vim /etc/httpd/conf/httpd.conf 
136 Listen 80
[root@server1 html]# /etc/init.d/httpd start

<5>Real Server主机关闭http服务,Virtual Server主机
示图1:测试本机
这里写图片描述
示图2:查看ipvsadm状态
这里写图片描述
server2:Real Server主机关闭http服务

[root@server2 ~]# /etc/init.d/httpd stop

server3:Real Server主机关闭http服务

[root@server3 ~]# /etc/init.d/httpd stop

测试:物理机
这里写图片描述
这里写图片描述
注意:当安装 php 模块后,默认优先读取 index.php,应将index.php删除,才可读取Index.html.


实验三:高可用集群High-Avaliability
实验环境:
server1:
<1>停止 ldirectord 服务

[root@server1 ~]# /etc/init.d/ldirectord stop
[root@server1 ~]# chkconfig ldirectord off

<2>下载并安装keepalived

lftp 172.25.51.250:/pub> get keepalived-1.4.3.tar.gz 
[root@server1 ~]# tar zxf keepalived-1.4.3.tar.gz
[root@server1 ~]# cd keepalived-1.4.3
[root@server1 keepalived-1.4.3]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server1 keepalived-1.4.3]# make && make install

注意:compile报错时,解决依赖性, 安装 openssl-devel

[root@server1 ~]# yum install openssl-devel.x86_64 -y

这里写图片描述

<3>配置keepalived服务

[root@server1 ~]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# chmod +x keepalived 
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 init.d]# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict                   ##注释
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 12          ##避免冲突
    priority 100                  ##优先级100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.51.100
    }
}

virtual_server 172.25.51.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
   # persistence_timeout 50                  ##注释
    protocol TCP

    real_server 172.25.51.2 80 {
        weight 1
        SSL_GET {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.51.3 80 {
        weight 1
        SSL_GET {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

<4>scp配置文件给server4

[root@server1 ~]# scp -r /usr/local/keepalived/ server4:/usr/local/
[root@server1 ~]# scp -r /etc/keepalived/keepalived.conf server4:/etc/keepalived/

注意:
server1和server4必须同时安装scp服务

[root@server1 ~]# yum provides */scp     ##查找服务所在安装包
[root@server1 ~]# yum install openssh-clients-5.3p1-94.el6.x86_64 -y

这里写图片描述
<5>开启并加载服务

[root@server1 ~]# /etc/init.d/keepalived start
[root@server1 ~]# /etc/init.d/keepalived reload

server4:
<1>配置完整的yum源

vim /etc/yum.repos.d/rhel-source.repo

这里写图片描述

<2>安装服务

[root@server4 ~]# yum install -y ipvsadm
[root@server4 ~]# yum install openssh-clients-5.3p1-94.el6.x86_64 -y

<3>配置keepalived服务

[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]#cd /usr/local/keepalived/etc/rc.d/init.d
[root@server4 init.d]# chmod +x keepalived 
[root@server4 init.d]# vim /etc/keepalived/keepalived.conf  ##主要修改以下部分
vrrp_instance VI_1 {
    state BACKUP                    ##备用
    interface eth0
    virtual_router_id 12
    priority 50                     ##优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.51.100
    }
}

<4>重启服务

[root@server4 ~]# /etc/init.d/keepalived start
[root@server4 ~]# /etc/init.d/keepalived reload

server2:

[root@server2 ~]# /etc/init.d/httpd start

server3:

[root@server3 ~]# /etc/init.d/httpd start

测试:
<1>轮询
这里写图片描述
<2>server1主机keepalived服务开启时: (server1优先级高,主用,显示server1的Mac地址)
这里写图片描述
server1主机keepalived服务关闭时: (切换到server4主机,备用,显示server4的Mac地址)
这里写图片描述

猜你喜欢

转载自blog.csdn.net/hannah_zh/article/details/80796052