LVS+Keepalived 新玩法:负载均衡层与真实服务器层融合

LVS+Keepalived 新玩法:负载均衡层与真实服务器层融合

拓扑:

 

LVS+Keepalived 新玩法:负载均衡层与真实服务器层融合_第1张图片

目的:充分利用硬件资源,LVS_DR服务器利用的资源相对低,通过keepalived配合,实现备用的LVS_DR成为web服务器的负载均衡群集.。
 

原理:
四台服务器上安装keepalived和lvs,开放80端口提供web服务,通过keepalived竞选master接管VIP并开启LVS功能,为web服务器负载分发,同时自己也是web服务器,权重低些。
当master挂掉后,后面web服务器通过keepalived竞选新的master,并开启LVS功能。

 

注意:
我的vip和rip是不同网段的,主要是想实现一个公网ip组lvs_dr模式。
其实也可以改成同一网段,把VIP改成192.168.1.X
realserver回应出去时的源ip是VIP。
这里我在路由器上增加了一条到vip的静态路由:

参考文章:http://lustlost.blog.51cto.com/2600869/929915

软件:
ipvsadm-1.24.tar.gz
keepalived-1.1.19.tar.gz

安装keepalived 和ipvs
网上大把

需要的文件和脚本:
/etc/keepalived/keepalived.conf 默认的keepalived启动时的配置文件
/etc/keepalived/lvs.conf 当成为master时加入lvs功能的配置文件
/opt/shell/lvs_rsrv.sh  成为realserver用的脚本,

四台机器都安装keepalived和lvs,放置脚本和配置文件,
每台机修改的只是keepalived.conf文件和lvs.conf的少许部分!
 

先把需要的脚本文件放到/opt/shell下

  
  
  
  
  1. mkdir -p /opt/shell  

/opt/shell/lvs_rsrv.sh 借用netseek大大的脚本,内容如下:

  
  
  
  
  1. #!/bin/bash 
  2. # Written by NetSeek 
  3. # description: Config realserver lo and apply noarp 
  4. eth="lo:0" 
  5. #VIP 
  6. WEB_VIP=200.0.0.100 
  7. . /etc/rc.d/init.d/functions 
  8. case "$1" in 
  9. start) 
  10.        ifconfig $eth $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP 
  11.        /sbin/route add -host $WEB_VIP dev $eth 
  12.        echo "1" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_ignore 
  13.        echo "2" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_announce 
  14.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  15.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 
  16.        sysctl -p >/dev/null 2>&1 
  17.        echo "RealServer Start OK" 
  18.        ;; 
  19. stop) 
  20.        ifconfig $eth down 
  21.        route del $WEB_VIP >/dev/null 2>&1 
  22.        echo "0" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_ignore 
  23.        echo "0" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_announce 
  24.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 
  25.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 
  26.        echo "RealServer Stoped" 
  27.        ;; 
  28. status) 
  29.         # Status of LVS-DR real server. 
  30.         islothere=`/sbin/ifconfig $eth | grep $WEB_VIP` 
  31.         isrothere=`netstat -rn | grep "$eth" | grep $WEB_VIP` 
  32.         if [ ! "$islothere" -o ! "isrothere" ];then 
  33.             echo "LVS-DR real server Stopped." 
  34.         else 
  35.             echo "LVS-DR Running." 
  36.         fi 
  37. ;; 
  38. *) 
  39.         # Invalid entry. 
  40.         echo "$0: Usage: $0 {start|status|stop}" 
  41. ;; 
  42. esac 

记得给运行权限:

  
  
  
  
  1. chmod +x /opt/shell/* 

开始配置keepalived:
默认启动的/etc/keepalived/keepalived.conf文件如下:

  
  
  
  
  1. # ! Configuration File for keepalived 
  2. global_defs { 
  3.      router_id LVS_1    #运行keepalived机器的一个标识 
  4.      } 
  5.  
  6. #VIP 
  7. vrrp_instance VI_1 { 
  8.      state MASTER         #指定刚启动状态,MASTER或BACKUP,全部节点一样就行
  9.      interface eth0         #实例绑定的网卡 
  10.      virtual_router_id 51   #标记(0...255)相同实例要相同 
  11.      priority 100           #优先级 
  12.      advert_int 1           #检查间隔,默认1s 
  13. #     nopreempt              #设抢占 
  14.      authentication {       #认证 
  15.      auth_type PASS         #认证的方式,支持PASS和AH 
  16.      auth_pass 1111         #认证的密码 
  17.      } 
  18.      virtual_ipaddress {    #指定漂移地址(VIP) 
  19.     200.0.0.100 
  20.      } 
  21.      track_interface { 
  22.      eth0                 #跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态 
  23.      } 
  24. #开启lvs功能就靠以下的命令 
  25. #成为master后执行:关闭realserver的设置,在keepalived.conf文件中追加lvs的设置,重新载入文件 
  26. notify_master "/opt/shell/lvs_dr_rsrv.sh stop;/bin/cat /etc/keepalived/lvs.conf >>/etc/keepalived/keepalived.conf;/sbin/service keepalived reload" 
  27. #成为backup后执行:开启realserver的设置,在keepalived.conf文件里找lvs的设置,找的到就删除lvs配置,重新载入配置,找不到就不重载 
  28. notify_backup "/opt/shell/lvs_dr_rsrv.sh start;/bin/grep '^#lvs_set' /etc/keepalived/keepalived.conf && /bin/sed -i '/^#lvs_set/,$d' /etc/keepalived/keepalived.conf && /sbin/service keepalived reload" 
  29. #关闭keepalived时执行:删除keepalived.conf文件的lvs配置,关闭realserver的设置,这里也可以自定为 start,关闭keepalived也为realserver 
  30. notify_stop "/opt/shell/lvs_dr_rsrv.sh stop;/bin/sed -i '/^#lvs_set/,$d' /etc/keepalived/keepalived.conf" 
  31. #故障时的执行的命令(例如eth0 down掉) 
  32. notify_fault "/sbin/service keepalived stop" 

LVS功能的/etc/keepalived/lvs.conf配置文件如下:

  
  
  
  
  1. #lvs_set             #这句是标记,不要删 
  2. virtual_server 200.0.0.100 80 {  #设置VIP port 
  3.      delay_loop 2           #每个2秒检查一次real_server状态 
  4.      lb_algo wrr            #lvs调度算法这里使用加权轮询 有:rr|wrr|lc|wlc|lblc|sh|dh 
  5.      lb_kind DR             #负载均衡转发规则NAT|DR|TUN 
  6. #     persistence_timeout 60 #会话保持时间 
  7.      protocol TCP           #使用协议TCP或者UDP 
  8.  
  9.      real_server 192.168.1.1 80 { 
  10.      weight 1  #权重(这里是本机,同时开启LVS功能,权重设的小点,可以设为0,完全不对本机分发(当其他web出现问题也不启用) 
  11.      TCP_CHECK {            #tcp健康检查 
  12.      connect_timeout 10     #连接超时时间 
  13.      nb_get_retry 3         #重连次数 
  14.      delay_before_retry 3   #重连间隔时间 
  15.      connect_port 80        #健康检查端口 
  16.             } 
  17.     } 
  18.      real_server 192.168.1.2 80 { 
  19.      weight 100               #权重 
  20.      TCP_CHECK { 
  21.      connect_timeout 10 
  22.      nb_get_retry 3 
  23.      delay_before_retry 3 
  24.      connect_port 80 
  25.             } 
  26.         }      
  27.      real_server 192.168.1.10 80 { 
  28.      weight 100               #权重 
  29.      TCP_CHECK { 
  30.      connect_timeout 10 
  31.      nb_get_retry 3 
  32.      delay_before_retry 3 
  33.      connect_port 80 
  34.             } 
  35.     } 
  36.      real_server 192.168.1.11 80 { 
  37.      weight 100               #权重 
  38.      TCP_CHECK { 
  39.      connect_timeout 10 
  40.      nb_get_retry 3 
  41.      delay_before_retry 3 
  42.      connect_port 80 
  43.             } 
  44.     } 

文件都设置好了复制到每台机器上面

  
  
  
  
  1. scp /etc/keepalived/*.conf 192.168.1.2:/etc/keepalived/ 
  2. scp -r shell 192.168.1.2:/opt/ 
  3. ... 

Server 2改的地方
/etc/keepalived/keepalived.conf文件:

  
  
  
  
  1. router_id LVS_192.168.1.2   #运行keepalived机器的一个标识 
  2. priority 99      #优先级低点 

/etc/keepalived/lvs.conf文件:

  
  
  
  
  1.      real_server 192.168.1.1 80 { 
  2.      weight 100 #修改server1的权重 
  3. ... 
  4.      real_server 192.168.1.2 80 {  # 
  5.      weight 1  #把自己的权重改小 
  6. ... 

Server3 和server4修改的地方与server2雷同,都是修改标示,优先级和本机web服务的权重

快速修改命令:,yx为优先级的变量。

  
  
  
  
  1. yx=99 
  2. ip=`ifconfig eth0 | awk -F"[ :]+"  'NR==2{print $4}'` 
  3. sed -i "/router_id LVS_1/{s/1/$ip/}" /etc/keepalived/keepalived.conf 
  4. sed -i "/priority 100/{s/100/$yx/}" /etc/keepalived/keepalived.conf 
  5. sed -i 's/weight 1.*/weight 100/' /etc/keepalived/lvs.conf 
  6. sed -i "/$ip/{N;s/weight 100/weight 1/}" /etc/keepalived/lvs.conf 

启动你的web服务后再启动keepalived

  
  
  
  
  1. nginx 
  2. service keepalived start 

 

开始测试:

在server1上启动keepalived,查看/var/log/message日志。

接上:

在路由器查看VIP的arp对应为server1的网卡mac

查看 server1的ip地址情况:mac地址对应

  
  
  
  
  1. ip addr

查看lvs功能:

启动server2的keepalived,查看/var/log/message日志:

查看ip地址,lo:0口增加的vip

浏览测试:
客户机地址为100.0.0.1/24 默认网关为100.0.0.254
使用elinks http://200.0.0.100/命令

切换测试:关闭server1的keepalived和nginx进程

  
  
  
  
  1. killall nginx 
  2. killall keepalived

看server2接管过程:cat /var/log/message

查看lvs功能是否开启:

查看路由器VIP对应的mac地址,与server2的网卡地址一样。

客户机继续浏览到页面,并与VIP通信。

抢占测试:(如果不想抢占只需在keepalived.cof文件#nopreempt  注释去掉)
这时重新启动server1进程,但不启动nginx:

  
  
  
  
  1. service keepalived start 


抢占过程如下:启动keepalived 服务,读入没有lvs功能的配置文件,抢占master,成为mastter把lvs功能的配置加入到keepalived.conf文件里,重新载入,开启lvs功能。
查看server1的日志:

查看lvs功能:

查看路由VIP的mac地址:

查看server1的地址:

开启nginx再次查看lvs:

查看server2是否降为backup状态并成为realserver

查看是否成为realserver

可以看到,54秒时server1抢占为master,server2在54一秒内就降为backup状态变成realserver,55秒时server1重新载入带有lvs功能的配置文件并开启

实验结束----------

结语:
整个群集里,如果负载LVS的master挂掉,就会有机器会成为master,接管LVS任务,哪个web服务出现问题,LVS都能自动检测,并添加删除。做到超高可用,理论上也适合其他服务.


提示:

keepalived.conf文件这一句,
把里面的stop修改成start,即关闭keepalived时也成为realserver,方便测试各节点切换。

  
  
  
  
  1. notify_stop "/opt/shell/lvs_dr_rsrv.sh stop;/bin/sed -i '/^#lvs_set/,$d' /etc/keepalived/keepalived.conf" 

 

你可能感兴趣的:(LVS,keepalived,群集)