keepalived

keepalived

介绍

https://www.cnblogs.com/clsn/p/8052649.html

keepalived时一款保障服务高可用的软件,其功能类似与heartbeat,用来防止单点故障,具有自动侦测服务器的状态,故障切换,添加恢复等功能;

三个重要功能:

  • 管理LVS负载均衡软件;
  • 实现LVS集群节点的健康检查;
  • 系统网络服务的高可用;

VRRP协议

即虚拟路由冗余协议,是一种容错协议,也是keepalived的实现基础,它保证了在具有多播或广播能力的局域网中,当某台路由器出现故障时,由另一台路由器来代替出现故障的路由器工作,而无需修改动态路由协议、路由发现协议等配置,解决了路由的单点故障问题。VRRP协议中的主要概念有:

  1. 虚拟路由器:由一个master和多个backup组成,主机将虚拟路由器当作默认网关;
  2. VRID:虚拟路由器的标识,由有相同VRID的一组路由器构成一个虚拟路由器;
  3. master:虚拟路由器中承担报文转发任务的路由器;
  4. backup:master故障时,代替master工作;
  5. vip:即虚拟IP,一个虚拟路由器可以拥有一个或多个vip;
  6. 虚拟mac:一个虚拟路由器拥有一个虚拟mac;
  7. ip拥有者:接口ip与虚拟ip相同的路由器;
  8. 优先级:选举master的依据;

VRRP协议工作原理:

  1. 路由器开启VRRP功能后,会组成一个路由器组(功能上相当于一台路由器,一般组内的路由器功能都相同),会根据优先级确定出1个Master,其他的为backup;
  2. master有一个对外提供服务的虚拟IP(vip),同时Master还会对内组播vrrp包;
  3. backup会接受vrrp包,且如果是抢占式,会比较优先级,若自己优先级更高,则Backup会抢占成为Master;若是非抢占式,则只要Master没有故障就不会出现新Master;
  4. 如果backup连续3次收不到VRRP包或者收到优先级为0的vrrp包,则会竞选新的Master;

VRRP负载分担:即多台路由器同时承担业务,避免设备闲置,具体实现方法就是将同一台路由器加入多个备份组,在不同组中拥有不同的优先级,使得该路由器在一个组中作为Master,在其他组中作为Backup;

体系结构

分为用户空间和内核空间:

  1. IPVS:IP虚拟服务器,是一种提供负载平衡功能的技术;
  2. NetLink:提供高级路由及其他网关相关的网络功能;
  3. WatchDog:监控checkers和VRRP进程的状况;
  4. Checkers:真实服务器的健康检查,是keepalived的主要功能;
  5. VRRP Stack:负载均衡器的故障切换;
  6. IPVS wrapper:发送设定的规则到内核的IPVS部分;
  7. Netlink Reflector:用来设定VRRP的vip地址;
  8. 控制面板:配置文件的编译和解析,是用到的时候解析;

安装

yum方式安装:yum install keepalived -y

下载安装:

下载地址:https://www.keepalived.org/download.html

  • 我这里安装的keepalived-2.0.20版本;
  • 安装依赖:yum install curl gcc openssl-devel libnl libnl-devel libnl3-devel net-snmp-devel -y
  • 解压安装包,依次执行:./configure --prefix=/data/keepalivedmake && make install;(configure执行完成时,要看看有没有报错)
  • 验证keepalived:执行keepalived然后通过ps查找对应进程(应该有3个);
    • core:负责主进程的启动,维护和全局配置文件的加载;
    • check:负责健康检查;
    • vrrp:实现vrrp协议;
  • 查看keepalived日志:tail -f /var/log/message

配置

https://www.keepalived.org/manpage.html

https://www.keepalived.org/doc/configuration_synopsis.html

keepalived只有一个配置文件keepalived.conf,里面主要配置区域包括:global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

global_defs

全局配置区域,主要设置通知机制和标志,具体如下:

global_defs {
    # 故障时收件邮件
    notification_email {
        a@abc.com
        b@abc.com
        ...
    }
    # 发件邮件
    notification_email_from alert@abc.com
    # 邮件的smtp地址和超时时间
    smtp_server smtp.abc.com
    smtp_connect_timeout 30
    # 开启smtp陷阱
    enable_traps
    # 本节点的标识字符串
    router_id test01
}

VRRP实例和组

vrrp_instance配置对外提供服务的vip及相关的属性;vrrp_sync_group用来定义vrrp_instance组,使得组内成员的动作一致,比如一个vrrp_instance发生故障切换,那么另一个也跟着故障切换;详细配置如下:

# 这个可以不要
vrrp_sync_group VG_1 {
    group {
        # vrrp_instance名称
        inside_network  VI_1
        # 对外的ip
        outside_network  192.168.48.101
        ...
    }
    # 表示切换为主/备/出错/任意动作时锁执行的脚本,若脚本有参数,需要用双引号
    notify_master /path/to_master.sh
    notify_backup /path/to_backup.sh
    notify_fault "/path/fault.sh VG_1"
    # 这个脚本执行时会自动添加三个参数:$1:GROUP或者INSTANCE;$2:组或实例名称;$3:切换成的状态,MASTER或BACKUP或FAULT
    notify /path/notify.sh
    # 开启邮件通知
    smtp_alert
}
vrrp_instance VI_1 {
    # master或者backup,只是说明
    state MASTER
    # 虚拟ip放置的网卡
    interface ens33
    # 监控以下网卡,任何一个不通都会切换到falt状态
    track_interface {
        ens33
        ...
    }
    # 0-255,用来区分多个instance,同一个集群的要一致
    virtual_router_id 51
    # 优先级(决定主备),越大越优先
    priority 100
    # 发vrrp包间隔时间(秒)
    advert_int 1
    # 认证
    authentication {
        # 推荐pass,即只识别密码前8位,还有HA;
        auth_type PASS
        # 同一集群应该相同
        auth_pass 1111
    }
    # 虚拟ip(vip)
    virtual_ipaddress {
        192.168.48.10
    }
    # 追踪实例脚本,访问实例时会执行脚本
    track_script {
        # vrrp_script部分定义的名称
        chk_http_port
    }
    # 非抢占式
    nopreempt
    # 抢占延时
    preempt_delay 300
    # 表示切换为主/备/出错/任意动作时锁执行的脚本
    notify_master /path/to_master.sh
    notify_backup /path/to_backup.sh
    notify_fault "/path/fault.sh VG_1"
    notify /path/notify.sh
    # 开启邮件通知
    smtp_alert
}

LVS配置

如果不使用lvs做负载均衡,只是做HA的话,可以不配置。lvs配置分为两个部分:

  • 虚拟服务器组(virtual_server_group):实现一台真实服务器的某个服务可以属于多个虚拟服务器,一般用不到;
  • 虚拟服务器(virtual_server):
# 可以配置多个
virtual_server 192.168.48.101 80 {
    # 轮询时间(秒)
    delay_loop 30
    # 调度算法
    lb_algo rr|wrr|lc|wlc|sh|dh|lblc
    # LVS调度类型,一般用DR
    lb_kind NAT|DR|TUN
    # 会话保持超时时间
    persistence_timeout 50
    # 一般都是TCP
    protocol TCP|UDP
    sorry_server 192.168.48.101 80
    # 可以配置多个
    real_server 192.168.48.101 80 {
        # 权重
        weight 1
        # 启动/宕机时执行的脚本
        notify_up /path/up.sh
        notify_down /path/down.sh
        # tcp方式健康检查
        TCP_CHECK {
            connect_port 80
            # 超时时间(秒)
            connect_timeout 3
            # 重试次数
            retry 3
            # 重连时间间隔(秒)
            delay_before_retry 2
        }
        # http get方式健康检查
        #HTTP_GET {
        #    url {
        #        path /
        #        status_code 200
        #    }
        #    connect_timeout 3
        #    retry 3
        #    delay_before_retry 3
        #}
    }
}

静态ip和路由

static_ipaddressstatic_routes配置本节点的ip和路由信息(一般情况下都会有IP地址和路由信息的,因此没必要配置这个):

static_ipaddress {
    # 格式符合linux下的ip命令参数的格式
    192.168.48.101
    ...
}

vrrp_script

用来做健康检查的:

vrrp_script chk_http_port {
    # 要执行的脚本(需要有执行权限)
    script "/data/xxx.sh"
    # 脚本执行时间间隔(秒)
    interval 3
    # 执行失败权重-10
    weight -10
}

主从切换与LVS

主从切换:需要master的keepalived停止或者将backup配置文件的priority(优先级)调整为比master高;

LVS

负载均衡可以采用硬件设备(如F5),也可以采用软件实现,一般用软件,LVS,即Linux虚拟服务器,是linux下的简单负载均衡实现;具有负载能力强、高可用、可以对基本所有应用做负载均衡等特点,如:tomcat、数据库等;且在用户看来,所有内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能、高可用服务,与nginx相比只是功能上逊于nginx;lvs+keepalived适用于大型网站的负载均衡;

三种转发规则:

  • NAT(网络地址翻译技术):调度器收到请求时,改写请求地址为真实地址,转发给服务器,请求处理后,又将源地址改成虚拟地址,返回给用户;
  • TUNL(IP隧道):调度器收到请求后直接转发给服务器,服务器处理完毕后直接返回给用户;
  • DR(直接路由技术):DR直接改写请求的mac地址,转发给服务器,服务器处理后直接返回给用户;(最高效,但是要求调度器与服务器在同一网段,只支持ip转发,即端口要一致)

linux2.4以后就已经是Linux标准内核的一部分,其提供的主要调度算法有:

  1. 轮询、加权轮询:rr、wrr;
  2. 最小连接、加权最小连接:lc、wlc;
  3. 局部性的最少连接:lblc(找最近使用的服务器,若不存在或超载则采用最小连接);
  4. 带复制的局部性最少连接:lblcr(找最近的一组服务器按最小连接,若都超载或不存在,则采用最小连接);
  5. 目标地址散列:dh;
  6. 源地址散列:sh;
  7. 最短预期延时:sed;
  8. 不排队:nq;

附:lvs负载均衡使用没有nginx灵活。

nginx双主HA

附:本来想用两台搭建一个对外VIP的keepalived+nginx的高可用、负载均衡架构,但是始终没有成功,作为代替,这里就使用了双主结构,即两个对外VIP,功能一样,即使宕机一台,两个VIP仍然都能正常访问。

keepalived+nginx实现HA的原理是:编写一个shell脚本去定时检测nginx的端口或者nginx进程,若发现nginx出问题则关闭keepalived的相关进程,从而实现keepalived的主从切换来达到nginx的高可用。当然,还可以在关闭keepalived之前尝试重启nginx,重启失败在关闭keepalived;

具体实现步骤如下:

  • 在两台服务器上启动nginx;
  • 编写nginx检查脚本chk_nginx.sh
#!/bin/bash

nginxstart=/data/nginx-1.16.1/sbin/nginx
function nginxps(){
    echo `ps -ef | grep nginx | grep -v grep | grep -v chk_nginx | wc -l`
}
n=`nginxps`
if [[ $n -lt 2 ]];then
    # 这里就不尝试重启nginx了
    # echo `date`'--->restart nginx...'
    # $nginxstart
    # 这里sleep的时间要小于interval设定的值
    # sleep 2
    # n=`nginxps`
    # if [[ $n -lt 2 ]];then
        echo 'kill keepalived...'
        killall keepalived
    # fi
fi
  • keepalived配置(另一台改下router_id,把MASTER改成BACKUP,BACKUP改成MASTER,priority也是):
! Configuration File for keepalived

global_defs {
    router_id test01
}

vrrp_script chk_nginx {
    script "/data/keepalived/chk_nginx.sh"
    interval 3
    weight -10
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.48.10
    }
    track_script {
        chk_nginx
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.48.11
    }
    track_script {
        chk_nginx
    }
}
  • 启动keepalived,搭建成功;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值