LVS学习笔记-lvs+nginx+keepalived

准备

准备3台centos服务器172.20.x.40,172.20.x.41,172.20.x.42作为一个LVS+nginx的负载集群,其中172.20.x.40作为LVS-master,172.20.x.36.41作为LVS-Backup;172.20.x.42172.20.x.44作为nginx负载向后面业务服务器负载。

第一次接触lvs+nginx+keepalived的集群负载,好多不懂,中间折腾了好久,截图与实际的ip有些不符合,最终的集群服务信息如下

名称 ip 说明 备注
虚拟地址 172.20.36.222:81 对外的ip地址 虚拟的IP地址,注意不能与局域网中的IP地址重复
lvs-master 172.20.36.41 lvs主节点 真实IP地址,需要该机器上的keepalived配置端口,用于VIP的漂移
lvs-backup 172.20.36.42 lvs备节点 真实IP地址,需要该机器上的keepalived配置端口,用于VIP的漂移
nginx-01 172.20.36.43:81 nginx节点01 真实IP地址,实现应用层的业务负载
nginx-02 172.20.36.44:81 nginx节点02 真实IP地址,实现应用层的业务负载

一、环境配置

1. 防火墙

查看防火墙状态firewall-cmd --state,对于运行的将防火墙关闭systemctl stop firewalld.servicesystemctl disablefirewalld.service
在这里插入图片描述

2.selinux设置

关闭每台服务器selinux,修改/etc/selinux/config,将SELINUX由enforcing修改为disabled,重启服务器。
修改selinux的命令# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重启之后,查看服务器selinux状态sestatus -v
在这里插入图片描述

二、ipvs和keepalived安装及配置

1.LVS服务器上安装虚拟服务

1)ivps安装

在LVS-Master和LVS-Backup的服务器上安装ipvs,输入命令行:yum -y install ipvsadm,安装完毕如下:
在这里插入图片描述

2)keepalived安装

在LVS-Master和LVS-Backup的服务器上安装keepalive,输入命令行:yum -y install keepalived,如下:
在这里插入图片描述

2.配置

分别配置两台LVS服务器上的keepalive配置信息。

1)配置Master

配置LVS-Master上的keepalive配置,打开/etc/keepalived/keepalived.conf,修改为以下配置:

! Configuration File for keepalived
global_defs {
   router_id lvs01
}
vrrp_instance VI_1 {
    state MASTER    
    interface ens33 
    virtual_router_id 100
    priority 100         
    advert_int 1         
    authentication {     
        auth_type PASS   
        auth_pass 1111   
    }
    virtual_ipaddress {  
        172.20.36.222 
    }
}
virtual_server 172.20.36.222 81 {
    delay_loop 6                 
    lb_algo wrr                  
    lb_kind DR                   
    #persistence_timeout 50        
    protocol TCP               
    real_server 172.20.36.43 81 {
    weight 1               
    TCP_CHECK {            
       connect_timeout 10  
       retry 3             
       delay_before_retry 3
       connect_port 81     
       }
    }
     real_server 172.20.36.44 81 {   
     weight 1                  
     TCP_CHECK {               
       connect_timeout 10       
       retry 3              
       delay_before_retry 3       
       connect_port 81          
       }
     }
}

2)配置Backup

打开/etc/keepalived/keepalived.conf,修改为以下配置:

! Configuration File for keepalived
global_defs {
   router_id lvs02   
}
vrrp_instance VI_1 { 
    state BACKUP     
    interface ens33  
    virtual_router_id 100 
    priority 99           
    advert_int 1          
    authentication {      
        auth_type PASS    
        auth_pass 1111    
    }
    virtual_ipaddress {   
        172.20.36.222 
    }
}
virtual_server 172.20.36.222  81 {
    delay_loop 6
    lb_algo wrr 
    lb_kind DR  
    #persistence_timeout 50          
    protocol TCP             
    real_server 172.20.36.43  81 {      
    weight 1               
    TCP_CHECK {            
       connect_timeout 10  
       retry 3             
       delay_before_retry 3
       connect_port 81     
       }
    }
     real_server 172.20.36.44  81 {   
     weight 1               
     TCP_CHECK {
       connect_timeout 10    
       retry 3            
       delay_before_retry 3      
       connect_port 81        
       }
     }
}

3)Master和Backup的区别

在这里插入图片描述
配置说明:
==router_id ==设置当前节点的名称
==virtual_ipaddress == 设置了虚拟的IP地址172.20.36.100开放端口81,真实的两个LVS的IP地址为172.20.36.40172.20.36.41,LVS开放端口80
以上示例的配置采用DR负载均衡和wrr负载调度算法。

3.ipvs简单介绍
1)三种的ip负载方式:
  • VS/NAT (Virtual Server via Network Address Translation)
    也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
    可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈
  • VS/TUN(Virtual Server via IP Tunneling)
    也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
  • VS/DR(Virtual Server via Direct Routing)
    也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上,且真实服务器网络设备或设备别名不作 ARP 响应。
2)八种负载调度算法
  • 轮叫(Round Robin)
    调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  • 加权轮叫(Weighted Round Robin)
    调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • 最少链接(Least Connections)
    调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

  • 加权最少链接(Weighted Least Connections)
    在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • 基于局部性的最少链接(Locality-Based Least Connections)
    “基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。

  • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
    "带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

  • 目标地址散列(Destination Hashing)
    "目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  • 源地址散列(Source Hashing)
    "源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

三、启动LVS-Master和LVS-Backup上的ipvs服务和keepalived服务

1.ipvs启动

执行sudo lsmod |grep ip_vs查看ipvs是否已经启动,若没有什么结果则需要启动ipvs,分别在机器172.20.36.40172.20.36.41上执行启动命令启动ipvs,如下:
启动systemctl start ipvsadm.service
停止systemctl stop ipvsadm.service
重启systemctl restart ipvsadm.service
查看ipvs的状态systemctl status ipvsadm.service

在这里插入图片描述在这里插入图片描述
查看状态如下,说明ipvs已经启动。
遇到一个启动错误时的日志:
在这里插入图片描述
最后查询一圈使用ipvsadm --save > /etc/sysconfig/ipvsadm成功解决,启动成功:
在这里插入图片描述
在这里插入图片描述

2.keepalived启动

查看状态systemctl status keepalived
启动systemctl start keepalived
停止systemctl stop keepalived
重启systemctl restart keepalived
未执行启动前,查看状态:
在这里插入图片描述
执行启动命令后,查看状态:
在这里插入图片描述
keepalived的默认日志文件在/var/log/messages下,有问题可以根据日志描述解决。

四、安装和配置nginx节点

1.nginx安装及配置

详细请查看 nginx的源码编译和安装

2.配置nginx所有服务器的“路由”

根据上面描述,使用的虚拟IP为172.20.36.222,需要再真实的nginx服务器上设置虚拟ip、关闭“ARP查询”功能和设置回环ip,执行下面的脚本即可:

#!/bin/bash
VIP=172.20.36.222
case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

我手边两台nginx的真实ip是172.20.36.43:81172.20.36.44:81,需要在这两台机器上执行上面的脚本,执行完成后如下:
在这里插入图片描述
这一块在一开始测试的时候由于参考【参考链接】中的脚本,中间一行==/etc/rc.d/init.d/functions==似乎并没有用,并且会报错,最后经过测试就删除了这句。

五、测试

到此为止我们已经搭建好了基于lvs+keepalived+nginx的集群负载,我们做一些测试,验证一下几个点:
1)VIP漂移和高可用
2)nginx可用性检测

1.VIP漂移

VIP漂移指的是当ipvs的主节点出现故障的时候,ipvs的备用节点在配置的时间内完成主备切换,对用户不可感知,并以邮件的方式通知管理员修复出现的故障,keepalived的配置就是用来解决这个问题的。

1)ipvs主备节点无故障时:
A. 主节点红色框,可用真实nginx负载节点绿色框

在这里插入图片描述

B. 主节点的网卡信息,红色为虚拟IP

在这里插入图片描述

C. 备用节点的网卡信息,并无上图红色框的内容,说明此时的master节点正常

在这里插入图片描述

D. 数据访问也正常

在这里插入图片描述

2)ipvs主节点故障时,发生VIP漂移
A. 关闭主节点上的keepalived服务制造故障

在这里插入图片描述

B. 查看主备用节点的网卡

主节点网卡信息
在这里插入图片描述

备用节点网卡信息
在这里插入图片描述
从上面两张图看,说明已经发生了VIP漂移,并且访问也正常
在这里插入图片描述

2.nginx可用性

制造一个nginx节点异常,将nginx01节点网卡关闭。
在这里插入图片描述
直接访问正常,且返回的是节点2的ip和nginx名称
在这里插入图片描述
到此为止,lvs+nginx+keepalived的直连权重负载就配置完了。

六、番外篇

除了上面的配置之外,可以手动的去维护ipva集群信息,主要用于动态的负载一些配置。包括:
1)增删改ipvs虚拟服务地址
2)给虚拟服务地址增加新的nginx负载地址

1.添加ipvs集群服务

1)添加ipvs集群

查看 ipvsadm -ln,在服务器172.20.36.40上执行该命令,查看当前ipvs集群的状态,当前ipvs没有集群信息。如下:
在这里插入图片描述
执行ipvsadm -A -t 172.20.36.100:81 -s rr添加一个ipvs集群节点,但是报了错,如下:
在这里插入图片描述
排查了很久,最后发现是因为中间修改过LVS的配置,虽然重启了LVS,但是并没有重启keepalived。调用重启keepalive的重启命令后重新加载虚拟IP时成功了:
在这里插入图片描述
其中,红色是重启指令,绿色是已经配置的两个LVS的主备地址。

2)给集群服务中添加真实服务

上一步骤中我们已经添加了ipvaadm的集群,现在我们需要将两个LVS-主备真实IP添加到虚拟集群中去,使用指令
ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.40:80 -m -w 1添加LVS01,ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.41:80 -m -w 1添加LVS02,没有错误提示说明已经添加成功,查看如下:
在这里插入图片描述

参考链接:
ipvsadm命令
ipvsadm启动失败
DR模式下realserver无响应
ipvsadm的统计
自动运维ipvs

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章