文章目录

  • 前言
  • 安装与启动
  • ubuntu安装
  • centos安装
  • 启动
  • 配置
  • 全局配置
  • 全局定义
  • 静态路由配置
  • vrrpd配置
  • vrrp同步组(synchroization group)
  • vrrp脚本(vrrp script)
  • vrrp实例(vrrp instance)
  • LVS配置
  • 常用示例


前言

  1. 高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将这个称之为高可用
  2. keepalived工作原理:通过vrrp协议实现
  • vrrp:虚拟路由冗余协议
  • keepalived启动后会有三个进程
  • 父进程:内存管理,子进程管理等
  • 子进程:VRRP子进程
  • 子进程:healthchecker子进程
  • 过程:两个子进程都被系统WatchDog看管,两个子进程各自负责自己的事,healthchecker子进程负责检查各自服务器的健康程度,如果healthchecker子进程检查到master上服务不可用了,就会通知本机上的兄弟vrrp子进程,让其删除通告,并且去除虚拟ip,转为backup状态
  • 工作方法:当master故障后,vip和mac地址自动飘移到backup(master和backup会每隔1s向组播地址发送数据包,来检测主或备是否存活),这时会通知下端主机刷新arp表
  1. keepalived工作方式:抢占式、非抢占式

安装与启动

ubuntu安装

  1. 安装:apt-get install keepalived
  2. 安装依赖:apt-get install curl gcc libssl-dev libnl-3-dev libnl-genl-3-dev libsnmp-dev
  3. 初始化脚本:ln -s /etc/init.d/keepalived.init /etc/rc2.d/S99keepalived

centos安装

  1. 安装:yum install keepalived
  2. 安装依赖:yum install curl gcc openssl-devel libnl3-devel net-snmp-devel
  3. 初始化脚本:ln -s /etc/rc.d/init.d/keepalived.init /etc/rc.d/rc3.d/S99keepalived

启动

可用systemctl或service进行管理

  1. 启动:sudo service keepalived start|sudo systemctl start keepalived
  2. 重启:sudo service keepalived restart|sudo systemctl restart keepalived
  3. 停止:sudo service keepalived stop |sudo systemctl stop keepalived
  4. 查看状态:sudo service keepalived status |sudo systemctl status keepalived

配置

官方配置文档:https://www.keepalived.org/manpage.html

全局配置

全局定义

global_defs #全局配置标识,表明这个区域{}是全局配置
{
    notification_email
    {
        admin@example.com # 表示发送通知邮件时邮件源地址是谁
    }
    notification_email_from admin@example.com # 表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个notification_email_from admin@example.com
    smtp_server 127.0.0.1 # 表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
    stmp_connect_timeout 30 # 连接smtp连接超时时间
    router_id node1 # 机器标识,数字,全网唯一,不可重复
}

静态路由配置

实际就是给服务器配置真实的ip地址和路由的,在复杂的环境下可能需要配置,一般不会用这个来配置,直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置

# 静态地址配置
static_ipaddress
{
    192.168.1.1/24 brd + dev eth0 scope global # 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
    192.168.1.2/24 brd + dev eth1 scope global # 就是给eth1配置IP地址
}
# 静态路由配置
static_routes
{
    src $SRC_IP to $DST_IP dev $SRC_DEVICE # 路由和ip同理,一般这个区域不需要配置
    src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
}

vrrpd配置

vrrp同步组(synchroization group)

vrrp_sync_group VG_1 { # VG_1全网唯一,不可重复
    group {
        http # 实例名
        mysql # 实例名
    }
    notify_master /path/to/to_master.sh # 表示当切换到master状态时,要执行的脚本
    notify_backup /path_to/to_backup.sh # 表示当切换到backup状态时,要执行的脚本
    notify_fault "/path/fault.sh VG_1"
    notify /path/to/notify.sh
    smtp_alert # 表示切换时给global defs中定义的邮件地址发送邮件通知
}

vrrp脚本(vrrp script)

vrrp_script check_running { # check_running为script名字
   script "/usr/local/bin/check_running" # 定义脚本所在路径
   interval 10 # 脚本执行的间隔
   weight 10 # 脚本执行的优先级变更
}

vrrp实例(vrrp instance)

vrrp_instance http {
    # 指定实例的初始状态
    # 抢占模式设置为MASTER和BACKUP, 结合priority优先级使用,当设置为master时,通过优先级判断,优先级高的抢占为master
    # 非抢占模式设置为BACKUP和BACKUP,结合priority使用,并且将priority设置成一样的值
    state MASTER 
    interface eth0 # 实例绑定的网卡,因为在配置虚拟ip的时候必须在已有的网卡上添加
    dont_track_primary # 忽略vrrp的interface错误
    track_interface { # 跟踪接口设置额外的监控,里面任一2网卡出现问题,都会进入fault状态
        eth0
        eth1
    }
    mcast_src_ip <IPADDR> # 发送多播数据包时的源ip地址,实际就是那个地址上发送vrrp通告,相当于heartbeat的心跳端口,默认为绑定的网卡ip(interface指定的ip地址)
    garp_master_delay 10 # 切换到master状态后,延迟进行免费的APR请求
    virtual_router_id 51 # 虚拟路由id,相同的virtual_router_id为一个组,决定多播的mac地址,全网唯一
    priority 100 # 优先级,高的为master
    advert_int 1 # 检查间隔,默认1s
    authentication { # 设置认真个
        auth_type PASS # 认证方式 PASS或AH
        autp_pass 1234 # 认证密码
    }
    virtual_ipaddress { # vip,虚拟ip地址,随着state的变化而增加删除,当state为master的时候添加,为backup的时候删除,只有是由优先级决定的,跟state设置的值没有多大关系,可以设置多个ip地址
        #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
        192.168.200.17/24 dev eth1
        192.168.200.18/24 dev eth2 label eth2:1
    }
    virtual_routes { # 增加和删除路由
        # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
        src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
        192.168.110.0/24 via 192.168.200.254 dev eth1
        192.168.111.0/24 dev eth2
        192.168.112.0/24 via 192.168.100.254
    }
    nopreempt # 设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须必另外的高
    preemtp_delay 300 # 抢占延迟
    debug # debug级别
    notify_master /path/to/to_master.sh # 表示当切换到master状态时,要执行的脚本
    notify_backup /path_to/to_backup.sh # 表示当切换到backup状态时,要执行的脚本
    
    track_script { # 在实例引用脚本,类似脚本中的函数引用一样,先定义,后引用函数名
        check_running weight 20
    }
}

注意vrrp脚本合vrrp实例属于同一个级别

LVS配置

这里是专门为keepalived+LVS集成准备的,并不是真的安装LVS然后用ipvsadm来配置,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定,了解即可

常用示例

! Configuration File for keepalived

global_defs {
}
vrrp_script service_check {
 script "/etc/keepalived/service_check.sh"
 interval 10
 weight 10
}

vrrp_instance service_one {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 100
    #nopreempt
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.66.1.124
    }

    notify_master /etc/keepalived/to_master.sh
    notify_backup /etc/keepalived/to_slave.sh

    track_script {
        service_check
    }
}