设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 21151|回复: 8

[lvs] LVS+Keepalived 新玩法:负载均衡层与真实服务器层融合 [复制链接]

Rank: 8Rank: 8

签到
118
注册时间
2012-8-8
最后登录
2013-11-29
在线时间
133 小时
阅读权限
90
积分
11998
帖子
18
主题
3
精华
0
UID
34619
发表于 2012-9-6 21:18:42 |显示全部楼层
本帖最后由 Xzr_zzzzzzzz 于 2012-9-6 21:24 编辑

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

拓扑:


目的:充分利用硬件资源,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.     #
  13.            echo "1" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_ignore
  14.            echo "2" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_announce
  15.            echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  16.            echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  17.            sysctl -p >/dev/null 2>&1
  18.            echo "RealServer Start OK"
  19.            ;;
  20.     stop)
  21.            ifconfig $eth down
  22.            route del $WEB_VIP >/dev/null 2>&1
  23.            echo "0" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_ignore
  24.            echo "0" >/proc/sys/net/ipv4/conf/${eth%%:0}/arp_announce
  25.            echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  26.            echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  27.            echo "RealServer Stoped"
  28.            ;;
  29.     status)
  30.             # Status of LVS-DR real server.
  31.             islothere=`/sbin/ifconfig $eth | grep $WEB_VIP`
  32.             isrothere=`netstat -rn | grep "$eth" | grep $WEB_VIP`
  33.             if [ ! "$islothere" -o ! "isrothere" ];then
  34.                 echo "LVS-DR real server Stopped."
  35.             else
  36.                 echo "LVS-DR Running."
  37.             fi
  38.     ;;
  39.     *)
  40.             # Invalid entry.
  41.             echo "$0: Usage: $0 {start|status|stop}"
  42.     ;;
  43.     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"
  33.     }
复制代码
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.         }
  45.     }
复制代码
文件都设置好了复制到每台机器上面
  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,查看日志。
  1. tail -f /var/log/message
复制代码


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

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

查看lvs功能:ipvsadm

启动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文件这一句,作用是keepalived关闭时执行的命令。

  1. notify_stop "/opt/shell/lvs_dr_rsrv.sh stop;/bin/sed -i '/^#lvs_set/,$d' /etc/keepalived/keepalived.conf"
复制代码
把里面的stop修改成start,即关闭keepalived时也成为realserver,方便测试各节点切换。


~~怎么这个帖子可以编辑呢

论坛元老

小运维——知我罪我,其惟UNIX-like

Rank: 8Rank: 8

注册时间
2010-11-12
最后登录
2016-8-4
在线时间
1122 小时
阅读权限
90
积分
91360
帖子
477
主题
21
精华
0
UID
11131
发表于 2012-9-7 09:38:35 |显示全部楼层
本帖最后由 lnfsddy 于 2012-9-7 09:40 编辑

这样搞在你网络不稳定时不会发生脑裂?
就这问题讨论你这都是单点(网卡与switch)
天道酬勤——UNIX真美!GNU/Linux更美!
子曰:君子务本,本立而道生!

使用道具 举报

Rank: 8Rank: 8

注册时间
2012-8-8
最后登录
2013-11-29
在线时间
133 小时
阅读权限
90
积分
11998
帖子
18
主题
3
精华
0
UID
34619
发表于 2012-9-7 15:48:21 |显示全部楼层
本帖最后由 Xzr_zzzzzzzz 于 2012-9-7 15:53 编辑

貌似keepaived 不会发生脑裂,参考网上keepalived的文章,大多都是使用单网卡的配置的,真实环境我就不清楚了,我还是菜鸟一个,望告知~,如果网络不稳定到各个备用节点都收不到master的组播包,那web服务也提供不了吧~

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-2-22
最后登录
2015-1-30
在线时间
132 小时
阅读权限
90
积分
31714
帖子
72
主题
2
精华
0
UID
12113
发表于 2012-9-7 17:28:52 |显示全部楼层
我也实现过楼主类似的功能

使用道具 举报

Rank: 8Rank: 8

注册时间
2012-8-8
最后登录
2013-11-29
在线时间
133 小时
阅读权限
90
积分
11998
帖子
18
主题
3
精华
0
UID
34619
发表于 2012-9-7 22:34:16 |显示全部楼层
看看我的201 发表于 2012-9-7 17:28
我也实现过楼主类似的功能

分享下思路嘛~~

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-2-22
最后登录
2015-1-30
在线时间
132 小时
阅读权限
90
积分
31714
帖子
72
主题
2
精华
0
UID
12113
发表于 2012-9-10 15:09:50 |显示全部楼层
Xzr_zzzzzzzz 发表于 2012-9-7 22:34
分享下思路嘛~~

说实话,楼主的内容我没详细看(人懒~)。
我实现的方法是开始两台机(我只用了两台VS)都只启动vrrp 功能,然后利用 keepalived 的状态更改执行命令功能(notify_master, notify_backup等)去执行脚本实现一些功能及状态切换。比如当一台机成为vrrp的主后(notify_master)调用脚本再启动一个 keepallived 实例(其他设置不述),这个实例只启用 Health-checker(lvs)功能。这样这台机就可以做负载均衡器了(LVS)。同样notify_backup时需要停止这个实例。
大概看了楼主的, 应该跟我的思路差不多吧

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-1-14
最后登录
2014-8-7
在线时间
126 小时
阅读权限
90
积分
13184
帖子
245
主题
33
精华
0
UID
11752
发表于 2012-9-10 16:13:24 |显示全部楼层
哈,好多的方法,我也提供个想法

keepalived只做高可用,VRRP实例。

然后写一个track_script检测下是否存在虚拟IP,如果存在就ipvsadm 去添加LVS服务。

使用道具 举报

Rank: 8Rank: 8

注册时间
2012-8-8
最后登录
2013-11-29
在线时间
133 小时
阅读权限
90
积分
11998
帖子
18
主题
3
精华
0
UID
34619
发表于 2012-9-10 18:47:40 |显示全部楼层
灰大狼 发表于 2012-9-10 16:13
哈,好多的方法,我也提供个想法

keepalived只做高可用,VRRP实例。

最初也是想使用ipvsadm 去添加LVS服务的,但发现web服务停止时他不自动去掉节点,所以才使用keepalive的重载

使用道具 举报

Rank: 8Rank: 8

注册时间
2012-8-2
最后登录
2017-2-13
在线时间
54 小时
阅读权限
90
积分
12816
帖子
35
主题
3
精华
0
UID
34481
发表于 2012-12-24 12:06:43 |显示全部楼层
不过测试发现主keepalived 启用负载和高可用的时候 本地访问虚拟在本地其他WEB的VIP的时候,会发现访问的是本地的IP,和本地的服务,好像自己本身没有收到vrrp广播一样。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2020-2-26 18:55 , Processed in 0.031054 second(s), 12 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部