主流的软件有LVS、keepalived、haproxy、nginx等linux
其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既能够认为是4层,也能够当作7层使用nginx
keepalived的负载均衡功能其实就是LVS算法
lvs这种4层的负载均衡是能够分发除80外的其余端口通讯的,好比MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种 vim
相比较来讲,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求后端
LVS是由国内的大牛张文嵩开发的,这款软件的流行度不亚于httpd,它是一款四层的负载均衡软件,针对tcp/ip作的转发和路由,稳定选哪一个和效率高。可是它已经好久没更新了,最新的只有基于linux2.6核的版本。bash
LVS架构中有一个核心的角色加分发器(Load Blancer),也叫调度器,是用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server)。服务器
LVS有三种常见的模式:NAT模式、DR模式、IP Tunel模式。网络
这种模式实现的原理是调度器把用户的情趣经过预设的IPtables规则转发给后端的真实服务器。其中调度有两个IP,一个是公网IP,另外一个是内网IP,而真实的服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,他会把用户的请求转发到真实服务器的内网IP上。这种模式的好处是节省公网IP,当时调度器会成为一个瓶颈。架构
这种模式须要有一个公共的IP配置在分发器和全部服务器上,咱们把它叫作vip 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包作一个加工,会把目标IP改成服务器的IP,这样数据包就到了服务器上 服务器接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部服务器上配置了这个vip,因此它会认为是它本身负载均衡
这种模式也须要有一个公共的IP配置在分发器和全部服务器上,也就是vip 和IP Tunnel不一样的是,它会把数据包的MAC地址修改成服务器的MAC地址 服务器接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部服务器上配置了这个vip,因此它会认为是它本身
经过预先设定好算法能够实现调度器把客户端发来的请求均衡的分发给后端的真实服务器
轮询 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地址,做为散列键从静态分配的散列表找出对应的服务器,若是这个服务器是可用的而且没有超载,九江请求发送到这个服务器,否知返回空。
根据请求的源IP地址做为散列键从静态分配的单列表中找出对应的服务器。
调度器须要有两个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访问两台服务器