专栏首页cmazxiaoma的架构师之路FastDFS蛋疼的集群和负载均衡(十八)之LVS+Keepalived双主模式

FastDFS蛋疼的集群和负载均衡(十八)之LVS+Keepalived双主模式

Interesting things

我们之前的Keepalived+LVS单主模式,是只有一台lvs工作,这会造成资源浪费,可以采用双主结构,让两台lvs都进行工作,采用dns轮询方式,当用户访问域名通过dns轮询每天lvs,双主结构需要2个vip,这2个vip需要绑定域名。

同样,在每台lvs上安装keepalived软件,当keepalived检测到其中一个lvs宕机则将宕机的vip漂移到活动lvs上,当lvs恢复则vip又重新漂移回来。

附上我画的拓扑图 初始状态

image.png

其中一个主机宕机

image.png

主机恢复

image.png

所需环境 vip1 192.168.12.101 vip2 192.168.12.102 lvs_master1 192.168.12.12 lvs_master2 192.168.12.13 nginx1 192.168.12.2 nginx2 192.168.12.3 tomcat1 192.168.12.6 tomcat2 192.168.12.7

What did you do today

双主模式相比主从环境,区别在于: 1.DNS轮询。 2.LVS负载均衡层需要2个vip。比如192.168.12.12和192.168.12.13 3.后端的realServer上要绑定这2个vip到lo本地回环设备上 4.keepalived.conf的配置相比于上面的主从模式有所不同。

  • 在192.168.12.2和192.168.12.3机器要绑定2个vip到本地回环口lo上(分别绑定lo:0和lo:1),所以需要在/etc/init.d/下编写double_master_lvsdr0和double_master_lvsdr1脚本,具体如下:
#!/bin/sh
VIP=192.168.12.101
. /etc/rc.d/init.d/functions
    
case "$1" in
  
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo 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
    /sbin/sysctl -p >/dev/null 2>&1
    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up  
    /sbin/route add -host $VIP dev lo:0
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:0 down
    /sbin/route del $VIP >/dev/null 2>&1
    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
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0
#!/bin/sh
VIP=192.168.12.102
. /etc/rc.d/init.d/functions
    
case "$1" in
  
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo 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
    /sbin/sysctl -p >/dev/null 2>&1
    /sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up   
    /sbin/route add -host $VIP dev lo:1
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:1 down
    /sbin/route del $VIP >/dev/null 2>&1
    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
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:1 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0
  • 将double_master_lvsdr0和double_master_lvsdr1设置开机启动

[root@localhost init.d]# chmod +x double_master_lvsdr0 [root@localhost init.d]# chmod +x double_master_lvsdr1 [root@localhost init.d]# echo "/etc/init.d/double_master_lvsdr0" >> /etc/rc.d/rc.local [root@localhost init.d]# echo "/etc/init.d/double_master_lvsdr1" >> /etc/rc.d/rc.local

image.png

  • 启动double_master_lvsdr0和double_master_lvsdr1脚本

image.png

  • 查看192.168.12.2和192.168.12.3,发现vip已经成功绑定到本地回环口lo上了。

![image.png](http://upload-images.jianshu.io/upload_images/4636177-b99a4b5e1af33989.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • 在lvs_master1和lvs_master2打开ip_forward路由转发功能

[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

  • lvs_master1上的keepalived.conf配置如下:
! Configuration File for keepalived

global_defs {
   router_id LVS_MASTER
}

vrrp_script check_lvs {
   script "/etc/keepalived/lvs_check.sh"
   interval 2
   weight  -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_lvs
    }

    virtual_ipaddress {
        192.168.12.101
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_lvs
    }

    virtual_ipaddress {
        192.168.12.102
    }
}

virtual_server 192.168.12.101 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP


    real_server 192.168.12.2 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.12.3 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}


virtual_server 192.168.12.102 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP


    real_server 192.168.12.2 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.12.3 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
  • lvs_master2中的keepalived配置如下:
! Configuration File for keepalived
    
global_defs {
   router_id LVS_BACKUP
}

vrrp_script check_lvs {
   script "/etc/keepalived/lvs_check.sh"
   interval 2
   weight  -20
}
    
vrrp_instance VI_1 {
    state BACKUP        
    interface eth0           
    virtual_router_id 51     
    priority 90             
    advert_int 1             
    authentication {
        auth_type PASS       
        auth_pass 1111       
    }

    track_script {
        check_lvs
    }

    virtual_ipaddress {
        192.168.12.101       
    }
}
    
vrrp_instance VI_2 {
    state MASTER         
    interface eth0         
    virtual_router_id 52 
    priority 100          
    advert_int 1          
    authentication {
        auth_type PASS     
        auth_pass 1111     
    }

    track_script {
        check_lvs
    }

    virtual_ipaddress {
        192.168.12.102   
    }
}
  
virtual_server 192.168.12.101 80 {
    delay_loop 6             
    lb_algo wrr              
    lb_kind DR               
    #nat_mask 255.255.255.0
    persistence_timeout 50   
    protocol TCP            
    
  
    real_server 192.168.12.2 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.12.3 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
  
  
virtual_server 192.168.12.102 80 {
    delay_loop 6             
    lb_algo wrr              
    lb_kind DR               
    #nat_mask 255.255.255.0
    persistence_timeout 50   
    protocol TCP            
    
  
    real_server 192.168.12.2 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.12.3 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
  • 编写lvs_check.sh脚本。
a=`ipvsadm -ln`
str="Route"
bb=`echo $aa|grep $str|wc -l`
if [ $bb = 0 ];then     
    sleep 3
    aa=`ipvsadm -ln`
    bb=`echo $aa|grep $str|wc -l`
    if [ $bb = 0 ];then
        killall keepalived
    fi
fi
  • 启动192.168.12.2和192.16812.3的nginx、double_master_lvsdr0、double_master_lvsdr1服务。启动192.168.12.6和192.168.12.7的tomcat。
  • 我们查看lvs_master1的eth0节点信息,发现绑定了vip1(192.168.12.101)

image.png

  • 查看lvs_master2的eth0节点信息,发现绑定了vip2(192.168.12.102)

image.png

  • 查看lvs_master1的lvs以及realserver的信息。

image.png

  • 查看lvs_master2的lvs以及realserver的信息

image.png

  • 修改hosts文件(C:\Windows\System32\drivers\etc\hosts),指定cmaxiaoma.mayday.com对应的2个vip。(在hosts里这样设置,达不到负载均衡,只会优先访问192.168.12.101)

image.png

  • 访问cmazxiaoma.mayday.com

image.png

  • 我们停止掉lvs_master1.

image.png

  • 当我们又恢复lvs_master1.vip1又回到了lvs_master1手里,而lvs_master2又失去了vip1。

image.png

image.png

  • 在lvs_master2的eth0以及lvs、RealServer信息。

image.png

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Ribbon源码分析

    对于Spring中的AnnotationMetadata不太熟悉的同学,可以跑一下下面的CASE

    用户2032165
  • 通过分析LinkedHashMap了解LRU

    我们都知道LRU是最近最少使用,根据数据的历史访问记录来进行淘汰数据的。其核心思想是如果数据最近被访问过,那么将来访问的几率也更高。在这里提一下,Redis缓存...

    用户2032165
  • 一个麻瓜的自我反思之SQL语句基础练习

    用户2032165
  • 分辨率获取异常-Android更新引发的小坑

    作为一个测试工程师,经常被一些难以复现的bug困扰很久,理论上不可能出现,但线上确实又有很多用户反馈,比如小编前段时间碰到了一个比较有意思的bug,涉及到一些A...

    用户5521279
  • MySQL中特别实用的几种SQL语句送给大家

    高能预警,这是一篇干货满满的MySQL技术文章,总有一天,你必然会用到,记得收藏! -- 来自一位被技术经理毒打多年的程序员的忠告

    陈哈哈
  • 师兄带你轻松入门GitHub

    小白:师兄,师兄,我最近总是听到Github,看起来好高大上那,可是不懂是做什么得那?

    用户1150922
  • java映射(map用法)

    主要分三类:集合(set)、列表(List)、映射(Map) 1.集合:没有重复对象,没有特定排序方式 2.列表:对象按索引位置排序,可以有重复对象 3.映射...

    用户3030674
  • 微信小程序popup组件你会了吗?

    上述就是一个微信小程序pop组件实现的全部代码,看起来是不是很简单了,赶紧自己动手试试吧,没有你想象的那么难!!!

    Javanx
  • 启动nfs服务时报错 systemd: rpcbind.socket failed to listen on sockets: Address family not supported by ...

    在使用 “sudo systemctl restart nfs” 命令启动 nfs 服务时报错,/var/log/message 文件中有如下错误

    kongxx
  • Hadoop所支持的几种压缩格式

    优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分...

    王知无

扫码关注云+社区

领取腾讯云代金券