热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lvs负载均衡及高可用

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

lVS-DR工作方式

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

lvs 负载均衡及高可用

上图反映了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 源,否则安装不了

[[email protected] ~]# 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 负载均衡及高可用

                     

[[email protected] ~]# yum install -y ipvsadm    

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

 

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

[[email protected] ~]# ipvsadm -a -t 172.25.27.100:80 -r 172.25.27.3:80 -g

[[email protected] ~]# ipvsadm -l  #查看策略

 lvs 负载均衡及高可用

[[email protected] ~]# ipvsadm -ln     

 lvs 负载均衡及高可用

[[email protected] ~]# /etc/init.d/ipvsadm save  #保存策略使其生效

[[email protected] ~]# ip addr add 172.25.27.100/24 dev eth0 #添加real_server ip

 lvs 负载均衡及高可用

开启real_server apache 

[[email protected] ~]# /etc/init.d/httpd start 

 lvs 负载均衡及高可用

[[email protected] ~]# /etc/init.d/httpd start 

 lvs 负载均衡及高可用

[[email protected] ~]# ip addr add 172.25.27.100/32 dev eth0  #real_server上添加 ip

lvs 负载均衡及高可用 

在物理主机上测试:

 lvs 负载均衡及高可用

[[email protected] ~]$ arp -e 172.25.27.100   #查看访问的100mac地址

 lvs 负载均衡及高可用

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

[[email protected] kiosk]# arp -d 172.25.27.100  #清除APR缓存

[[email protected] kiosk]# curl  172.25.27.100

 lvs 负载均衡及高可用

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

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

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

[[email protected] ~]# 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

[[email protected] ~]# /etc/init.d/arptables_jf save #保存规则

 lvs 负载均衡及高可用

测试:

 lvs 负载均衡及高可用

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

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

 lvs 负载均衡及高可用

发现此时的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表中

[[email protected] ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 

[[email protected] ~]# cd /etc/ha.d/

[[email protected] ha.d]# ls

resource.d  shellfuncs

[[email protected] ha.d]# rpm -ql ldirectord

 lvs 负载均衡及高可用

[[email protected] ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf  /etc/ha.d/

[[email protected] 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 负载均衡及高可用

[[email protected] ha.d]# /etc/init.d/ipvsadm stop

[[email protected] ha.d]# /etc/init.d/ldirectord start

[[email protected] ha.d]# ipvsadm -L   #查看规则

 lvs 负载均衡及高可用

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

 lvs 负载均衡及高可用

[[email protected] ~]# /etc/init.d/httpd stop

当server3上的apache 关掉后

[[email protected] ha.d]# ipvsadm -L

 lvs 负载均衡及高可用

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

lvs 负载均衡及高可用

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

 lvs 负载均衡及高可用

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

[[email protected] html]# echo "此页面正在维护" > /var/www/html/index.html

[[email protected] html]# /etc/init.d/httpd  start

lvs 负载均衡及高可用

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

Keepalived 高可用集群管理

源码安装Keepalived 

[[email protected] ~]# /etc/init.d/ldirectord stop  #由于ldirectord 与Keepalived 

冲突,必须将ldirectord停掉

[[email protected] ~]# /etc/init.d/ldirectord stop

Stopping ldirectord... Success

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

[[email protected] ~]# chkconfig --list ldirectord

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

[[email protected] ~]# chkconfig ldirectord off

[[email protected] ~]# chkconfig --list ldirectord

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

[[email protected] ~]# tar zxf keepalived-1.3.6.tar.gz 

[[email protected] ~]# cd keepalived-1.3.6

[[email protected] ~]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV

[[email protected] ~]# make

[[email protected]rver1 ~]# make install

[email protected] etc]# cd /usr/local/keepalived/etc/rc.d/init.d/

[[email protected] init.d]# ls

Keepalived

[[email protected] init.d]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/  #做软连接

[[email protected] init.d]# cd /etc/keepalived/

[[email protected] keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[[email protected] keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

[[email protected] init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

[[email protected] keepalived]# cd /usr/local/keepalived/etc/rc.d/init.d/

[[email protected] init.d]# chmod +x keepalived   #加可执行权限

[[email protected] keepalived]# cd /etc/keepalived

[[email protected] 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

        }

    }

}

[[email protected] keepalived]# /etc/init.d/keepalived start

[[email protected] keepalived]#  ipvsadm -l

lvs 负载均衡及高可用

 lvs 负载均衡及高可用

Keeplived 高可用

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

[[email protected] 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 负载均衡及高可用

[[email protected] keepalived]# /etc/init.d/keepalived start 

lvs 负载均衡及高可用

 lvs 负载均衡及高可用

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

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

lvs 负载均衡及高可用

lvs 负载均衡及高可用

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


推荐阅读
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 如何在Windows内置的Ubuntu系统中更改SSH服务的端口号设置
    如何在Windows内置的Ubuntu系统中更改SSH服务的端口号设置 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 虚拟机网络设置与数据库远程连接优化指南
    本文针对个人计算机上虚拟机网络配置与数据库远程连接的问题,提供了一套详细的优化指南。在探讨远程数据库访问前,需确保网络配置正确,特别是桥接模式的设置。通过合理的网络配置,可以有效解决因虚拟机或网络问题导致的连接失败,提升远程访问的稳定性和效率。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 公司计划部署邮件服务器,考虑到已有域名,决定自行搭建内部邮件服务器。经过综合考量,最终选择在Linux环境中进行搭建,并记录了相关配置和实践过程。本文将详细介绍Postfix的基本设置步骤和实践经验,帮助读者快速掌握邮件服务器的搭建方法。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
author-avatar
爱娟一辈子-_709
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有