Linux keepalived 详解

一、什么是高可用?

一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。

比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?

通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。

问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?

其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)

如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。

image

二、VRRP协议

image

  虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。

image

  VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。是一种LAN接入设备备份协议。一个局域网络内的所有主机都设置缺省网关,这样主机发出的目的地址不在本网段的报文将被通过缺省网关发往三层交换机,从而实现了主机和外部网络的通信。

  VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由,当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。

  在VRRP协议中,有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物理实体;虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定的IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器VRRP协议从路由器组中选出一台作为主控路由器,负责ARP解析和转发IP数据包,组中的其他路由器作为备份的角色并处于待命状态,当由于某种原因主控路由器发生故障时,其中的一台备份路由器能在瞬间的时延后升级为主控路由器,由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的。

三、keepalived

3.1 keepalived简介

image

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

3.2 keepalived配置

keepalived服务的主配置文件为keepalived.conf,其配置主要分为如下几部分:

* Globals configurations
    * Global definitions
    * Static addresses
    * Static routes
* VRRP configuration
    * VRRP scripts
    * VRRP synchronization group
    * VRRP instance
* LVS configuration
    * Virtual server group
    * Virtual server 

3.2.1 全局配置

global_defs {				# 全局配置标识
    notification_email {		# 邮件通知配置
       xxxxx@qq.com                 # 邮件接收人员信息,可以为多个
       yyyyy@163.com
       ...
    }
    notification_email_from zzz@qq.com     # 邮件发送者地址
    smtp_server  127.0.0.1  	           # SMTP server IP address
    smtp_connect_timeout 30                # 邮件发送连接超时时间,单位秒
    router_id anyid			   # 机器标识,发送邮件时会知会此id
    vrrp_mcast_group4 <IPv4 ADDRESS>	   # optional, default 224.0.0.18
    vrrp_mcast_group6 <IPv6 ADDRESS>	   # optional, default ff02::12
}

3.2.2 VRRP配置

# vrrp同步组配置
vrrp_sync_group <STRING> {	# VRRP sync group declaration
    group {			# group of instance to sync together
      VI_1	        	# 这里定义的VI_1是实例名,和下面的VRRP实例配置对应
      ...
    }
    notify_master /path/to/to_master.sh                # 切换到master状态时,要执行的脚本
    notify_backup /path_to/to_backup.sh                # 切换到backup状态时,要执行的脚本
    notify_fault <STRING>|<QUOTED-STRING>  # Script to run during FAULT transit
    notify <STRING>|<QUOTED-STRING>	   # 任意状态切换,都执行后面的脚本
    smtp_alert		 # 有切换时,进行全局配置中的邮件发送通知
}

# 检测脚本
vrrp_script check_script {
    # 指定脚本路径
    script "/etc/keepalived/check_script.sh"
    # 执行间隔
    interval 5
}

# vrrp实例配置
vrrp_instance VI_1 {
    # 状态,MASTER和BACKUP
    state MASTER
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组
    virtual_router_id 50
    # 优先级
    priority 100
    # 监测心跳间隔时间
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
    }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        192.168.15.3
    }
    # 调用检查
    track_script {
        check_script
    }
}

3.2.3 LVS配置

LVS配置是专门为keepalived+LVS集成准备的,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便。LVS配置部分也分两部分:虚拟服务器组与虚拟服务器。

# 虚拟主机组
virtual_server_group <STRING> {
	<IP ADDRESS> <PORT>		# VIP VPORT
	...
	<IP ADDRESS RANGE> <PORT>	# VIP range VPORT
	...
	fwmark <INTEGER>		# fwmark
	...
}

# 虚拟主机配置
virtual_server 10.10.10.2 1358 {
    # service polling的delay时间,即服务轮询的时间间隔
    delay_loop 6
    # 算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358

    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        # 权重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
        }
    }
}

3.3 keepalived非抢占式

image

我们在使用keepalived实现高可用的情况下,当一台机器宕机时,状态为backup的机器无缝衔接,使得服务不会因此奔溃。但是,配置为master的这台机器重启后,原本一直访问backup状态的机器的请求由于ip转移的缘故而无法响应,这种用户体验是不可行的。我们应该任然保持由这台机器接受访问,因此便需要配置所有机器状态为backup,添加 nopreempt字段。

vrrp_instance VI_1 {
    state BACKUP
    # 开启非抢占式
    nopreempt
    ...
}

keepalived脑裂问题

两台高可用服务器在指定时间内,无法互相检查到对方的心跳而各自启动故障转移功能。比如一台机器中nginx发生异常,此时必须通过脚本通知keepalived关闭自己实现转移。

我们需要编写一个故障排查脚本:

# 查询nginx进程
ps -ef | grep -q [n]ginx

# $?表示上条命令执行结果,判断nginx是否正常启动
if [ $? -ne 0 ];then
	# 启动nginx
	systemctl start nginx &>/dev/null
	sleep 2
	# 再次查询nginx进程
	ps -ef | grep -q [n]ginx
	# 判断是否重启完成
	if [ $? -ne 0 ];then
		# nginx重启任然失败,关闭本机keepalived,启动转移功能
		systemctl stop keepalived
	fi
fi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值