负载均衡集群介绍
主流的软件有LVS、keepalived、haproxy、nginx等
其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用
keepalived的负载均衡功能其实就是LVS
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求
LVS介绍
LVS是由国内的大牛张文嵩开发的,这款软件的流行度不亚于httpd,它是一款四层的负载均衡软件,针对tcp/ip做的转发和路由,稳定选哪个和效率高。但是它已经很久没更新了,最新的只有基于linux2.6核的版本。
LVS架构中有一个核心的角色加分发器(Load Blancer),也叫调度器,是用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server)。
LVS有三种常见的模式:NAT模式、DR模式、IP Tunel模式。
NAT 模式
这种模式实现的原理是调度器把用户的情趣通过预设的IPtables规则转发给后端的真实服务器。其中调度有两个IP,一个是公网IP,另一个是内网IP,而真实的服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,他会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,当时调度器会成为一个瓶颈。
IP unnel模式
这种模式需要有一个公共的IP配置在分发器和所有服务器上,我们把它叫做vip 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为服务器的IP,这样数据包就到了服务器上 服务器接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有服务器上配置了这个vip,所以它会认为是它自己
DR模式
这种模式也需要有一个公共的IP配置在分发器和所有服务器上,也就是vip 和IP Tunnel不同的是,它会把数据包的MAC地址修改为服务器的MAC地址 服务器接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有服务器上配置了这个vip,所以它会认为是它自己
LVS调度算法
通过预先设定好算法可以实现调度器把客户端发来的请求均衡的分发给后端的真实服务器
轮询 Round-Robin rr
按顺序把请求一次发送给后端的服务器,不管后端服务器的处理速度和响应时间,如果后端服务器的性能不一致时,这种调度算法就会不合适。
加权轮询 Weight Round-Robin wrr
比上一种算法多了一个权重设置,权重越高的服务器被分配的请求越多,这样的话,后端服务器性能不一致时,就会给配置低的服务器设置比较小的权重。
最小连接 Least-Connection lc
根据各个这是服务器上的里阿尼额数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样吧新的请求分配到空闲服务器上才合理。
加权最小连接 Weight Least-Connection wlc
在最小连接的算法上加一个权重设置。
基于局部性的最小连接 Locality-Based Least Connections lblc
针对请求报文的目标ip地址的负载均衡调度,目前用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基本皮平衡的情况下,将相同目标IP地址的请求调度到同一台服务器,提高每台服务器的访问局部性和主存Cache命中率。
带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr
针对目标IP地址的负载均衡,要维护从一个目标IP地址到一组服务器的映射,先根据请求的目标IP地址找出该目标IP地址对应的服务器组,按照“最小连接”原则熊该服务器组中选出一台服务器,若服务器没有超载,就会把请求发送到这个服务器;如果服务器超载,就会按照“最小连接”从整个集群里选出一台服务器,将该服务器加入到服务器组里面去,再把请求发送到这个服务器。同时,当这个服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,降低复制的程度。
目标地址散列调度 Destination Hashing dh
这是一种静态映射算法,这个算法也是针对IP地址的负载均衡的,通过一个散列函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键从静态分配的散列表找出对应的服务器,如果这个服务器是可用的并且没有超载,九江请求发送到这个服务器,否知返回空。
源地址散列调度 Source Hashing sh
根据请求的源IP地址作为散列键从静态分配的单列表中找出对应的服务器。
NAT模式搭建
调度器需要有两个IP,一个是公网IP,一个是内网IP,真实服务器只需要内网IP。
搭建这个架构需要三台机器,一台作为调度器,另外两台为服务器
调度器内网IP192.168.42.128和公网IP192.168.241.128
真实服务器1内网IP192.168.42.129
真实服务器2内网IP192.168.42.130
把三台服务器都使用防火墙netfilter,iptables规则清空,命令为:
# iptables -F; iptables -t nat -F; service iptables save
调度器上安装LVS核心工具 ipvsadm
# yum install -y ipvsadm
调度器上编写一个脚本
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash # director 服务器上开启路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward # 关闭icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 注意区分网卡名字, echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects # director 设置nat防火墙 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -j MASQUERADE # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.241.128:80 -s wlc -p 3 $IPVSADM -a -t 192.168.241.128:80 -r 192.168.42.129:80 -m -w 1 $IPVSADM -a -t 192.168.241.128:80 -r 192.168.42.130:80 -m -w 1
两台真实服务器上都安装Nginx
分别给两台真实服务器设置主页
然后在调度器里用curl访问两台服务器