keepalived

一、原理:

  功能:能够自动实现将用户访问的ip转移的方法,故障重启,故障,恢复切换,故障报警

  模型:Master/Backup

  使用场景:节点少,没有共享存储等等。他只能有一个主活动,其他为从节点

  • 功能实现:

Master不停的向Backup进行心跳通告,一旦心跳停止就迁移VIP。

Keepalived是模块化,主要是给LVS提供高可用性,并且可以向后端的Realserver提供健康状态检查,还可以通过脚本对特定服务进行健康检查,故障重启及切换。

  • keepalived核心:

    vrrp:虚拟冗余路由协议

      

    VRRP有限状态机

    为了解决ip漂移后mac地址也变化了,IP地址和MAC地址都是虚拟的(VMAC),通 过心跳检测的良好状态进行转移也可以降低优先级进行故障转移(0-255 ,数字越大优先级越高)

    virtual server

    vrrp_script:

    监控服务的健康状态。根据服务的状态故障转移

  • Keepalived架构图:

  

  Configure file parser 配置文件检测,主进程负责分析配置文件

  I/O Multiplexer , io多路复用

  watchdog : 监控两个进程健康状态,负责启动,重启两个紫禁城

  两个子进程:真正工作的子进程

    Checkers:自身的IPVS的后端服务器的健康状态

         用户提供脚本

    VRRP:

  VRRP认证机制:1、明文认证, 2、hmac认证

二、安装及配置

1、http://keepalived.org/ 下载软件或在Centos 6.4以后可以yum安装

ansible two -m yum -a "name=keepalived state=installed"

  

2、Keepalived文件

  /etc/keepalived/keepalive.conf

  /etc/init.d/keepalived

3、同步时间

ansible all  -a 'ntpdate s1a.time.edu.cn'

4、备份配置文件

ansible two -a "cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak"

  

man  Keepalived.conf

! Configuration File for keepalived   #这部分配置好了就可以启动,Keepalived就开始互相监听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_script chk_svr_down {   #vrrp定义检测判断脚本 , chk_svr_down 是脚本名称,随便取
  script "[[ -f /etc/keepalived/down ]]" && exit 1 || exit 0" #这里可以去读取脚本,或者用引号括起来的一个命令 返回1执行下面额weight -2
  interval 1 #每隔1秒钟检测一次
  weight -2     #如果脚本检测成功权重 - 2
 }
vrrp_instance VI_1 { . #配置vrrpd 定义虚拟路由器 VI_1 虚拟路由的标示名称,随意取名 state MASTER #初始状态,这里定义了master了其priority的值就要高于其他节点 
   state MASTER #定义主,可以不定义
   interface eth0 #通告选举通过那个网卡进行
virtual_router_id 51 #虚拟路由ID,每个虚拟路由都需要有id号,vmac的最后一段地址,最大255,一套Keepalived 应该是相同的id
priority 100       #初始优先级,高的为master,高的会在恢复的时候抢过来
advert_int 1       #通告时间间隔
authentication {     #认证机制
auth_type PASS    #明文机制 ,或者ssl认证   
auth_pass 1111   #认证密码
}
virtual_ipaddress {    #VIP地址
192.168.200.16
 #定义ip格式 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>    lable <LABLE>
     #       IP    MASK   广播地址   工作在那块网卡上 工作范围:外网是否可见 网卡别名
     可以定义多个vip #192.168.200.17/24 dev eth1              #定义的格式,可以指定多个option
            #192.168.200.18/24 dev eth2 label eth2:1
 }
  track_script { #这里面追踪上面的脚本,才真正执行上面的脚本
    chk_svr_down
    [可以是多个。。。]
  }
}
vrrp_instance VI_2 {   #可以定义两套vrrp路由协议,做成双主,互相切换,前段通过DNS多个A记录达到分摊负载的作用
  interface eth0
virtual_router_id 52
priority 99       
advert_int 1       
authentication {    
auth_type PASS       
auth_pass 2222   
}
virtual_ipaddress {
192.168.200.17
 #定义ip格式 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>    lable <LABLE>
     #       IP    MASK   广播地址   工作在那块网卡上 工作范围:外网是否可见 网卡别名
     #192.168.200.17/24 dev eth1
         #192.168.200.18/24 dev eth2 label eth2:1
 }
  track_script {
    chk_svr_down
    [可以是多个。。。]
   notify_master "/path/to/file.sh master"    #转变成master 通知,代参数(有空白字符)需要有引号
notify_backup "/path/to/file.sh backup" #转变成backup 通知
notify_fault "/path/to/file.sh fault" #转变成失败通知
    notify /path/notify.sh   #自写脚本应付所有的通知
      #脚本的格式 $1 指明白是 GROUP | instance 哪个配置段中
      # $2 说明是哪个 name of group or instance #说明是哪个group 或者instance
   # $3 转换状态说明
  }
#调取脚本发通知或执行

virtual_server 192.168.56.100 80 {   LVS 配置段  支持 virtual server group 和 virtual server
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    #sorry_server 192.168.200.200 1358

    real_server 192.168.56.2 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
  }
    real_server 192.168.56.3 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
  }

 
 }
 
Dec  :: vm2 kernel: IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
Dec :: vm2 kernel: IPVS: Connection hash table configured (size=, memory=64Kbytes)
Dec :: vm2 kernel: IPVS: ipvs loaded.
Dec :: vm2 Keepalived_healthcheckers[]: Netlink reflector reports IP 10.0.2.5 added
Dec :: vm2 Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.56.4 added
Dec :: vm2 Keepalived_healthcheckers[]: Netlink reflector reports IP fe80::a00:27ff:fee5:3c84 added
Dec :: vm2 Keepalived_healthcheckers[]: Netlink reflector reports IP fe80::a00:27ff:fea9:ff31 added
Dec :: vm2 Keepalived_healthcheckers[]: Registering Kernel netlink reflector
Dec :: vm2 Keepalived_healthcheckers[]: Registering Kernel netlink command channel
Dec :: vm2 Keepalived_vrrp[]: Opening file '/etc/keepalived/keepalived.conf'.
Dec :: vm2 Keepalived_vrrp[]: Configuration is using : Bytes
Dec :: vm2 Keepalived_vrrp[]: Using LinkWatch kernel netlink reflector...
Dec :: vm2 Keepalived_healthcheckers[]: Opening file '/etc/keepalived/keepalived.conf'.
Dec :: vm2 Keepalived_healthcheckers[]: Configuration is using : Bytes
Dec :: vm2 Keepalived_healthcheckers[]: Using LinkWatch kernel netlink reflector...
Dec :: vm2 Keepalived_vrrp[]: VRRP sockpool: [ifindex(), proto(), unicast(), fd(,)]
Dec :: vm2 Keepalived_vrrp[]: VRRP_Instance(VI_1) Transition to MASTER STATE
Dec :: vm2 Keepalived_vrrp[]: VRRP_Instance(VI_1) Entering MASTER STATE
Dec :: vm2 Keepalived_vrrp[]: VRRP_Instance(VI_1) setting protocol VIPs.
Dec :: vm2 Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.56.6
Dec :: vm2 Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.56.6 added
Dec :: vm2 Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.56.6

/var/log/message 日志信息

: lo: <LOOPBACK,UP,LOWER_UP> mtu  qdisc noqueue state UNKNOWN
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :::e5:3c: brd ff:ff:ff:ff:ff:ff
inet 10.0.2.5/ brd 10.0.2.255 scope global eth0
inet 192.168.56.6/ scope global eth0
inet6 fe80::a00:27ff:fee5:3c84/ scope link
valid_lft forever preferred_lft forever
: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :::a9:ff: brd ff:ff:ff:ff:ff:ff
inet 192.168.56.4/ brd 192.168.56.255 scope global eth1
inet6 fe80::a00:27ff:fea9:ff31/ scope link
valid_lft forever preferred_lft forever

使用ip命令查看vip

ip位置在eth0上,看着不爽,改到eth1上

  virtual_ipaddress {
192.168.56.6 dev eth1
}

keepalived 心跳地址:224.0.0.1

现在就可以实现Keepalived服务及主机宕机故障恢复的切换了。(因为优先级高的原因,默认下Keepalived的 VRRP工作在抢占模式)

5、vrrp_script 脚本检测

vrrp_script chk_svr_down {   定义脚本
script "[[ -f /etc/keepalived/down ]]" && exit 1 || exit 0" #可以是引号中的判断命令,也可以是个脚本路径 返回1执行下面的操作
   interval 2 #1s 检测一次
  weight -2     #权重 -2
  fall 2 #失败2次才下线
  rise 2 #成功2次才上线
  } vrrp_script chk_nginx {
  scrip "killall -0 nginx"  #检查nginx
interval 2
weight -2
  fall 2
rise 2
}
   track_scropt {   #引用脚本
      chk_svr_down
      [可以是多个]
      chk_nginx 
} *但是有多个检测可能因为权重值得原因服务不切换

*如果两边都有例子中的文件,则不切换,一旦一个服务器没有了这个文件,立刻转移过去,并且master一旦恢复也会切换过来 

ipvsadm

ipvsadm  -A -t [tcp|udp|fwm] 192.168.50.100:80 -s rr [ -p 持久连接时间 ]
ipvsadm -a -t [tcp|udp|fwm] 192.168.50.100:80 -r 10.0.5.10 -g -w rr
     

virtual_server 10.0.50.10 { #虚拟服务器  #这个ip就是vip , 80是客户端访问的端口  ,防火墙的标记 : virtual_server fwmark int ,组 virtual_server group string
delay_loop
lb_algo rr   #lvs 调取算法 [ rr|wrr|lc|wlc|lblc|sh|dh|... ]
lb_kind NAT #策略 NAT|DR|TUN
nat_mask 255.255.255.0
persistence_timeout 50 #支持持久连接的时间
protocol TCP
sorry_server 192.168.200.200 1358 , #所有服务器全挂了
real_server 192.168.201.100  { #real 地址 端口 weight 1        #权重
notify_up "script" #脚本通知
notify_down "script" #脚本通知
SSL_GET|HTTP_GET|{ #监控状态检测, tcp_check tcp检测,ssl_check 检测ssl服务器,smtp检测邮件服务器,misc 不便归类的方式。
url {
  path /
  digest ff20ad2481f97b1754ef3e12ecd3a9cc
#通过校验码比较
  } 
url {   
path /mrtg/
  #status_code 200 #或者使用返回码
  }
connect_port <port> #realserver 发起检测的端口
bindto <ipaddr> #发起检测ip的端口
  connect_timeout 3 #连接超时时间
  nb_get_retry 3 #尝试几次
  delay_before_retry 3 #每次尝试之前等待时间
 }
}
} virtual_server 10.10.10.2 {
delay_loop
lb_algo rr
lb_kind NAT
persistence_timeout
protocol TCP sorry_server 192.168.200.200 1358 , #所有服务器全挂了 real_server 192.168.200.2 {
weight
TCP_CHECK { #tcp_check 只有以下检测选项
  connect_port <port>
  bindto <ipaddr>
  connect_timeout
}
}
}

配置文件层次:

GLOBL CONFIGURATION .          #全局配置文件

    Global definitons         #全局配置

  static route              #静态路径

VRRPD CONFIGURATION             #配合vrrp子进程工作协议的,双主需要在这里定义两个路由,路由标示

  VRRP synchronization group      #同步组,在一个节点上配置了2个VIP,一同转移时  

    string ,name of group of ips that falover together

  VRRP instace(s)                          #vrrp实例:核心,优先级等在这配置

    Describes the moveable IP for each instance of a group in vrrp_sync_group .    #转移ip地址

LVS CONFIGUATION

  Virtual server group    #虚拟路由服务器组

  Virtual server      #虚拟服务器

*下划线的用的比较多

通知:

位置

1、vrrp_instance {

}

2、vrrp_sync_groyp{

}

通知脚本类型:

1.分开通知,每种状态触发不同脚本

# to MASTER transition

notify_master /path/to_master.sh

# to BACKUP transition
notify_backup /path/to_backup.sh
# FAULT transition
notify_fault "/path/fault.sh VG_1"

2.一个脚本应付3中状态,但是需要接受参数

# arguments
# $1 = "GROUP"|"INSTANCE"   #明确用在group中还是instance中
# $2 = name of group or instance  #说明那个group or  instence 
# $3 = target state of transition    #说明转换成什么状态
# ("MASTER"|"BACKUP"|"FAULT")
notify /path/notify.sh

单个版本

#!/bin/bash
vip=192.168.5.1 content="root@localhost" notify () {   mailbody="vrrp tansaction, $vip floated to `hostname`"   subject="`hostname` is $vip MASTER"   echo $mailbody | mail -s $subject $content } notify

状态转换到master通知脚本

通用版本

vip=192.168.56.100
contact="root@localhost" notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date +%F` : vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
} case "$1" in
master)
notify master
exit
;; backup)
notify backup
/etc/init.d/nginx restart #只是在Keepalived 监控本机的nginx
exit
;;
fault)
notify fault
exit
;;
esac

通用脚本,具备重启服务

KEEPALIVED的更多相关文章

  1. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...

  2. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  3. keepalived从机接管后主机恢复不抢占VIP

    在lvs+keepalived环境中,为了减小keepalived主从切换带来的意外风险,,设置主机恢复后不抢占VIP.待进行vrrp协议通告备机不可用时切换.主要修改两个地方.(红色部分) 只需修改 ...

  4. keepalived 知识备注

    keepalived可用于配置nginx/lvs等负载均衡设备的双机热备. keepalived基于VRRP协议,简单的说就是两个物理路由节点(一主一备),虚拟成一个逻辑上的路由节点. 实际消息的路由 ...

  5. Windows下PowerShell监控Keepalived

    一.背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell来完成发邮件预警. 二 ...

  6. Keepalived+LVS+nginx双机热备

    Keepalived简介 什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了, 也就是所谓的高可用或热备,用来防止单点故障的发生. Keepalived采 ...

  7. 基于keepalived双主模型的高可用LVS

    背景知识: keepalived:Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除, ...

  8. Keepalived使用梳理

    keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...

  9. Keepalived的全局配置

    Keepalived的全局配置 默认配置文件如下: ! Configuration File for keepalived global_defs { notification_email { aca ...

  10. Keepalived的安装

    Keepalived的安装 官网下载:点击直达 yum install -y libnl yum install -y libnl-devel 下载 cd /usr/local/src/ wget h ...

随机推荐

  1. 使用Microsoft Fakes隔离测试代码

    在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...

  2. window虚拟机安装Linux

    Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核.Linux可安装在各种计算机硬件设备中,比如手机.平板电脑.路由器.视频游戏控制台.台 ...

  3. ArcGis for Android 工作与学习

    ArcGis安装 需求 windows7(32/64) Eclipse3.6以上版本 Android Sdk 2.2以上 Jdk 7 安装步骤 Eclipse安装 下载ArcGis插件 在Eclips ...

  4. Javascript中event.srcElement和event.target的区别

    event.srcElement 可以捕获当前事件作用的对象,如event.srcElement.tagName可以捕获活动标记名称.注意获取的标记都以大写表示,如"TD",&qu ...

  5. css2 [lang|=en] 误区

    [lang|=en] w3c说明:css2选择器,选择以en开头的的lang属性. w3c的这个解释是有误区的,en开头,但是en后面必须要有-,也就是说是选择的是en-开头

  6. 下拉菜单demo---参考阿里云首页顶部下拉菜单

    前言: 最近开始学习html+css,准备仿照各大网站写一些demo. 正文: 分析阶段: 如下图: 链接来自于: 阿里云:https://www.aliyun.com/ 实现过程: (一)用css3 ...

  7. SQL2008完全卸载详解(图解)

    一.    SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板”

  8. 报表控件NCreport教程:报表高级设计

    本次文章中将讲解NCreport一些高级功能的应用,我们会先定义一个组,接下来会添加summary变量到示例报表中. 一.对summary添加变量 对于提供的数量和总量来说,变量是特殊的数值项,它们每 ...

  9. c++调用lua注册的带参数的回调

    main.cpp int lua_cb = LUA_REFNIL; int lua_cb_arg = LUA_REFNIL; int setcb(lua_State *L) { lua_pushval ...

  10. CSS 设置背景透明度,不影响子元素

    由于 opacity 属性能被子元素继承,使用它设置父元素背景透明度时也会影响子元素. 解决方法: 1> 使用 RGBA Example .classname { /* RGBa, 透明度0.6 ...