热门标签 | 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集群高可用。


推荐阅读
  • Mysql + keepalive高可用搭建
    Mysql+keepalive高可用搭建系统环境:centos6.8Ip:192.168.137.36主库192.168.137.38从库VIP(虚拟ip浮动ip):192.168.13 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Nginxgaodaima.comnginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司 ... [详细]
  • ! Configuration File for keepalivedglobal_defs {   notification_email {     ... [详细]
  • LVS服务器集群系统
    LVS介绍LVS:LinuxVirtualServer,负载调度器,内核集成,章文嵩(花名正明),阿里的四层SLB(ServerLoadBalance)是基于LVS+keepali ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
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社区 版权所有