简介

负载均衡的原理:https://mp.weixin.qq.com/s/LRUaXCWGUQyakBWQn693ew
LVS原理详解(3种工作方式8种调度算法):https://blog.csdn.net/zwz1984/article/details/45194377

实现负载均衡有很多种方式,土豪直接F5,性能最好,价格最贵;
没钱也可以使用Apache,Nginx 工作在网络的第四层,虽然性能一般,但是很灵活,比如可以将80端口映射到真实服务器的8080端口。
还有一种选择LVS ,它工作在网络的第三层,性能较好,非常稳定,但是它不能实现端口的重新映射,因为在网络的第三层,并不清楚端口的信息(转发的端口要和后端代理的端口一样)。


ipvsadm命令选项解释

-A --add-service                         在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。   
-E --edit-service                        编辑内核虚拟服务器表中的一条虚拟服务器记录。   
-D --delete-service                      删除内核虚拟服务器表中的一条虚拟服务器记录。   
-C --clear                               清除内核虚拟服务器表中的所有记录。   
-R --restore                             恢复虚拟服务器规则   
-S --save                                保存虚拟服务器规则,输出为-R 选项可读的格式   
-a --add-server                          在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器   
-e --edit-server                         编辑一条虚拟服务器记录中的某条真实服务器记录   
-d --delete-server                       删除一条虚拟服务器记录中的某条真实服务器记录   
-L|-l --list                             显示内核虚拟服务器表   
-Z --zero                                虚拟服务表计数器清零(清空当前的连接数量等)   
--set tcp tcpfin udp                     设置连接超时值   
--start-daemon                           启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived的VRRP 功能。   
--stop-daemon                            停止同步守护进程   
-h --help                                显示帮助信息   
其他的选项:   
-t --tcp-service service-address         说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]   
-u --udp-service service-address         说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]   
-f --fwmark-service fwmark               说明是经过iptables 标记过的服务类型。   
-s --scheduler scheduler                 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,   默认的调度算法是: wlc.   
-p --persistent [timeout]                持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。   
-M --netmask                             netmask persistent granularity mask   
-r --real-server server-address          真实的服务器[Real-Server:port]   
-g --gatewaying                          指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)   
-i --ipip                                指定LVS 的工作模式为隧道模式   
-m --masquerading                        指定LVS 的工作模式为NAT 模式   
-w --weight weight                       真实服务器的权值   
--mcast-interface interface              指定组播的同步接口   
-c --connection                          显示LVS 目前的连接 如:ipvsadm -L -c   
--timeout                                显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout   
--daemon                                 显示同步守护进程状态   
--stats                                  显示统计信息   
--rate                                   显示速率信息   
--sort                                   对虚拟服务器和真实服务器排序输出   
--numeric -n                             输出IP 地址和端口的数字形式


3种工作模式和8种调度算法

3种模式

NAT模式

原理简述

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

    1. 客户端请求数据,目标IP为VIP
    1. 请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
    1. 数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
    1. 收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
    1. 客户端收到的就只能看到VIP\DIP信息。

NAT模式优缺点:

  • 1、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点
  • 2、只需要在LB上配置一个公网IP地址就可以了。
  • 3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
  • 4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。

DR模式(直接路由模式)

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

DR模式原理过程简述:

VS/DR模式的工作流程图如上图所示,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

DR模式小结

  • 1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
  • 2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
  • 3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
  • 4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
  • 5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
  • 6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

TUN模式

virtual server via ip tunneling模式:采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。

VS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。

原理简述

  • 1)客户请求数据包,目标地址VIP发送到LB上。
  • 2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
  • 3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
  • 4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)

官方三种模式比较总结

|---|---|---|---|
|工作模式|VS/NAT|VS/TUN|VS/DR|
|Real server(节点服务器)|Config dr gw|Tunneling|Non-arp device/tie vip|
|Server Network|Private|LAN/WAN|LAN|
|Server number(节点数量)|Low 10-20|High 100|High 100|
|Real server gateway|Load balance|Own router|Own router|
|优点|地址和端口转换|Wan环境加密数据|性能最高|
|缺点|效率低|需要隧道支持|不能跨域LAN|


10种调度算法

Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:

固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,sed,nq,lblc,lblcr

|---|---|---|
|算法|简单说明|详细说明|
|rr|轮询|它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况|
|wrr|加权轮询|它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。|
|wlc|加权最少连接数|假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS|
|dh|目标地址hash|(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS|
|sh|源地址hash|(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS|
|lc|最少连接数|(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS。|
|sed|最少期望延迟|最少期望延迟|
|nq|从不排队调度方法|从不排队调度方法|
|lblc|基于本地的最少连接|基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。|
|lblcr|带复制的基于本地的最少连接|带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,以下简称为LBLCR)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。|

LVS调度算法的生产环境选型:

1、一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:

  • a.基本轮询调度rr
  • b.加权最小连接调度wlc
  • c.加权轮询调度wrc

2、基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache
3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。

参考:http://www.linuxvirtualserver.org/zh/lvs4.html



DR模式

|---|---|
|192.168.10.5(VIP)|绑定在DS上|
|192.168.10.34(DS)|lvs所在主机|
|192.168.10.35(RS1)|网站80|
|192.168.10.38(RS2)|网站80|

在Load Balancer(DS)上执行

# 在DS 192.168.10.34 上执行
#关闭selinux
vim /etc/sysconfig/selinux

# 配置虚拟IP
ifconfig eth0 192.168.10.34/24
ifconfig eth0:0 192.168.10.5 netmask 255.255.255.255  #虚拟IP 192.168.10.5,暴露给外部
# netmask是255.255.255.255,广播。

# 安装ipvsadm
yum -y install popt libnl popt-devel libnl-devel popt-static
yum -y install ipvsadm
ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
lsmod | grep ip_vs


# 配置ipvsadm
ipvsadm -C
ipvsadm --set 30 5 60
#vip on load balancer
#ipvsadm -A -t [VIP]:80 -s wrr -p 20
ipvsadm -A -t 192.168.10.5:80 -s rr -p 5
ipvsadm -a -t 192.168.10.5:80 -r 192.168.10.35:80 -g -w 3
ipvsadm -a -t 192.168.10.5:80 -r 192.168.10.38:80 -g -w 1
# 上一步不能同一个ip的不同端口,会报错: No such device or address(lvs不能重新映射端口)

查看请求转发情况:ipvsadm -lnc | grep [VIP]
查看日志:tail -f /var/log/messages
保存规则到文件:ipvsadm --save 或 service ipvsadm save

通过keepalived配置DS高可用

# 在Master上
yum install keepalived -y

cat >/etc/keepalived/keepalived.conf  <<EOF
global_defs {
   notification_email {
         842632422@qq.com
   } 
   notification_email_from 842632422@qq.com
   smtp_server smtp.qq.com
   smtp_connection_timeout 30
   router_id LVS_DEVEL
   # 设置lvs的id,在一个网络内应该是唯一的
}

vrrp_instance VI_1 {
    state MASTER
    #指定Keepalived的角色,MASTER为主,BACKUP为备
    interface eth0
    #指定网卡
    virtual_router_id 91
    #虚拟路由编号,主备要一致
    priority 100
    #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1
    #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 978dfhshfkhag
    }
    virtual_ipaddress {
        192.168.10.5
        #定义虚拟IP(VIP)为192.168.10.5,可多设,每行一个
    }
}


# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.10.5 80 {
    delay_loop 6
    # 设置健康检查时间,单位是秒
    lb_algo wrr
    # 设置负载调度的算法为wlc
    lb_kind DR
    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.10.35 80 {
    # 指定real server1的IP地址
        weight 3
        # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.10.38 80 {
    # 指定real server2的IP地址
        weight 3
        # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}
EOF

systemctl start keepalived
systemctl enable keepalived

# 在BACKUP上
yum install keepalived -y

cat >/etc/keepalived/keepalived.conf  <<EOF
global_defs {
   notification_email {
         842632422@qq.com
   } 
   notification_email_from 842632422@qq.com
   smtp_server smtp.qq.com
   smtp_connection_timeout 30
   router_id LVS_DEVEL
   # 设置lvs的id,在一个网络内应该是唯一的
}

vrrp_instance VI_1 {
    state BACKUP
    #指定Keepalived的角色,MASTER为主,BACKUP为备
    interface eth0
    #指定网卡
    virtual_router_id 91
    #虚拟路由编号,主备要一致
    priority 100
    #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1
    #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 978dfhshfkhag
    }
    virtual_ipaddress {
        192.168.10.5
        #定义虚拟IP(VIP)为192.168.10.5,可多设,每行一个
    }
}


# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.10.5 80 {
    delay_loop 6
    # 设置健康检查时间,单位是秒
    lb_algo wrr
    # 设置负载调度的算法为wlc
    lb_kind DR
    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.10.35 80 {
    # 指定real server1的IP地址
        weight 3
        # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.10.38 80 {
    # 指定real server2的IP地址
        weight 3
        # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}
EOF

systemctl start keepalived
systemctl enable keepalived

报错:(VI_1): received an invalid passwd!
解决:改一下virtual_router_id的值就行,都改一样的。



在Real Server(RS)上执行

Linux

# 在RS1、RS2上执行
ifconfig lo:0 192.168.10.5 netmask 255.255.255.255
# netmask是255.255.255.255,广播。

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1             #打开路由转发
net.ipv4.conf.all.arp_ignore = 1    #只回答目的IP为本网口IP地址的arp包的请求
net.ipv4.conf.all.arp_announce = 2  #对查询目标使用最适当的本机地址
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

sysctl -p

【其他方式
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
或
sysctl -w net.ipv4.conf.all.arp_announce=2
】

Windows

管理员身份运行cmd后,在cmd命令窗口中执行:hdwwiz
mark
mark
mark
mark
和Linux中的lo:0一样,将IP地址设置为VIP,将掩码设置为255.255.255.255,其余留空即可。

修改客户端网卡接口、环回接口连接模式
代码保存为bat执行,或直接在CMD中执行(双引号中是你的网卡名称,所有网卡都要)

@echo off
netsh interface ipv4 set interface "lo" weakhostreceive=enabled
netsh interface ipv4 set interface "lo" weakhostsend=enabled
netsh interface ipv4 set interface "本地连线2" weakhostreceive=enabled
netsh interface ipv4 set interface "本地连线2" weakhostsend=enabled
pause

上面的四条命令一定要输入,因为windows server中,网卡的stronghost默认处于启用状态,这个设置可以防止跨接口转发数据包,这就表明:来自一个网络适配器的请求不会被环回适配器处理,因为这个请求来自于不同的网络适配器。为了将环回适配器从stronghost切换为weakhost,需要运行以上四条命令,要不然TCP的状态会一直处于SYN_RECV 状态。

参考:
https://zhangge.net/3592.html
http://www.cnblogs.com/xuesong/archive/2013/11/17/3428053.html
https://blog.csdn.net/yuchou123456789/article/details/7287870


参考资料:

https://www.cnblogs.com/gtarcoder/p/6012117.html
LVS官网提供的4篇文章:
http://www.linuxvirtualserver.org/zh/lvs1.html
http://www.linuxvirtualserver.org/zh/lvs2.html
http://www.linuxvirtualserver.org/zh/lvs3.html
http://www.linuxvirtualserver.org/zh/lvs4.html
https://www.linuxzen.com/lvskeepalivedshi-xian-gao-ke-yong-qun-ji-pei-zhi-xiang-jie.html
https://mp.weixin.qq.com/s/jtkxe-Vc8DFBtSM7R_dnNA
图形界面安装法(piranha包已失效):http://blog.jobbole.com/87503/
配置参考:
http://blog.51cto.com/qchanblog/1896390
https://blog.csdn.net/tengyuantuohai/article/details/19639671
http://www.cnblogs.com/lixigang/p/5371816.html
http://www.cnblogs.com/lixigang/p/5371815.html



其他

开启转发,会影响Docker等转发

vim /usr/lib/sysctl.d/00-system.conf

添加如下代码:
    net.ipv4.ip_forward=1

重启network服务
# systemctl restart network

KVM部署LVS集群故障(问题处理)

http://www.cnblogs.com/276815076/p/5887959.html



性能提升

突破LVS瓶颈,LVS Cluster部署(OSPF + LVS):https://my.oschina.net/lxcong/blog/143904


文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
负载均衡 LVS
喜欢就支持一下吧