lvs+ keepalived +nginx 构建高可用负载均衡集群

**他们负责什么工作?**
在LVS+Keepalived环境里面,lvs主要的工作是提供调度算法,把客户端请求按照需求调度在real服务器,keepalived主要的 
工作是提供lvs控制器的一个冗余,并且对real服务器做健康检查,发现不健康的real服务器,就把它从lvs集群中剔除,real 
服务器只负责提供服务。

#LVS 即 Linux 虚拟服务器
l 有三种转发规则
1) NAT:网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以 
访问位于公司内部的私有IP主机。简单理解:就是数据进出都通过 LVS,性能不是很好。

2) TUNL:简单理解:隧道,所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则 
调度器就会成为整个集群环境的瓶颈。由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。

3) DR:直接路由模式, 最高效的负载均衡规则
LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户 
端。与隧道模式不同的是,直接路由模式(DR模式要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后 
端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户 
端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的

**LVS多种调度算法**

1) 轮询调度(Round-Robin Scheduling)RR算法

2) 加权轮询调度(Weighted Round-Robin Scheduling)WRR算法

3) 最小连接调度(Least-Connection Scheduling)LC算法

4) 加权最小连接调度(Weighted Least-Connection Scheduling)WLC算法

5) 基于局部性的最少链接(Locality-Based Least Connections Scheduling)LBLC算法

6) 带 复 制 的 基 于 局 部 性 最 少 链 接 ( Locality-Based Least Connections with Replication 
Scheduling)LBLCR算法

7) 目标地址散列调度(Destination Hashing Scheduling)DH算法

8) 源地址散列调度(Source Hashing Scheduling)SH算法

9) 最短预期延时调度(Shortest Expected Delay Scheduling)SED算法

10) 不 排 队 调 度 ( Never Queue Scheduling )NQ算法
lvs的优点
抗负载能力强,因为 lvs 工作方式的逻辑是非常之简单,而且工作在网络 4 层仅做请求分发之用,没有流量,所以在效率上 
基本不需要太过考虑。
有完整的双机热备方案,当节点出现故障时,lvs 会自动判别,所以系统整体是非常稳定的。
使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
很好的可伸缩性(Scalability)
很好的可靠性(Reliability)

很好的可管理性(Manageability)
基本上能支持所有应用,因为 lvs 工作在 4 层,所以它可以对几乎所有应用做负载均衡,包括 http、数据库、聊天室等等。

什么是keepalived
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说
第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉
主要用作RealServer的健康状态检查以及前段负载均衡主机和BackUP主机之间 failover的实现
但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉 之后,自动将VIP给你切换到备用机

#注意:一定先关闭防火墙测试,先能保证测试通过。
systemctl stop firewalld     systemctl disable firewalld
setenforce 0 临时关闭selinux   
需要重启sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/selinux/config

如果服务器一定要用防火墙,那么在测试无误后,通过命令运行VRRP路由冗余协议。
允许组播,两台设备上都需要执行 调度服务器
iptables -A INPUT -d vip -j ACCEPT
或修改:vim /etc/sysconfig/iptables
适当位置添加行:
-A INPUT -d vip -j ACCEPT

两台WEB 服务器安装nginx
安装nginxyum源
vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install -y nginx
vim /usr/share/nginx/html/index.html  修改一下内容 仅测试用,自定义根目录自行处理
启动nginx各自访问看看能不能打开
 
在所有real server上添加下面脚本,名执行# 配置转发
vim    /etc/init.d/realserver
#!/bin/bash
#description:start realserver
vip=122.225.32.157 (注意修改)
source /etc/rc.d/init.d/functions
case $1 in
start)
        echo "Start Realserver"
        /sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
        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
;;
stop)
        echo "Stop Realserver"
        /sbin/ifconfig lo:0 down
        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 "Usage: $0 (start | stop)"
exit 1
esac
执行脚本以后,使用ip add命令查看lo接口是否添加了虚拟ip地址。
两台Lvs+keepalived 
安装:yum  install keepalived -y
master配置:
global_defs {
#  notification_email {
#        edisonchou@hotmail.com
#  }
#  notification_email_from sns-lvs@gmail.com
#  smtp_server 192.168.80.1
#  smtp_connection_timeout 30
router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens33  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    #lvs_sync_daemon_interface ens33 #监控心跳接口    
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.200  #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
    }
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.0.200 80 {
    delay_loop 6 # 设置健康检查时间,单位是秒
    lb_algo rr # 设置负载调度的算法为rr
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0 #(同一客户端访问服务器的任何服务都会被转发到同一real server)测试用这个
   #persistence_timeout 60 #(同一个client的请求信息记录到lvs的hash表里,保存时间使用persistence_timeout控 
    制)
    protocol TCP
    real_server 192.168.0.104 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.0.105 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

接着在两台lvs上安装 LVS的管理工具:ipvsadm    yum install -y ipvsadm
修改keepalived启动内容:vim /usr/lib/systemd/system/keepalived.service
#KillMode=process
#表示只杀掉程序的主进程,打开的子进程不管。我们keepalived肯定要全部杀掉。所以注释掉这一行    
分别启动keeplives
主上ip  add查看网卡内容

P(_Z~<code>VG3SFK_G[</code>GQ54K}E.png

ipvsadm -ln 查看lvs状态

)`LFUNM9RJUTZL5Z_X~(851.png

1.打开不同浏览器访问vip观察,停止其中一台web测试,看有没有负载均衡
2.关闭masterkeepalived  观察backup有没有接管vip,如果接管则成功,不行查看日志/var/log/messages

如果出现脑裂(就是两台lvs都占用了vip),可能是配置文件错误,防火墙问题