黑帽联盟

 找回密码
 会员注册
查看: 1596|回复: 0
打印 上一主题 下一主题

[集群服务] 初级篇:借助LVS+Keepalived实现负载均衡

[复制链接]
yun 黑帽联盟官方人员 

920

主题

37

听众

1364

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

     在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。

    1.2 负载均衡的类型
      负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载。
      商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软件负载;
      软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)。
    二、初识LVS:Linux Virtual Server2.1 LVS是神马东西
      LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

    2.2 LVS有神马作用
      LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
      LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。

    2.3 LVS的体系结构
      使用LVS架设的服务器集群系统有三个部分组成:
      (1)最前端的负载均衡层,用Load Balancer表示;
      (2)中间的服务器集群层,用Server Array表示;
      (3)最底端的数据共享存储层,用Shared Storage表示;
      在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
    091720304649072.png
    2.4 LVS负载均衡机制
      (1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
      (2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。
      ①NAT模式:网络地址转换
    182157070532417.jpg
      NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

      ②DR模式:直接路由
    182303190069562.jpg
      DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

      (3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

    三、构建实战:LVS+Keepalived实现负载均衡3.1 实验结构总览
    092307196049297.png
      (1)本次基于VMware Workstation搭建一个四台Linux(CentOS 6.4)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另一台为备机),另外两台作为真实的Web服务器(向外部提供http服务,这里仅仅使用了CentOS默认自带的http服务,没有安装其他的类似Tomcat、Jexus服务)。
      (2)本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。

    3.2 基础准备工作
      以下工作针对所有服务器,也就是说要在四台服务器中都要进行配置:
      (1)绑定静态IP地址
      命令模式下可以执行setup命令进入设置界面配置静态IP地址;x-window界面下可以右击网络图标配置;配置完成后执行service network restart重新启动网络服务;
      验证:执行命令ifconfig
      (2)设定主机名
      ①修改当前会话中的主机名,执行命令hostname xxxx (这里xxxx为你想要改为的名字)
      ②修改配置文件中的主机名,执行命令vi /etc/sysconfig/network (√一般需要进行此步凑才能永久更改主机名)
      验证:重启系统reboot
      (3)IP地址与主机名的绑定
      执行命令vi /etc/hosts,增加一行内容,如下(下面的从节点以你自己的为主,本实验搭建了两个从节点):
      192.168.80.100 lvs-master
      192.168.80.101 lvs-slave
      #下面是本次试验的两个真实服务器节点
      192.168.80.102 lvs-webserver1
      192.168.80.103 lvs-webserver2
      保存后退出
      验证:ping lvs-master
      (4)关闭防火墙
      ①执行关闭防火墙命令:service iptables stop
          验证:service iptables stauts
      ②执行关闭防火墙自动运行命令:chkconfig iptables off
      验证:chkconfig --list | grep iptables

    3.3 配置两台Web服务器
      以下操作需要在角色为Web服务器的两台中进行,不需要在负载均衡服务器中进行操作:
      (1)开启http服务
      命令:service httpd start
      补充:chkconfig httpd on -->将httpd设为自启动服务
      (2)在宿主机访问Web网页,并通过FTP工具上传自定义网页:这里上传一个静态网页,并通过更改其中的html来区别两台Web服务器,以下图所示为例,其中一台显示from 192.168.80.102,而另一台显示from 192.168.80.103;
    092331330897815.jpg
      (3)编辑realserver脚本文件
      ①进入指定文件夹:cd /etc/init.d/
      ②编辑脚本文件:vim realserver
    1. SNS_VIP=192.168.80.200
    2. /etc/rc.d/init.d/functions
    3. case "$1" in
    4. start)
    5.        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
    6.        /sbin/route add -host $SNS_VIP dev lo:0
    7.        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    8.        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    9.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    10.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    11.        sysctl -p >/dev/null 2>&1
    12.        echo "RealServer Start OK"
    13.        ;;
    14. stop)
    15.        ifconfig lo:0 down
    16.        route del $SNS_VIP >/dev/null 2>&1
    17.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    18.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    19.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    20.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    21.        echo "RealServer Stoped"
    22.        ;;
    23. *)
    24.        echo "Usage: $0 {start|stop}"
    25.        exit 1
    26. esac
    27. exit 0
    复制代码

      这里我们设置虚拟IP为:192.168.80.200
      ③保存脚本文件后更改该文件权限:chmod 755 realserver
      ④开启realserver服务:service realserver start

    3.4 配置主负载服务器
      (1)安装Keepalived相关包
    yum install -y keepalived
      在CentOS下,通过yum install命令可以很方便地安装软件包,但是前提是你的虚拟机要联网;
      (2)编辑keepalived.conf配置文件
      ①进入keepalived.conf所在目录:cd /etc/keepalived
      ②首先清除掉keepalived原有配置:> keepalived.conf
      ③重新编辑keepalived配置文件:vi keepalived.conf
    1. global_defs {  
    2.    notification_email {  
    3.          edisonchou@hotmail.com  
    4.    }  
    5.    notification_email_from sns-lvs@gmail.com  
    6.    smtp_server 192.168.80.1  
    7.    smtp_connection_timeout 30
    8.    router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
    9. }  
    10. vrrp_instance VI_1 {  
    11.     state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备         
    12.     interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
    13.     virtual_router_id 51  #虚拟路由编号,主备要一致
    14.     priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR   
    15.     advert_int 1  #检查间隔,默认为1s
    16.     authentication {  
    17.         auth_type PASS  
    18.         auth_pass 1111  
    19.     }  
    20.     virtual_ipaddress {  
    21.         192.168.80.200  #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个
    22.     }  
    23. }  
    24. # 定义对外提供服务的LVS的VIP以及port
    25. virtual_server 192.168.80.200 80 {  
    26.     delay_loop 6 # 设置健康检查时间,单位是秒                    
    27.     lb_algo wrr # 设置负载调度的算法为wlc                  
    28.     lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式   
    29.     nat_mask 255.255.255.0               
    30.     persistence_timeout 0         
    31.     protocol TCP                  
    32.     real_server 192.168.80.102 80 {  # 指定real server1的IP地址
    33.         weight 3   # 配置节点权值,数字越大权重越高              
    34.         TCP_CHECK {  
    35.         connect_timeout 10         
    36.         nb_get_retry 3  
    37.         delay_before_retry 3  
    38.         connect_port 80  
    39.         }  
    40.     }  
    41.     real_server 192.168.80.103 80 {  # 指定real server2的IP地址
    42.         weight 3  # 配置节点权值,数字越大权重越高  
    43.         TCP_CHECK {  
    44.         connect_timeout 10  
    45.         nb_get_retry 3  
    46.         delay_before_retry 3  
    47.         connect_port 80  
    48.         }  
    49.      }  
    50. }
    复制代码
      (3)开启keepalived服务
    service keepalived start

    3.5 配置从负载服务器
      从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:
      (1)将state由MASTER改为BACKUP
      (2)将priority由100改为99
    1. vrrp_instance VI_1 {  
    2.     state BACKUP # 这里改为BACKUP
    3.     interface eth1  
    4.     virtual_router_id 51  
    5.     priority 99 # 这里改为99,master优先级是100
    6.     advert_int 1  
    7.     authentication {  
    8.         auth_type PASS  
    9.         auth_pass 1111  
    10.     }  
    11.     virtual_ipaddress {  
    12.         192.168.80.200  
    13.     }  
    14. }  
    复制代码

    3.6 验证性测试
      (1)指定请求的均衡转发:因为两个Web服务器的权重都一样,所以会依次转发给两个Web服务器;
    100002201983313.gif

      (2)Web服务器发生故障时:
      ①A发生故障后,只从B获取服务;
      这里模拟192.168.80.102发生故障,暂停其http服务:service httpd stop
    100004250583535.jpg
      再来看看这时从外部访问VIP时,便会只从192.168.80.103获取网页:
    100005512455970.gif
      ②A故障修复后,又从A获取服务;
      这里模拟192.168.80.102修复完成,重启其http服务:service httpd start
    100007391989389.jpg
      再来看看这时从外部访问VIP,又可以从192.168.80.102获取网页:
    100010006679270.gif
      (3)主负载均衡服务器发生故障时,备机立即充当主机角色提供请求转发服务:
      这里模拟192.168.80.100发生故障,暂停其keepalived服务:service keepalived stop
    100012207294382.jpg
      再来看看这时从外部访问VIP,还是可以正常获取网页:
    100013188088138.gif

    学习小结
      LVS是目前广为采用的软件负载均衡解决方案,在一些大型企业级系统及互联网系统中应用。本次,简单地了解了一下LVS,并在Linux下搭建了一个小小的测试环境,借助Keepalived实现了一个最小化的负载均衡测试环境。LVS是一个可以工作在网络第四层的负载均衡软件,因此它相对于Nginx一类工作在第七层的负载均衡软件有着无可比拟的性能优势,而且它还是我国的章文嵩博士(现在阿里的副总裁,淘宝的技术专家)作为创始人发起的,现已经成为Linux内核的组成部分。
      当然,目前流行的LVS解决方案中,在Web服务器端也有采用了Nginx+Tomcat这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。在以后的日子里,我还会尝试下在Linux下借助Jexus跑ASP.NET MVC项目,试试.NET项目在Linux下的运行效果,希望到时也可以做一些分享。好了,今天就到此停笔。

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部