设为首页 收藏本站
查看: 1003|回复: 0

[经验分享] LVS/DR模式实战

[复制链接]

尚未签到

发表于 2019-1-2 13:01:16 | 显示全部楼层 |阅读模式
  线上服务器清理的差不多了,准备做一下服务器分层架构,就是将LNMP环境分离开,用到了LB集群,先来点理论吧。
  负载均衡LB集群主要关注的是并发处理能力,常用的有:LVS、nginx、haproxy。
  LVS是基于四层的负载均衡,不支持复杂特性的负载均衡,转发效率比7层略高
  nginx、haproxy都是七层的负载均衡,可以根据特性进行负载均衡,比较灵活。
  这里主要说说LVS的原理与配置方法,
  LVS原理其实就是利用iptables的INPUT链,侦听在INPUT链,拦截访问集群服务的数据包,将进入数据包的包头进行更改,不同类型更改包头的方式也不一样,转发给后端的RS,最后RS处理请求后在转发给用户。
  LVS:linux virtual server,lvs与iptable不能同时使用
  

  LVS类型:
  NAT: 地址转换  跟DNAT原理相同,多目标
  DR: 直接路由
  TUN: 隧道
  
LVS的调度方法:
  有10种,分别如下:
  固定调度,也叫静态调度,有四种:
  rr: 轮叫,轮询
  wrr: Weight, 加权
  sh: source hash, 源地址hash
  dh:目标地址hash
  动态调度方法,有六种:
  lc: 最少连接
  active*256+inactive
  谁的小,挑谁
  wlc: 加权最少连接
  (active*256+inactive)/weight
  sed: 最短期望延迟
  (active+1)*256/weight
  nq: never queue
  LBLC: 基于本地的最少连接
  LBLCR: 基于本地的带复制功能的最少连接
  

  默认的调度方法是wlc
  好了,具体LVS工作流程可以Google,有非常详细的文档,选用最常用的DR模式配置,简单的架构图如下:案例用于BBS论坛

  

  Director配置脚本如下:
#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
. /etc/rc.d/init.d/functions
#
VIP=192.168.8.230
DIP=192.168.8.226
RIP1=192.168.8.224
RIP2=192.168.8.225
PORT=80
RSWEIGHT1=2
RSWEIGHT2=5
#
case "$1" in
start)
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.8.230 port 80
# In this recipe, we will use the round_robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s wlc
# Now direct packets for this VIP to
# The real server IP(RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
# Stop forwarding Packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
/sbin/route del $VIP
/sbin/ifconfig eth0:0 down
/bin/rm -f /var/lock/subsys/ipvsadm
echo "ipvs is stopped..."
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm is stooppd ..."
else
echo "ipvsadm is running ...."
ipvsadm -L -n
fi
;;

*)
echo "Usage: $0 {start|stop|status]"
;;
esac  

  后端RS的配置脚本如下:
#!/bin/bash
#
# Scrip to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server

. /etc/rc.d/init.d/functions
VIP=192.168.8.230
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback devuce(s).
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/eth0/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig "lo:0" | grep -i $VIP`
isrothere=`netstat -rn | grep -i "lo" | grep -i $VIP`
if [ ! "$islothere" -o ! "$isrothere" ];then
# Either the route or the lo:0 device
# not found.
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac  分别启动Director和RS上面的ipvsadm服务,然后需要写LVS的后端健康监测脚本,在Director上面运行脚本如下:
#!/bin/bash
# Userd by LVS service Status Check.
VIP=192.168.8.230
CPORT=80
FAIL_BACK=127.0.0.1
RS=("192.168.8.224" "192.168.8.225")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log

addrs(){
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs(){
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}

checkrs(){
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
initstatus(){
local I
local COUNT=0;
for I in ${RS
  • }; do
    if ipvsadm -L -n | grep "$I:$RPORT" &> /dev/null ; then
    RSSTATUS[$COUNT]=1
    else
    RSSTATUS[$COUNT]=0
    fi
    let COUNT++
    done
    }
    initstatus
    while :; do
    let COUNT=0
    for I in ${RS
  • }; do
    if checkrs $I; then
    if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
    addrs $I ${RW[$COUNT]}
    [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
    fi
    else
    if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
    delrs $I
    [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
    fi
    fi
    let COUNT++
    done
    sleep 5
    done  这样LVS基本就配置完成了,BBS存在用户session的问题,虽然有很多种解决方法,这里如果只用lvs来解决的话,就要用到LVS的持久连接了,配置如下:
    ipvsadm -E -t 192.168.8.230:80 -s wlc -p 3600  这样用户访问后端一台RS在3600s内都只会访问这一台RS,可以发现这样做会破坏LB的效果,不过可以解决用户session的问题。
      

      简单说说rsync+inotify的配置方法,用于同步BBS的网页文件
      rsync就不多说了,在每台RS上面安装rsync然后配置rsync,并开启rsync服务,Director上安装inotify后,侦听脚本如下:

    #!/bin/bash
    # lixiang by created, 2014/12/31
    # used rsync web data
    src=/home/www/
    des1=web
    des2=web
    host1=192.168.8.224
    host2=192.168.8.225
    user1=root
    user2=root
    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -emodify,delete,create,attrib $src | while read file
    do
    /usr/bin/rsync -avrP --delete --ignore-errors --progress $src $user1@$host1::$des1
    /usr/bin/rsync -avrP --delete --ignore-errors --progress $src $user2@$host2::$des2
    echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
    done  写了个monitor脚本,监控inotify进程,写在crontab中5分钟运行一次,如下:
    #!/bin/bash
    # used by monitor inotify Process.
    ps -lef |pgrep inotify &> /dev/null
    if [ $? -eq 0 ]; then
    echo "inotify is running...."
    else
    /bin/sh /root/inotify.sh &> /dev/null &
    echo "inotify already running..."
    fi  

      NFS配置就不多说了,注意Director上面要关闭iptables,后端RS挂载用户上传目录即可,记得要写入fstab中。
      

      共享mysql将BBS应用的mysql指向一台mysql服务器即可
      

      

      双线的配置方法:
      目前很多服务器都是双线的,为了更好的提供用户体验,对应lvs的配置也很简单,只需要配置2个实例即可:联通配置一个VIP、电信配置一个VIP,对应用2个RS状态健康监测脚本。
      

      这样简单的LB集群就搭建完毕了,其实还存在一个问题:Director存在单点问题,下次在补充。。
      





  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658666-1-1.html 上篇帖子: 如何用cacti监控lvs 下篇帖子: 基于LVS的网站架构
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表