keepalived高可用集群(一)

目录

  • 集群Cluster
  • keepalived:
    • 组件:
    • KeepAlived实现
    • KeepAlived双主配置示例:

集群Cluster

集群类型:

  1. LB lvs/nginx(http/upstream, stream/upstream)
  2. HA 高可用性
    SPoF: Single Point of Failure
  3. HPC

系统可用性的公式:

A = M T B F / ( M T B F + M T T R ) A=MTBF/(MTBF+MTTR) A=MTBF/MTBF+MTTR

指标: 99%, …, 99.999%,99.9999%

提升系统高用性的解决方案之降低MTTR

手段:冗余redundant

  1. active/passive 主备
  2. active/active 双主
  3. active --> HEARTBEAT --> passive
  4. active <–> HEARTBEAT <–> active

高可用的是"服务"

HA nginx service:
  vip/nginx process[/shared storage]
资源:组成一个高可用服务的“组件”
(1) passive node的数量
(2) 资源切换

文件共享:

NAS:文件共享服务器;
SAN:存储区域网络,块级别的共享

网络分区:

quorum:法定人数
with quorum: > total/2
without quorum: <= total/2

集群脑裂:

指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

一些概念:

辅助设备:ping node, quorum disk
Failover:故障切换,即某资源的主节点故障时,将资源转移至其它节点的操作
Failback:故障移回,即某资源的主节点故障后重新修改上线后,将之前已转移至其它节点的资源重新切回的过程

HA Cluster实现方案:

  1. AIS:应用接口规范 完备复杂的HA集群
    RHCS:Red Hat Cluster Suite红帽集群套件
    heartbeat
    corosync
  2. VRRP协议实现:虚拟路由冗余协议
    keepalived

keepalived:

Keepalived是一个用C编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设施。 负载平衡框架依赖于众所周知且广泛使用的Linux虚拟服务器(IPVS)内核模块,提供Layer4负载均衡。

Keepalived实现了一组检查程序,以根据其健康状况动态地和自适应地维护和管理负载平衡的服务器池。另一方面,VRRP实现了高可用性 协议。VRRP是路由器故障转移的基础。

此外,Keepalived为VRRP有限状态机实现了一组挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived实现了BFD协议。VRRP状态转换可以考虑BFD提示来驱动快速状态转换。Keepalived框架可以单独使用,也可以一起使用,以提供灵活的基础架构。

VRRP协议:Virtual Router Redundancy Protocol

一些术语:

虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
物理路由器:
  master:主设备
  backup:备用设备
  priority:优先级
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)

通告:

心跳,优先级等;
周期性

工作方式:

抢占式
非抢占式

认证:

无认证
简单字符认证:预共享密钥
MD5

工作模式:

主/备:单虚拟路由器
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)

功能:

vrrp协议完成地址流动
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的各RS做健康状态检测
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

组件:

  1. 核心组件:

vrrp stack
ipvs wrapper
checkers

  1. 控制组件:

配置文件分析器

  1. IO复用器
  2. 内存管理组件

KeepAlived组成

KeepAlived实现

  1. HA Cluster 配置准备:
    (1) 各节点时间必须同步
    (2) 确保iptables及selinux不会成为阻碍
    (3) 各节点之间可通过主机名互相通信
    (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信
  2. Keepalived安装:
yum -y install keepalived
  1. 程序环境:
    主配置文件:/etc/keepalived/keepalived.conf
    环境配置文件:/etc/sysconfig/keepalived

  2. KeepAlived配置
    配置语法:

[ka1]$ vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {   #全局配置
    notification_email {   # 邮件通知,keepalived故障时,发邮件
       root@localhost    #邮箱地址
    }
    notification_email_from keepalived@localhost  #邮件从哪发出去
    smtp_server 127.0.0.1    #邮件服务器stmp地址
    smtp_connect_timeout 30  #超时时间
    router_id ka1  #主机名
    #vrrp_skip_check_adv_addr   #跳过检查数据报文,默认检查
    #vrrp_strict    #严格遵守vrrp协议,没有vip,单播地址,ipv6将无法启动
    #vrrp_iptables  #不生成iptables规则
    vrrp_mcast_group4 224.100.100.100   #组播,默认发224.0.0.18
    #vrrp_garp_interval 0   #arp报文发送延迟
    #vrrp_gna_interval 0   #消息发送延迟
}


#配置虚拟路由器:
vrrp_instance VI_1 {   #配置实例的名称
    nopreempt  #定义工作模式为非抢占模式
    preempt_delay 300  #抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
    state MASTER    #主MASTER,从BACKUP
    interface eth0   #绑定为当前虚拟路由器使用的物理接口
    virtual_router_id 66  #当前虚拟路由器惟一标识,范围是0-255
    priority 100   #优先级,范围1-254
    advert_int 1   #vrrp通告的时间间隔,默认1s
    authentication {   #认证机制
        auth_type PASS   # {AH|PASS},设置密码类型,
        auth_pass 123   #密码
    }
    virtual_ipaddress {
        192.168.99.99/24 dev eth0 label eth0:1  #设置虚拟网卡
    }
    track_interface {  #配置监控网络接口,一旦出现故障,则转为FAULT状态 实现地址转移
        eth0
    }
}

定义通知脚本:

notify_master <STRING>|<QUOTED-STRING>#当前节点成为主节点时触发的脚本

notify_backup <STRING>|<QUOTED-STRING>#当前节点转为备节点时触发的脚本

notify_fault <STRING>|<QUOTED-STRING>#当前节点转为“失败”状态时触发的脚本

notify <STRING>|<QUOTED-STRING>#通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

脚本的调用方法:

[ka1]$ vim /etc/keepalived/keepalived.conf
#在vrrp_instance VI_1 语句块最后面加下面行
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

示例通知脚本

#!/bin/bash
#
contact='root@localhost'
notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
    master)
        notify master
        ;;
    backup)
        notify backup
        ;;
    fault)
        notify fault
        ;;
    *)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac

日志配置

[ka1]$ vim /etc/sysconfig/keepalived
    KEEPALIVED_OPTIONS="-D -S 6"

[ka1]$ vim /etc/rsyslog.conf
    local6.*       /data/keepalived.log

邮件设置

vim ~/.mailrc 或 /etc/mail.rc

set [email protected]
set smtp=smtp.qq.com
set [email protected]
set smtp-auth-password=lzhdjmtznbftbiai
set smtp-auth=login
set ssl-verify=ignore

测试:echo test mail | mail –s test [email protected]

KeepAlived双主配置示例:

! Configuration File for keepalived
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node1
    vrrp_mcast_group4 224.0.100.100
}

#提供一个服务
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 6  #注意不能一样
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 571f97b2
    }
    virtual_ipaddress {
        192.168.0.100/24 dev eth0   #和下面是不同的VIP
    }
}

#提供另一个服务
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 8   #注意不能一样
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 578f07b2
    }
    virtual_ipaddress {
        192.168.0.200/24 dev eth0  #和上面是不同的VIP
    }
}

你可能感兴趣的:(keepalived高可用集群)