LVS负载均衡
     分类:负载均衡     有: 0 条评论

LVS负载均衡

     分类:负载均衡     有: 0 条评论

简介

负载均衡的原理: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)然后发送回给客户端。

NAT模式优缺点:


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模式小结


TUN模式

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

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

原理简述


官方三种模式比较总结

工作模式VS/NATVS/TUNVS/DR
Real server(节点服务器)Config dr gwTunnelingNon-arp device/tie vip
Server NetworkPrivateLAN/WANLAN
Server number(节点数量)Low 10-20High 100High 100
Real server gatewayLoad balanceOwn routerOwn 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调度算法为:

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


(●゚ω゚●)