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

diary_report.jpg

Interesting things

接着上一篇继续延伸
准备环境
vip 192.168.12.100
lvs_director_master 192.168.12.4
lvs_director_slave 192.168.12.8
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

什么是高可用?

lvs作为负载均衡器,所有请求都先到达lvs,可见lvs处于非常重要的位置,如果lvs服务器宕机,后端web服务器将无法提供服务,影响严重。

为了防止负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用监控程序,通过传送诸如"i am alive"这样的信息来监控对方的运行状况。当备份机不能再一定的时间内收到这样的信息,它就接管主服务器的服务ip并继续提供负载均衡服务,当备用服务器又从主服务器收到"i am alive"这样的信息时,它就释放服务ip地址,这样主服务器就开始再次提供负载均衡服务。

什么是keepalived?

keepalived是集群管理中保证集群高可用的一个服务软件,用于防止单点故障。

keepalived的作用是检测web服务器的状态,如果有一台web服务器司机或者工作出现故障,keepalived将检测到,并且将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器群中 ,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup。master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了。

keepalived主要有3个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模式是来实现VRRP协议的。

LVS+Keepalived实现主备过程

初始状态


image.png

主机宕机,备用机提供服务


image.png

主机恢复


image.png

keepalived基础配置完毕后,查询系统服务是否存在

chkconfig --list


image.png

配置日志文件

1.将keepalived日志输出到local0
vim /etc/sysconfig/keepalived,KEEPALIVED_OPTIONS="-D -d -S 0"


image.png

2.在/etc/rsyslog.conf添加:
local0.* /var/log/keepalived.log


image.png

3.重启启动keepalived和rsyslog服务:
service rsyslog restart
service keepalived restart
  1. 进入/var/log/下面,找到keepalived.log


    image.png

    5.查看keepalived.log。tail -f keepalived.log


    image.png

    6.差一点忘记说了,添加可执行权限:chmod +x /etc/init.d/keepalived

配置keepalived

  • 修改/etc/keepalived/keepalived.conf之前,我们看看里面写了什么东西。
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

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

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
  • 我们参考官方的配置,把主lvs的keepalived.conf进行相应的修改,具体如下:
! Configuration File for keepalived

global_defs {
   notification_email {
    # 发生故障时发送的邮箱
    #xxxx@163.com                                   
   }
   # 使用哪个邮箱发送
   #notification_email_from xxxx@163.com
   # 发件服务器
   #smtp_server xxx.com                                  
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script check_lvs {
    script "/etc/keepalived/lvs_check.sh"         ##监控脚本
    interval 2                                      ##时间间隔,2秒
    weight -20                                        ##权重
}

vrrp_instance VI_1 {
    state MASTER             # 标示为主lvs
    interface eth0           # HA检测端口
    virtual_router_id 51     # 主备的virtual_router_id 必须相同
    priority 100             # 优先级,备lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 广播周期秒数
    authentication {         # 定义认证
        auth_type PASS       # 认证方式为口令认证
        auth_pass 1111       # 定义口令
    }

   track_script {
        check_lvs        #监控脚本
   }

    virtual_ipaddress {      # 定义vip
        192.168.12.100        # 多个vip可换行添加
    }
}

virtual_server 192.168.12.100 80 {
    delay_loop 6       # 每隔6秒查看realserver状态
    lb_algo wlc        # 调度算法为加权最小连接数
    lb_kind DR         # lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP            # 用TCP监测realserver的状态

    real_server 192.168.12.2 80 {       # 定义realserver
        weight 3                       # 定义权重
        TCP_CHECK {  # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
            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下/etc/keepalived/keepalived.conf文件。配置内容基本和主lvs保持一致,需要注意的地方:修改state为BACKUP,priority比MASTER低,virtual_router_id和master保持一致。

  • 在主备lvs中/etc/keepalived/目录下,创建lvs_check.sh脚本,内容如下:

#!/bin/sh    
aa=`ipvsadm -ln`  
str="Route"  
bb=`echo $aa|grep $str|wc -l`  
if [ $bb = 0 ];then  
    service lvsdr start  
    sleep 3  
    aa=`ipvsadm -ln`  
    bb=`echo $aa|grep $str|wc -l`  
    if [ $bb = 0 ];then  
        killall keepalived  
    fi  
fi 
  • 先关闭主备lvs中的keepalived和lvsdr服务。

service lvsdr stop
service keepalived stop


image.png

image.png
  • 然后开启主备lvs中的keepalived服务。

我们接着通过ipvsadm查看lvs是否处于启动状态,发现lvs启动了!


image.png

image.png
  • 开启192.168.12.2和192.16812.3的nginx服务和lvsdr服务。

  • 开启192.168.12.6和192.168.12.7的tomcat

  • 接着我们通过ip a 命令查看虚拟ip

主lvs设备的虚拟ip信息


image.png

备lvs设备的虚拟ip信息


image.png
  • 出现这种情况似乎和我们想象的不太一样。我们可以先关闭防火墙。我们先关闭主lvs的keepalived服务,然后再关闭备lvs的keepalived服务。然后重新启动主lvs、备用lvs的keepalived服务即可。重启之后,我们发现备用lvs的eth0节点没有虚拟ip192.168.12.100了,如我所愿!


    image.png

    image.png
  • 主备lvs启动成功后,第一次访问192.168.12.100。


    image.png
  • 第二次访问192.168.12.100


    image.png
  • 当我们停掉主lvs,发现192.168.12.100还可以访问。此时我们在备lvs,通过ip a 查看发现eth0节点多了虚拟ip 192.168.12.100


    image.png
image.png
  • 接着开启主lvs,主导权又到了主lvs。

Summary

明天进行问题总结,然后实现LVS+Keepalived双主模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容