Keepalived(一)

高可用集群

High Availability Cluster,简称HA Cluste。以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响降低导最低

衡量可用性:在线时间/(在线时间+故障时间)

1年 = 365天 = 8760小时

99% 即一年内有 8760 * 1% = 87.6小时故障

99.9% 即一年内有 8760 * 0.1% = 8.76小时故障

99.99% 即一年内有 8760 * 0.01% = 52.6分钟故障

99.999% 即一年内有 8760 * 0.001% = 5.26分钟故障

99.9999% 即一年内有 8760 * 0.0001% = 31秒故障

自动侦测

主机上的软件通过“心跳线”(连接工作机与备份机的网线),经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。

常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。

故障转移

当活动的服务或应用意外终止时,快速启用冗余或备用的服务器、系统、硬件或者网络接替它们工作。故障转移通常是自动完成的。

在服务器级别,自动故障转移通常使用一个心跳线连接两台服务器。只要主服务器与备用服务器间“心跳”没有中断,备用服务器就不会启用。

脑裂

在高可用(HA)系统中,当联系两个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、两边“服务”都起不来了;或者两边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

产生原因

  • 因心跳线坏了(包括断了,老化)。
  • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
  • 因心跳线间连接的设备故障(网卡及交换机)。
  • 因仲裁的机器出问题(采用仲裁的方案)。
  • 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

解决方案

  • 添加冗余“心跳线”

减少脑裂发生几率。

  • 启用磁盘锁

正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁了。

  • 设置仲裁机制

例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

  • 监控报警

邮箱、短信、值班,在问题发生时第一时间人为介入,降低损失

简介

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

keepalived的故障转移是基于VRRP(虚拟路由器冗余协议)协议实现的。

keepalived工作在TCP/IP参考模型的第三、四和第五层,即网络层、传输层和应用层。

工作原理

将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕机,这时就需要根据VRRP的优先级来选举一个backup当master。

keepalived程序是vrrp协议在linux主机上以守护进程方式的实现,能够根据配置文件生成IPVS规则 ,并对各real server的健康做检测,以及Loadbalance主机和backup主机之间failover的实现。

模块

Keepalived采用是模块化设计,不同模块实现不同的功能,主要有三个模块:

  • core:负责主进程的启动,维护和全局配置文件的加载
  • check:负责健康检查
  • vrrp:用来实现vrrp协议

配置文件

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {    #全局配置
   notification_email {    #定义邮件发送目标
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]    #定义邮件发送者
   smtp_server 192.168.200.1    #指定smtp服务器地址
   smtp_connect_timeout 30    #指定smtp连接超时时间
   router_id LVS_DEVEL    #标识keepalived,唯一。数字、英文都可以
   vrrp_skip_check_adv_addr    #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
   vrrp_strict    #严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置
   vrrp_garp_interval 0    #在一个接口发送的两个arp之间的延迟,可以是毫秒级。单位秒
   vrrp_gna_interval 0    #消息发送延迟时间,可以是毫秒级
}

#定义VRRP实例,一个配置文件可以有多例,不同主机之间互为主备,实例名称应该一致
vrrp_instance VI_1 {
    state MASTER    #定义Keepalived角色,MASTER为主,BACKUP为备
    interface eth0    #指定检测的网络接口
    virtual_router_id 51    #虚拟路由标识,数字形式。在同一个vrrp实例中,master和backup保持一致
    priority 100    #节点优先级,数字越大优先级越高。在同一个vrrp实例中,master优先级必须必backup高,不然会切换角色
    advert_int 1    #心跳时间,单位为秒。指定MASTER与BACKUP之间同步检查的时间间隔
    authentication {    #认证方式同一个实例中keepalived主备必须一致,通过此认证才能加入此群组
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    #设置VIP,主备相同,可以使用dev选项来指定接口
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
#虚拟服务
virtual_server 192.168.200.100 443 {     #虚拟服务器地址(VIP)和端口空格隔开
    delay_loop 6    #健康检查间隔
    lb_algo rr    #定义负载均衡调度算法
    lb_kind NAT    #定义lvs工作模式
    persistence_timeout 50    #持久会话保持时间
    protocol TCP    #监控服务的协议类型
    #定义rs部分
    real_server 192.168.201.100 443 {
        weight 1    #lvs权重
        SSL_GET {    #监控检查的方式,常见的有HTTP_GET/SSL_GET/TCP_CHECK/MISC_CHECK
            url {
              path /    #指定ssl——get健康检查路径
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3    #real server若3s不响应就超时,就判断为realserver不健康,需要重新连接
            nb_get_retry 3    ##标识重试3次,防误伤
            delay_before_retry 3    #重试间隔3s
        }    ##总共12s才能判断故障节点,可以改小点
    }
}

你可能感兴趣的:(运维工具,#,Keepalived,运维,linux)