Keepalived 工作原理及简要安装

Stella981
• 阅读 774

keepalived 介绍

          keepalived 是 Linux下一个轻量级的高可用解决方案

          keepalived 主要通过虚拟路由冗余(VRRP)来实现高可用功能

           优点:部署及使用简单,只需一个配置文件即可完成

          功能:1. 服务器状态检测和故障隔离功能    2. HA(High Available) cluster 

keepalived 发展

            keepalived起初是为LVS(Linux Virtual System)设计,专门监控集群系统中各个服务节点的状态

            根据TCP/IP参考模型 第三、第四、第五层交换机制检测每个服务节点的状态

         (详细见本页keepalived工作原理

            ** e.g: keepalived检测WEB服务器的状态;**

      如果一台WEB服务器死机/工作出现故障,keepalived检测到此状况后会将故障服务器从系统中剔除,直至该服务器工作正常后keepalived自动将该服务器加入到服务器群中, 以上工作keepalived自动完成,无需人工干涉,人工干预仅是修复出现故障的服务节点.

            keepalived 后续加入了VRRP功能

    VRRP(Virtaul Router Redunadancy Protocol,虚拟路由器冗余协议)

目的:解决静态路由出现的单点故障问题,实现网络不间断稳定运行

VRRP 协议与工作原理

引入VRRP概念

                Keepalived 工作原理及简要安装

                         *说明*:图片来源百度百科;左侧图片为局域网组网;右侧图片为VRRP组网

            ** 局域网组网 e.g:**

                网络内的所有主机会设置一条默认网关(10.100.10.1),当主机发出的目的地址不在本网段(10.100.10.0/24)的报文;

                通过默认网关发往路由器A,从而实现主机与外部网络的通信

               该组网缺点:当路由器A坏掉时,本网段内通过以RA为默认网关下一跳的主机将断掉与外界的通信,产生单点故障

              VRRP组网 e.g:

                 RA:Master 活动路由器  10.100.10.2   

                 RB:Backup 备份路由器  10.100.10.3

              VRIP : 虚拟路由器IP            10.100.10.1

              VRRP将局域网中的一组路由器【 RA和RB】组成一个虚拟路由器------>>>备份组

               虚拟路由器拥有自己的IP地址 10.100.10.1

               局域网内的主机仅知道虚拟路由器IP地址为10.100.10.1,不知道具体的Master与Backup路由器IP

               局域网内的主机将默认网关下一跳的地址设置为该虚拟路由器IP地址,通过该地址与其他网络进行通信

                该组网优点:当备份组内的Master路由器DOWN掉,会进行选举策略选出一个新的Master路由器,继续往网络内的主机提供路由服务,从而实现网络内的主机不间断地与外部网络进行通信

❉    VRRP 协议 ‍‍

‍        

                      VRRP:解决局域网中配置静态网关出现单点失效的路由协议

设计目标:网络发生故障时透明地进行设备切换而不影响主机间的数据通信

❉    VRRP 工作原理

                VRRP协议将两台或多台路由器设备虚拟成一个虚拟路由器,对外提供虚拟路由器IP(一个或多个);

                而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER, 或者是通                 过算法选举产生;

                 MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;

                 其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外                    的网络功能。

                当主机失效时,BACKUP将接管原先MASTER的网络功能。

              ❀  如何判定多个路由器在同一组虚拟路由器中?

                            VRID:每个虚拟路由器都有一个唯一标识(VRID是一个0~255的正整数)

                            配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,

                            使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组

                      ❀  BACKUP 为什么没有发生抢占?

                           VRRP通告:它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内

                           在一个虚拟路由器中,只有处于MASTER角色的路由器会一直发送VRRP通告信息;

                           处于BACKUP状态的路由器只接收MASTER发过来的报文信息,用来监控MASTER运行状态, 除非它的优先级比MASTER更高

                      ❀  什么时候发生选举?

                            当MASTER不可用时,BACKUP无法收到MASTER发过来的报文信息;

                            认定MASTER出现故障,然后多台BACKUP就开始进行选举;

                       ❀  Master选举

                           虚拟路由器IP=路由器本身配置IP

                           该路由器始终将是MASTER;IP地址所有者自动具有最高优先级:255

                           优先级选举主控路由器(优先级范围是0—255)

                           优先级0一般用在IP地址所有者主动放弃主控者角色时使用。可配置的优先级范围为1—254

                           优先级相等,则比较路由器的实际IP,IP值较大的优先权高

❉    VRRP 应用实例

            +-----------+      +-----------+
            |   Rtr1    |      |   Rtr2    |
            |(MR VRID=1)|      |(BR VRID=1)|
            |(BR VRID=2)|      |(MR VRID=2)|
    VRID=1  +-----------+      +-----------+  VRID=2
    IP A ---------->*            *<---------- IP B
                    |            |
                    |            |
  ------------------+------------+-----+--------+--------+--------+--
                                       ^        ^        ^        ^
                                       |        |        |        |
                                     (IP A)   (IP A)   (IP B)   (IP B)
                                       |        |        |        |
                                    +--+--+  +--+--+  +--+--+  +--+--+
                                    |  H1 |  |  H2 |  |  H3 |  |  H4 |
                                    +-----+  +-----+  +--+--+  +--+--+
     Legend:
              ---+---+---+--  =  Ethernet, Token Ring, or FDDI
                           H  =  Host computer
                          MR  =  Master Router
                          BR  =  Backup Router
                           *  =  IP Address
                        (IP)  =  default router for hosts

 -------------------------------------------------------------------------------------------------------------

    +   VRID 1       |   Rtr1(Master)     |    Rtr2(Backup) +  正常情况下  H1与H2走R1;反之 走R2

    -------------------------------------------------------------------------------------------------------------

     +   VRID 2       |   Rtr1(Backup)    |    Rtr2 (Master) +  正常情况下  H3与H4走R2;反之 走R1

    ------------------------------------------------------------------------------------------------------------

Keepalived 工作原理

          根据TCP/IP参考模型各层所能实现的功能,Keepalived运行机制如下:

          网络层

                 协议:     IP(Internet Protocol网际协议)  

                             ARP(Address Resolution Protoco 地址转换协议) 

                           RARP(Reverse Address Resolution Protocol  反向地址转换协议 )

                           ICMP(Internet Control Message Protocol 网络控制报文协议)  

                 常用:通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似ping实现)

                           如果某个节点没有返回响应数据包,那么认为此节点发生了故障

                           keepalived将报告该节点失效,并从服务器集群中剔除故障节点

         传输层

                 协议:  TCP (传输控制协议)(三次握手、安全可靠)

                            UDP (用户数据协议)

                 ------------------------------------------------------------------------------------

                 TCP提供可靠的数据传输服务、IP地址和端口,代表TCP的一个连接端

                 获取TCP服务,需要在发送机的一个端口上和接收机上一个端口上建立连接

                -------------------------------------------------------------------------------------

                 常用:利用TCP协议的端口连接和扫描技术来判断集群节点是否正常

                    e.g: SSH服务默认22端口,WEB服务器80端口····Keepalived在传输层探测某端口没有响应数据

                           判定端口异常,强制将此端口对应的节点从服务器及群组中移除

         应用层

                协议:FTP、TELNET、SMTP、DNS ····

                -----------------------------------------------------------------------

                用户可以通过自定义Keepalived的工作方式

                -----------------------------------------------------------------------

                e.g:用户编辑程序运行Keepalived,而Keepalived 根据用户设定检测各种程序或服务是否允许正常

keepalived 结构体系

Keepalived 工作原理及简要安装

                 图片来源:http://www.keepalived.org/documentation.html

keepalived  安装

实验需求:

  • 安装keepalived(仅安装)

实验实现:

  • 服务器:CentOS 6.5-minimal 

  • ‍软    件:Keepalived ( V_1.2.19 )  ‍

  

安装过程:

>>>下载安装包并解压,查看相关参数

[root@lucia tmp]# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz    # 下载Keepalived安装包
[root@lucia tmp]# tar -zxf keepalived-1.2.19.tar.gz   #解压安装包
[root@lucia tmp]# cd keepalived-1.2.19
[root@lucia keepalived-1.2.19]# ./configure --help    #查看confiure编译参数
 
#================================================
# 指定安装在/etc/ {--sysconfdir=/etc}
# 指定使用内核源码中的头文件 {--with-kernel-dir}
# 注:使用LVS时,需要用到"--with-kernel-dir"
#===============================================

>>>编译安装

[root@lucia keepalived-1.2.19]# [ -z /usr/src/kernels/ ] && yum -y install kernel-headers kernel-devel || echo "The kernel file already exists"
The kernel file already exists
 
#===========================
# 判断kernels目录是否存在文件
#===========================
 
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
 
#============================================================================
# ./configure 对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系
#============================================================================

configure: error: in `/tmp/keepalived-1.2.19':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
 
#============================================================================
# 报错:gcc编译器没有安装
# [root@lucia keepalived-1.2.19]# yum -y install gcc
#=============================================================================
      
继续返回上一步预安装./configure
[root@lucia keepalived-1.2.19]# ./configure --sysconfdir=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64
 
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.            !!!
 
#=========================================================================
# 报错:OpenSSL 没有安装
# [root@lucia keepalived-1.2.19]# yum -y install openssl*
#=========================================================================

./configure 成功后,显示是Keepalived 输出的加载模块信息

Keepalived configuration
------------------------
Keepalived version       : 1.2.19                         
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -lssl -lcrypto -lcrypt 
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
IPVS use libnl           : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
SNMP support             : No
SHA1 support             : No
Use Debug flags          : No

[root@lucia keepalived-1.2.19]# make && make install                     #编译&&安装
[root@lucia keepalived-1.2.19]# ln -s /usr/local/sbin/keepalived /sbin/  #软链接到系统使用的管理程序目录中
[root@lucia keepalived-1.2.19]# chkconfig --add keepalived               #添加到系统服务
[root@lucia keepalived-1.2.19]# chkconfig --level 35 keepalived on       #添加到开机启动

❉   Keepalived 配置详解

[root@lucia keepalived-1.2.19]# cd /etc/keepalived/
[root@lucia keepalived-1.2.19]# ls
keepalived.conf  samples

# ================================================================
# Keepalived 配置文件路径为/etc/keepalived/keepalived.conf
# samples 目录下存放着keepalived配置的示例
# ================================================================

#============================================================
# keepalived.conf 配置
#------------------------------------------------------------
# 1、Keepalived 配置文件以block形式组织,每个块内容都包含在{}
# 2、“#”   “!” 开头行为注释
# 3、keepalived 配置为三类:
#      全局配置:对整个keepalived都生效的配置 
#    VRRPD 配置:核心配置,主要实现keepalived高可用功能
#      LVS配置
#============================================================


! Configuration File for keepalived   

    
########################
#  全局配置
########################

 
global_defs {                               # global_defs 全局配置标识 
                                            ------------------------------------------
   notification_email {                     # notification_email用于设置报警邮件地址
     acassen@firewall.loc                   # 可以设置多个,每行一个
     failover@firewall.loc                  # 设置邮件报警,需开启本机Sendmail 服务
     sysadmin@firewall.loc                  # yum -y install mailx sendmail
   }                                        ----------------------------------------------

   notification_email_from Alexandre.Cassen@firewall.loc  # 设置邮件发送地址
   smtp_server 192.168.200.1                              # 设置邮件的smtp server地址
   smtp_connect_timeout 30                                # 设置连接smtp sever超时时间
   router_id LVS_DEVEL                                    # 表示运行keepalived服务器标识,发邮件时显示在邮件主题中的信息
}

######################
#  VRRPD配置
######################

vrrp_instance VI_1 {         # VRRPD 配置标识 VI_1是实例名称

    state MASTER             # 指定Keepalvied角色 MASTER表示此主机为主服务器 BACKUP则是表示为备用服务器
    interface eth0           # 指定 HA 监测网络的接口
    virtual_router_id 51     # 虚拟路由标识,标识为数字,同一个VRRP实例使用唯一的标识,即可表示在同一个vrrp_instance下 MASTER_ID = BACKUP_ID
    priority 100             # 定义节点优先级,数字越大表示节点的优先级越高,同一个VRRP_instance下,MASTE_PRIORITY > BACKUP_PRIORITY 
    advert_int 1             # 设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
             
    authentication {         # 设定节点间通信验证类型和密码,验证类型主要有PASS和AH两种
        auth_type PASS       # 同一个vrrp_instance,MASTER验证密码和BACKUP保持一致
        auth_pass 1111
    }

    virtual_ipaddress {      # 设置虚拟IP地址 (VIP),又叫做漂移IP地址
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }

#-------------------------------------------------------------------------------
# 问:为什么叫漂移IP地址?
# 答:当Keepalived切换到MASTER状态时,IP地址会自动添加到系统中
#    当Keepalvied切换到BACKUP状态时,IP地址将自动从系统中删除
#    
#    keepalived通过“ip address add”命令的形式将VIP添加到系统
#    通过“ip add”查看系统中添加的VIP地址
#--------------------------------------------------------------------------------

}

######################
# LVS配置
######################


virtual_server 192.168.200.100 443 {              # virtual_server LVS配置标识 
                                                  # 格式:virtual_server VIP port [IP 和 port 之间空格隔开]
 
    delay_loop 6                                  # 设置健康检查时间间隔,单位为秒                      
    lb_algo rr                                    # 设置负载调度算法,可用的调度算法有:rr、wlc、lc、lblc、sh、dh等
    lb_kind NAT                                   # 设置LVS实现负载均衡的机制,有NAT、TUN和DR三种模式可选
    nat_mask 255.255.255.0                        # NAT子网掩码
    persistence_timeout 50                        # 会话保持时间 
    protocol TCP                                  # 指定转发协议类型
#----------------------------------------------------------------------------------------------------
# persistence_timeout 会话保持时间对动态网页非常有用,为集群系统中的seesion共享提供了一个很好的解决方案
# 用户的请求会一直分发到某个服务节点,直至超过这个会话的保持时间(指最大无响应超时时间)
# =[用户操作动态页面如果在50s没有执行任何操作则被分发到另外的节点]
#----------------------------------------------------------------------------------------------------

    real_server 192.168.201.100 443 {                          # 设置real server段开始的标识 [ IP为真实IP地址]
                                                               # 格式:real_server realIP port [IP 和 port 之间空格隔开]
                                                               -----------------------------------------------------------------
        weight 1                                               # 用于配置real server节点的权值,权值大小用数字表示,数字越大,权值越高
                                                               # 设置权值大小可以为不同性能的服务器分配不同的负载
                                                               ------------------------------------------------------------------

        SSL_GET {                                              # 健康检查 SSL_GET    
            url {                                              # 指定SSL检查的URL信息,可以指定多个
              path /index.html                                 # 后跟详细的URL路径
              digest ff20ad2481f97b1754ef3e12ecd3a9cc          # SSL检查后的摘要信息,可以通过genhash命令工具获取
#-----------------------------------------------------------------
# [root@lucia keepalived]# genhash -s 192.168.201.100 -p 80 -u /index.html
#-----------------------------------------------------------------
            }
            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 serer失效后,启用备份节点
}

#---------------------------------------------------------------------------------------------------------------#

VRRP原理参考文档如下:

      http://bbs.nanjimao.com/thread-790-1-1.html (此篇写的很好)

      http://blog.chinaunix.net/uid-26575352-id-3529109.html

      keepalived.conf 参考书籍 《高性能Linux服务器构建实战》

本人高度近视,文档手打会出现个别字符错误,请指出

关于VRRP原理 部分为自己理解所拼凑,逻辑出现问题请指出

Lucia   2016/01

#----------------------------------------------------------------------------------------------------------------#

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这