lvs 负载均衡及高可用

lVS-DR工作方式

LVSDR工作模式,是目前生产环境中最常用的一种工作模式,网上的资料也是最多的,有的文章对DR工作模式的讲解还是比较透彻的。这里我们通过图文的方式再向您介绍一下DR的工作模式

lvs 负载均衡及高可用_第1张图片

上图反映了DR模式的整个工作过程,同样为了简单起见,这里的Real Server也只画了一个。如果是多个Real Server的话,LVS会通过调度算法来决定发往哪台Real ServerLVS-DR工作模式的几个关键点在于:

1).被Real Server处理后形成的响应报文,不再回发到LVS节点,而是直接路由给中心交换机然后发送出去。省去了LVS-NAT方式中的LVS回发过程。

2)LVS节点只会改写链路层的报文封装,对网络层和传输层报文是不进行改写的。

先来说一说上图的工作原理:

1、同样的,我们为了演示整个生产环境中,从机房中心交换机收到一个数据报文后开始讲解。中心交换机同样采取的IP映射方式。但是与 LVS-NAT方式不一样,Real Server在机房的中心交换机上也需要绑定一个外网映射。这样保证Real Server回发的响应报文能够被发送到外网。

2LVS节点接收到请求报文后,会改写报文的数据链路层格式。将Target Mac改写成Real ServerMac但是网络层和传输层报文不会改写,然后重新回发给交换机。这里就涉及一个问题,现在target MacDestination IP的对应关系的错误的,这个数据报文到了交换机后,由于这种错位的关系,是不能进行三层交换的,只能进行二层交换(一旦进行IP交换,数据报文的验证就 会出错,被丢弃)。所以LVS-DR方式要求Real ServerLVS节点必须在同一个局域网内,或者这样说更确切:LVS节点需要找到一个二层链路,将改写了Mac地址的报文发送给Real Server,而不能进行三层交换的校验。这样来看,实际上LVS节点和Real Server界面不一定要在同一个子网,您用一个独立网卡独立组网,传送报文也是可行的。

3、通过二层交换,数据被发送到Real Server节点。那么Real Server节点怎么来判断这个包的正确性呢?首先当然是传输层TCP/IP报文校验没有问题,LVS-NAT没有改写TCP/IP,当然校验就没有问题 (除非报文本身就存在问题);然后是链路层的MAC地址能够被识别,这时就是回环IP的功劳了。对于Real Server节点来说,192.168.100.10这个VIP就是自己的回环IP,绑定的MAC也就是被LVS替换后的target mac那么Real Server会认为这个包是在本机运行的某一个应用程序通过回环IP发给自己的,所以这个包不能被丢弃,必须处理

4、被处理后的生成的响应报文,被直接发送给网管。这个就没有太多的解释的了,只要保证Real server的默认路由设置成到核心交换机的192.168.100.1OK了。另外,需要说明的是,由于LVS-DR模式并没有更改原有的IP报文和TCP报文,所以LVS-DR模式本身是不支持端口映射的,实际上在日常使用实践中,我们一般使用Nginx做端口映射,因为..

 

LVS-DR工作模式的优点在于:

1).解决了LVS-NAT工作模式中的转发瓶颈问题,能够支撑规模更大的负载均衡场景

2)比较耗费网外IP资源,机房的外网IP资源都是有限的,如果在正式生产环境中确实存在这个问题,可以采用LVS-NATLVS-DR混合使用的方式来缓解。

· 

LVS-DR当然也有缺点:

1)配置工作较LVS-NAT方式稍微麻烦一点,您至少需要了解LVS-DR模式的基本工作方式才能更好的指导自己进行LVS-DR模式的配置和运行过程中问题的解决。

2)由于LVS-DR模式的报文改写规则,导致LVS节点和Real Server节点必须在一个网段,因为二层交换是没法跨子网的。但是这个问题针对大多数系统架构方案来说,实际上并没有本质限制。

· 

 

1.安装ipvsadm

修改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.27.250/rhel6.5

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

 

[HighAvailability]

name=HighAvailability

baseurl=http://172.25.27.250/rhel6.5/HighAvailability

enabled=1

gpgcheck=0

 

[LoadBalancer]

name=LoadBalancer

baseurl=http://172.25.27.250/rhel6.5/LoadBalancer

enabled=1

gpgcheck=0

 

[ResilientStorage]

name=ResilientStorage

baseurl=http://172.25.27.250/rhel6.5/ResilientStorage

enabled=1

gpgcheck=0

 

[ScalableFileSystem]

name=ScalableFileSystem

baseurl=http://172.25.27.250/rhel6.5/ScalableFileSystem

enabled=1

gpgcheck=0

 lvs 负载均衡及高可用_第2张图片

                     

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

[root@server1 ~]# ipvsadm -A -t 172.25.27.100:80 -s rr    # -t是表示指定虚拟服务为tcp服务,形式为host[:port], rr表示轮询

 

[root@server1 ~]# ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.2:80 -g # -a是添加一个real server

[root@server1 ~]# ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.3:80 -g

[root@server1 ~]# ipvsadm -l  #查看策略

 lvs 负载均衡及高可用_第3张图片

[root@server1 ~]# ipvsadm -ln     

 lvs 负载均衡及高可用_第4张图片

[root@server1 ~]# /etc/init.d/ipvsadm save  #保存策略使其生效

[root@server1 ~]# ip addr add 172.25.27.100/24 dev eth0 #添加real_server ip

 lvs 负载均衡及高可用_第5张图片

开启real_server apache 

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

 lvs 负载均衡及高可用_第6张图片

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

 lvs 负载均衡及高可用_第7张图片

[root@server2 ~]# ip addr add 172.25.27.100/32 dev eth0  #real_server上添加 ip

lvs 负载均衡及高可用_第8张图片 

在物理主机上测试:

 lvs 负载均衡及高可用_第9张图片

[kiosk@foundation27 ~]$ arp -e 172.25.27.100   #查看访问的100mac地址

 

通过对比mac 地址,可知访问的是server1

[root@foundation27 kiosk]# arp -d 172.25.27.100  #清除APR缓存

[root@foundation27 kiosk]# curl  172.25.27.100

 lvs 负载均衡及高可用_第10张图片

发现此时访问的直接是real_server 主机,没有经过lvs调度器

因此,必须在real_server上增加策略,使其只能通过lvs调度器访问real_server ip

[root@server3 ~]# arptables -A IN -d 172.25.27.100 -j DROP  #将所有访问172.25.27.100 的请求都丢弃掉

[root@server3 ~]# arptables -A OUT -s 172.25.27.100 -j mangle --mangle-ip-s 172.25.27.3     #只允许172.25.27.3 (即本机)访问172.25.27.100

[root@server3 ~]# /etc/init.d/arptables_jf save #保存规则

 

测试:

 lvs 负载均衡及高可用_第11张图片

此时,再清除ARP缓存后,重新访问real_server ip ,发现现在是通过lvs调度器来获取的

当其中一台real_server 主机关掉后,测试

 lvs 负载均衡及高可用_第12张图片

发现此时的lvs调度器没有健康检查,仍然在轮询访问,使有的访问被拒绝,在实际的网站访问时,会造成一定的损失,并使用户的体验变差。

Ldirectord 实现lvs健康检查

ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。

        ldirectord 进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在 Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上 ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦 RealServer再次上线,ldirectord会将其重新添加至IPVS表中

[root@server1 ~]# yum install -y 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]# rpm -ql ldirectord

 lvs 负载均衡及高可用_第13张图片

[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf  /etc/ha.d/

[root@server1 ha.d]# vim ldirectord.cf

virtual=172.25.27.100:80   # 此项用来定义LVS服务及其使用的VIP和PORT

        real=172.25.27.2:80 gate  # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]

        real=172.25.27.3:80 gate

        fallback=127.0.0.1:80 gate  # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight]

        service=http    # 定义基于什么服务来测试RealServer;

        scheduler=rr   # 调度算法为rr

        #persistent=600   # 持久连接超时时间;

        #netmask=255.255.255.255

        protocol=tcp    # 定义此虚拟服务用到的协议;

        checktype=negotiate  # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off}

        checkport=80  # 指健康检查使用的端口;

        request="index.html"  # 检查RealServer用到的页面

        receive="Test Page" # 检查RealServer用到的页面内容

        virtualhost=www.x.y.z

 lvs 负载均衡及高可用_第14张图片

[root@server1 ha.d]# /etc/init.d/ipvsadm stop

[root@server1 ha.d]# /etc/init.d/ldirectord start

[root@server1 ha.d]# ipvsadm -L   #查看规则

 lvs 负载均衡及高可用_第15张图片

此时,两台real_server 都正常工作着

 lvs 负载均衡及高可用_第16张图片

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

当server3上的apache 关掉后

[root@server1 ha.d]# ipvsadm -L

 

此时调度器已经检测到了,此时再访问不会再出现以前那种拒绝被连接的状况

lvs 负载均衡及高可用_第17张图片

当两台real_server 的apache 都关掉,即宕机后

 lvs 负载均衡及高可用_第18张图片

提供当后端RS全部宕掉后,返回的fallback页面,为本机httpd服务

[root@server1 html]# echo "此页面正在维护" > /var/www/html/index.html

[root@server1 html]# /etc/init.d/httpd  start


由于只有一个调度器,当调度器主机宕机后,所有服务都不能正常访问,为了实际中造成损失,我们必须准备台备用的调度器,来应对这种危机

Keepalived 高可用集群管理

源码安装Keepalived 

[root@server1 ~]# /etc/init.d/ldirectord stop  #由于ldirectord 与Keepalived 

冲突,必须将ldirectord停掉

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

Stopping ldirectord... Success

由于ldirectord 开机自启,所以必须将其开机自启关掉

[root@server1 ~]# chkconfig --list ldirectord

ldirectord      0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭

[root@server1 ~]# chkconfig ldirectord off

[root@server1 ~]# chkconfig --list ldirectord

ldirectord      0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

[root@server1 ~]# tar zxf keepalived-1.3.6.tar.gz 

[root@server1 ~]# cd keepalived-1.3.6

[root@server1 ~]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV

[root@server1 ~]# make

[root@server1 ~]# make install

root@server1 etc]# cd /usr/local/keepalived/etc/rc.d/init.d/

[root@server1 init.d]# ls

Keepalived

[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/  #做软连接

[root@server1 init.d]# cd /etc/keepalived/

[root@server1 keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[root@server1 keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

[root@server1 keepalived]# cd /usr/local/keepalived/etc/rc.d/init.d/

[root@server1 init.d]# chmod +x keepalived   #加可执行权限

[root@server1 keepalived]# cd /etc/keepalived

[root@server1 keepalived]# vim keepalived.conf

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   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 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

              172.25.27.100  

}

}

 

virtual_server 172.25.27.100 80 {     ##虚拟主机

    delay_loop 6

    lb_algo rr

    lb_kind DR             ##是使用的DR模型

   # persistence_timeout 50  ##先将此注释掉,可以更加直观的感受到两台rs使用的DR进行的轮转

    protocol TCP

 

    real_server 172.25.27.2 80 {  ##real_server主机地址和端口两台rs均是使用的80端口

        weight 1  ##权重是可以自己进行修改的,在实际使用中,权重使用的不一样是因为,权重较重一方的服务器性能更加好

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 172.25.27.3 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

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

[root@server1 keepalived]#  ipvsadm -l


 lvs 负载均衡及高可用_第19张图片

Keeplived 高可用

找台新的主机按照前面步骤布置keeplived ,可直接将server1的keeplived 配置文件复制过来,进行稍作修改

[root@server4 keepalived]# vim keepalived.conf   #修改state 和 priority

vrrp_instance VI_1 {

    state BACKUP  #将状态由原来的master 改为备用

    interface eth0  

    virtual_router_id 51

    priority 50    #更改优先级,使其和server1上的优先级不同,避免若一台主机挂掉以后,若优先级是一致的,等原来的主机恢复后,会因为优先级是一致的而导致争抢,同时操作电脑上的同一台文件,而导致脑裂。

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

 lvs 负载均衡及高可用_第20张图片

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

lvs 负载均衡及高可用_第21张图片

 lvs 负载均衡及高可用_第22张图片

查看ip 可知此时ip 在server1上,即现在访问的是server1

[root@server1~]#echo c > /proc/sysrq-trigger  #故意让系统崩溃,实现宕机的目的

lvs 负载均衡及高可用_第23张图片

lvs 负载均衡及高可用_第24张图片

测试并查看IP 和mac 地址,发现此时服务已经完全有server4接管,从而实现了lvs集群高可用。

你可能感兴趣的:(运维linux)