阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Keepalived高可用介绍与配置详解

488次阅读
没有评论

共计 8474 个字符,预计需要花费 22 分钟才能阅读完成。

keepalived 介绍

Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL 等)的高可用解决方案软件。

Keepalived 软件主要是通过 VRRP 协议实现高可用功能的。VRRP 是 Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

keepalived 的重要功能

keepalived 有三个重要的功能,分别是:

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

keepalived 高可用故障转移的原理

Keepalived 高可用服务之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol , 虚拟路由器冗余协议)来实现的。

在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活看,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。

VRRP , 全 称 Virtual Router Redundancy Protocol , 中文名为虚拟路由冗余协议,VRRP 的出现就是为了解决静态踣甶的单点故障问题,VRRP 是通过一种竞选机制来将路由的任务交给某台 VRRP 路由器的。

keepalived 工作原理描述

Keepalived 高可用对之间是通过 VRRP 通信的,因此,我们从 VRRP 开始了解起:

  1. VRRP, 全称 Virtual Router Redundancy Protocol, 中文名为虚拟路由冗余协议,VRRP 的出现是为了解决静态路由的单点故障。
  2. VRRP 是通过一种竟选协议机制来将路由任务交给某台 VRRP 路由器的。
  3. VRRP 用 IP 多播的方式(默认多播地址(224.0_0.18)) 实现高可用对之间通信。
  4. 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived 系统运维工作中都是一对。
  5. VRRP 使用了加密协议加密数据,但 Keepalived 官方目前还是推荐用明文的方式配置认证类型和密码。

介绍完 VRRP, 接下来我再介绍一下 Keepalived 服务的工作原理:

Keepalived 高可用是通过 VRRP 进行通信的,VRRP 是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived 服务之间,只有作为主的服务器会一直发送 VRRP 广播包, 告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性. 接管速度最快可以小于 1 秒。

keepalived 配置文件详解

keepalived 的主配置文件为 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {            #全局配置
   notification_email {         #定义报警收件人邮件地址
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc    #定义报警发件人邮箱
   smtp_server 192.168.200.1    #邮箱服务器地址
   smtp_connect_timeout 30      #定义邮箱超时时间
   router_id LVS_DEVEL          #定义路由标识信息,同局域网内唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {        #定义实例
    state MASTER            #指定 keepalived 节点的初始状态,可选值为 MASTER|BACKUP
    interface eth0          #VRRP 实例绑定的网卡接口,用户发送 VRRP 包
    virtual_router_id 51    #虚拟路由的 ID,同一集群要一致
    priority 100            #定义优先级,按优先级来决定主备角色,优先级越大越优先
    nopreempt               #设置不抢占
    advert_int 1            #主备通讯时间间隔
    authentication {        #配置认证
        auth_type PASS      #认证方式,此处为密码
        auth_pass 1111      #同一集群中的 keepalived 配置里的此处必须一致,推荐使用 8 位随机数
    }
    virtual_ipaddress {     #配置要使用的 VIP 地址
        192.168.200.16
    }
}

virtual_server 10.10.10.2 1358 {    #配置虚拟服务器
    delay_loop 6        #健康检查的时间间隔
    lb_algo rr          #lvs 调度算法
    lb_kind NAT         #lvs 模式
    persistence_timeout 50      #持久化超时时间,单位是秒
    protocol TCP        #4 层协议

    sorry_server 192.168.200.200 1358   #定义备用服务器,当所有 RS 都故障时用 sorry_server 来响应客户端

    real_server 192.168.200.2 1358 {    #定义真实处理请求的服务器
        weight 1                        #给服务器指定权重,默认为 1
        HTTP_GET {
            url {
              path /testurl/test.jsp    #指定要检查的 URL 路径
              digest 640205b7b0fc66c1ea91c463fac6334d   #摘要信息
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3       #连接超时时间
            nb_get_retry 3          #get 尝试次数
            delay_before_retry 3    #在尝试之前延迟多长时间
        }
    }

定制主配置文件

vrrp_instance 段配置

nopreempt      #设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先 \
级的机器成为 MASTER,而不抢占,则允许低优先级的机器继续成为 MASTER,即使高优先级 \
的机器已经上线。如果要使用这个功能,则初始化状态必须为 BACKUP。preempt_delay  #设置抢占延迟。单位是秒,范围是 0 ---1000,默认是 0. 发现低优先 \
级的 MASTER 后多少秒开始抢占。

vrrp_script 段配置

# 作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的 VRRP Instance 记录。#注意:至少有一个 VRRP 实例调用它并且优先级不能为 0. 优先级范围是 1 -254.
vrrp_script <SCRIPT_NAME> {...}

#选项说明:script "/path/to/somewhere"     #指定要执行的脚本的路径。interval <INTEGER>              #指定脚本执行的间隔。单位是秒。默认为 1s。timeout <INTEGER>               #指定在多少秒后,脚本被认为执行失败。weight <-254 --- 254>           #调整优先级。默认为 2.
rise <INTEGER>                  #执行成功多少次才认为是成功。fall <INTEGER>                  #执行失败多少次才认为失败。user <USERNAME> [GROUPNAME]     #运行脚本的用户和组。init_fail                       #假设脚本初始状态是失败状态。#weight 说明:1. 如果脚本执行成功 (退出状态码为 0),weight 大于 0,则 priority 增加。2. 如果脚本执行失败 (退出状态码为非 0),weight 小于 0,则 priority 减少。3. 其他情况下,priority 不变。

real_server 段配置

weight <INT>            #给服务器指定权重。默认是 1
inhibit_on_failure      #当服务器健康检查失败时,将其 weight 设置为 0,\
                        而不是从 Virtual Server 中移除
notify_up <STRING>      #当服务器健康检查成功时,执行的脚本
notify_down <STRING>    #当服务器健康检查失败时,执行的脚本
uthreshold <INT>        #到这台服务器的最大连接数
lthreshold <INT>        #到这台服务器的最小连接数 

tcp_check 段配置

connect_ip <IP ADDRESS>     #连接的 IP 地址。默认是 real server 的 ip 地址
connect_port <PORT>         #连接的端口。默认是 real server 的端口
bindto <IP ADDRESS>         #发起连接的接口的地址。bind_port <PORT>            #发起连接的源端口。connect_timeout <INT>       #连接超时时间。默认是 5s。fwmark <INTEGER>            #使用 fwmark 对所有出去的检查数据包进行标记。warmup <INT>    // 指定一个随机延迟,最大为 N 秒。可防止网络阻塞。如果为 0,则关闭该功能。retry <INIT>                #重试次数。默认是 1 次。delay_before_retry <INT>    #默认是 1 秒。在重试之前延迟多少秒。

keepalived 实现 nginx 负载均衡的高可用

环境:

  • CentOS7-linuxmi-192.168.26.128
  • centos7-linuxmi-192.168.83.132
  • 虚拟 IP(VIP)地址为 192.168.83.250
# 在两个机器上配置 yum 源及环境(这里只写出主机的,从机一样)[root@linuxmi ~]# systemctl stop firewalld
[root@linuxmi ~]# systemctl disable firewalld
[root@linuxmi ~]# setenforce 0
[root@linuxmi ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@linuxmi ~]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@linuxmi ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@linuxmi ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@linuxmi ~]# yum -y install epel-release vim wget gcc gcc-c++
#安装 keepalived
[root@linuxmi ~]# yum -y install keepalived
#安装 nginx
[root@linuxmi ~]# yum -y install nginx
[root@linuxmi ~]# cd /usr/share/nginx/html/
[root@linuxmi ~]# mv index.html{,.bak}
[root@linuxmi ~]# echo 'slave' > index.html
[root@linuxmi ~]# systemctl start nginx
[root@linuxmi ~]# systemctl enable nginx

修改配置文件

# 主机配置文件
[root@linuxmi ~]# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {router_id lb01}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linuxmi123
    }
    virtual_ipaddress {192.168.83.250}
}

virtual_server 192.168.83.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.83.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.83.132 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
EOF
# 从机配置文件
[root@linuxmi ~]# cat > /etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {router_id lb02}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linuxmi123
    }
    virtual_ipaddress {192.168.83.250}
}

virtual_server 192.168.83.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.83.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.83.132 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
EOF

keepalived 监控 nginx 负载均衡

主机

# 编写监控脚本
[root@linuxmi ~]# mkdir /scripts
[root@linuxmi ~]# cd /scripts/
[root@linuxmi scripts]# cat > check_n.sh <<EOF
#!/bin/bash
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [$nginx_status -lt 1];then
    systemctl stop keepalived
fi
EOF
[root@linuxmi scripts]# chmod +x check_n.sh
[root@linuxmi scripts]# cat > notify.sh <<EOF
#!/bin/bash
VIP=$2
sendmail (){subject="${VIP}'s server keepalived state is translate"content="`date +'%F %T'`: `hostname`'s state change to master"
        echo $content | mail -s "$subject" 1470044516@qq.com
}
case "$1" in
  master)
        nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [$nginx_status -lt 1];then
            systemctl start nginx
        fi
        sendmail
  ;;
  backup)
        nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [$nginx_status -gt 0];then
            systemctl stop nginx
        fi
  ;;
  *)
        echo "Usage:$0 master|backup VIP"
  ;;
esac
EOF
[root@linuxmi scripts]# chmod +x notify.sh

#修改主机配置
[root@linuxmi ~]# vim /etc/keepalived/
#按如下内容添加
global_defs {router_id lb01}

vrrp_script nginx_check {
    script "/scripts/check_n.sh"
    interval 1
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linuxmi123
    }
    virtual_ipaddress {192.168.83.250}
    notify_master "/scripts/notify.sh master 192.168.83.250"
    notify_backup "/scripts/notify.sh backup 192.168.83.250"
}

从机

[root@linuxmi ~]# mkdir /scripts
[root@linuxmi ~]# cd /scripts/
[root@linuxmi scripts]# cat > notify.sh <<EOF
#!/bin/bash
VIP=$2
sendmail (){subject="${VIP}'s server keepalived state is translate"content="`date +'%F %T'`: `hostname`'s state change to master"
        echo $content | mail -s "$subject" 1470044516@qq.com
}
case "$1" in
  master)
        nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [$nginx_status -lt 1];then
            systemctl start nginx
        fi
        sendmail
  ;;
  backup)
        nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [$nginx_status -gt 0];then
            systemctl stop nginx
        fi
  ;;
  *)
        echo "Usage:$0 master|backup VIP"
  ;;
esac
EOF
[root@linuxmi scripts]# chmod +x notify.sh

#修改配置文件
[root@linuxmi ~]# vim /etc/keepalived/
#按如下内容添加
vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass linuxmi123
    }
    virtual_ipaddress {192.168.83.250}
    notify_master "/scripts/notify.sh master 192.168.83.250"
    notify_backup "/scripts/notify.sh backup 192.168.83.250"
}

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计8474字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7991854
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...