利用keepalived达成服务高可用

news2024/12/24 8:51:53

官方网站Keepalived for Linux

1.keepalived简介

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

健康检查失败切换是keepalived的两大核心功能

  • 健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
  • 而失败切换主要是应用于配置了主备模式的服务器,利用VRRP协议维持主备服务器的心跳,当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性

2.选举机制

既然有主备就会有选举机制,那么我们keepalived的选举机制如下

非抢占模式(默认),只要Master不挂掉,优先级高的路由器只能等待  

vrrp_instance VI_1 {
    state MASTER #主服务器 BACKUP 对应是从服务器
    interface eth0 #对应网卡
    virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一
    priority 100     #当前物理节点在此虚拟路由器的优先级,范围:1-254
                     #值越大优先级越高,每个keepalived主机节点此值不同
    advert_int 1        #vrrp通告的时间间隔,默认1s
    authentication {
        auth_type PASS   #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
        auth_pass 1111  #预共享密钥,仅前8位有效
                        #同一个虚拟路由器的多个keepalived节点必须一样
    }
    virtual_ipaddress {#虚拟IP,生产环境可能指定上百个IP地址
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

抢占模式,一旦有优先级高的路由器加入,立即成为Master,


priority 100 #优先级高
nopreempt #非抢占模式 加入

3.配置解析

3.1全局配置

#全局配置
global_defs {
   notification_email { #keepalived 发生故障切换时邮件发送的目标邮箱
     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   #邮件服务器连接timeout
   router_id LVS_DEVEL   #每个keepalived主机唯一标识
   vrrp_skip_check_adv_addr    #对所有通告报文都检查,会比较消耗性能,收到的通告报文和上一
                               个路由器一样则跳过检查
   vrrp_strict
    #严格遵循vrrp协议
    #启用此项后以下状况将无法启动服务:
    #1.无VIP地址
    #2.配置了单播邻居
    #3.在VRRP版本2中有IPv6地址
    #建议不加此项配置
   vrrp_garp_interval 0 #报文发送延迟,0表示不延迟
   vrrp_gna_interval 0  #消息发送延迟
#vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}

3.2 虚拟路由配置

vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一
个网卡
virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一
                        #否则服务无法启动
                        #同属一个虚拟路由器的多个keepalived节点必须相同
                        #务必要确认在同一网络中此值必须唯一
priority 100            #当前物理节点在此虚拟路由器的优先级,范围:1-254
                        #值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1            #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS          #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
auth_pass 1111             #预共享密钥,仅前8位有效
                           #同一个虚拟路由器的多个keepalived节点必须一样
        }
virtual_ipaddress {        #虚拟IP,生产环境可能指定上百个IP地址
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
            172.25.254.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
            172.25.254.101/24 dev eth1
            172.25.254.102/24 dev eth2 label eth2:1
        }
}

4.keepalived 单主架构

4.1 配置环境

        后面环境通用

主机ip服务
client172.25.254.10客户端
keepalived1172.25.254.20
keepalived2172.25.254.30
web1 rs1172.25.254.40
web2 rs2172.25.254.50

4.2 keepalived1 配置

为了美观性和方便理解我们采用子配置书写

cd /etc/keepalived/conf.d

vim router.conf

添加虚拟路由并作为我们的VIP虚拟访问IP

systemctl restart keepalived

重启服务后查看虚拟IP是否添加成功

同理对keepalived2做相同操作

由于是单骨架我们的BACKUP服务器不会启动也就不会有虚拟路由,当我们关闭keepalived1上的服务时我们的服务才会转移到keepalived2上去

5.keepalived 双主架构

cp -p router.conf router1.conf 为了方便我们直接复制即可

也就是配置两个虚拟路由IP一人当一个虚拟IP的master

6.组播传输和单波传输

vrrp_mcast_group4 IP#指定组播IP地址范围

测试:tcpdump -i ens33 -nn host 224.0.0.18

# 启用 vrrp_strict 时,不能启用单播 , 否则服务无法启动 , 并在 messages 文件中记录下面信息
unicast_src_ip 172.25.254.20 # 本机 IP
unicast_peer {
172.25.254.30 # 指向对方主机 IP
# 如果有多个 keepalived, 再加其它节点的 IP
}

组播如下配置

测试 tcpdump -i ens33 vrrp -n

tcpdump -i eth0 -nn host 224.0.0.18

测试:

单波

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
unicast_src_ip <IPADDR> # 指定发送单播的源 IP
unicast_peer {
<IPADDR> # 指定接收单播的对方目标主机 IP
......
}

测试

7.实现双主架构下的LVS-DR

7.1 虚拟服务器配置

virtual_server IP port { #VIP PORT
delay_loop <INT> # 检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法
lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写
persistence_timeout <INT> # 持久连接时长
protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCP
sorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址
real_server <IPADDR> <PORT> { #RS IP PORT
weight <INT> #RS 权重
notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本
notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状
态检测方法
}
}
# 注意 : 括号必须分行写 , 两个括号写在同一行 , : }} 会出错

7.2 检测服务存活方法

TCP监测 传输层检测: TCP_CHECK
TCP_CHECK {
        connect_ip <IP ADDRESS> #向当前 RS 的哪个 IP 地址发起健康状态检测请求
        connect_port <PORT> #向当前 RS 的哪个 PORT 发起健康状态检测请求
        bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址
        bind_port <PORT> #发出健康状态检测请求时使用的源端口
        connect_timeout <INTEGER> #客户端请求的超时时长
        #等于 haproxy timeout server
}
应用层检测  HTTP_GET|SSL_GET
HTTP_GET|SSL_GET {
        url {
                path <URL_PATH> #定义要监控的URL
                status_code <INT> #判断上述检测机制为健康状态的响应码,一般为 200
        }
        connect_timeout <INTEGER> #客户端请求的超时时长 , 相当于haproxy的timeout server        
        nb_get_retry <INT> #重试次数
        delay_before_retry <INT> #重试之前的延迟时长
        connect_ip <IP ADDRESS> #向当前 RS 哪个 IP 地址发起健康状态检测请求
        connect_port <PORT> #向当前 RS 的哪个 PORT 发起健康状态检测请求
        bindto <IP ADDRESS> #向当前 RS 发出健康状态检测请求时使用的源地址
        bind_port <PORT> #向当前 RS 发出健康状态检测请求时使用的源端口
}
virtual_server 172.25.254.100 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP
        #sorry_server 172.25.254.30

real_server 172.25.254.40 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}
real_server 172.25.254.50 80 {
        weight 1
        HTTP_GET {
            url {
                        path /
                        status_code 200
                }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
                }
        }
}
virtual_server 172.25.254.200 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP
        #sorry_server 172.25.254.30

real_server 172.25.254.40 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}
real_server 172.25.254.50 80 {
        weight 1
        HTTP_GET {
            url {
                        path /
                        status_code 200
                }
        connect_timeout 1
        nb_get_retry 3
        delay_before_retry 1
                }
        }
}

写入子配置文件 vim  /etc/keepalived/lvs.conf

7.3 配置web服务器

ip addr add 172.25.254.100/32 dev lo
 

systemctl restart ipvsadm.service

systemctl restart keepalived 

测试

8.实现HAProxy高可用

8.1 配置环境

RS1和RS2

vim  /etc/sysctl.d/arp.conf

keepalive1和keepalive2

将lvs里面的虚拟主机配置文件删掉或者替换

将 由于我们haproxy需要监控vip但本机没有需要开启一个内核参数,让其能监控不在本机的Ip

在两个 ka1 ka2 两个节点启用内核参数
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1

8.2 配置基础haproxy

在keepalived上下载haproxy
写入基本配置
listen webserver
    bind 172.25.254.100:80
    server web1 172.25.254.101:80 check
    server web2 172.25.254.102:80 check

8.3 keepalived启用脚本

为了保证我们haproxy的高可用我们需要写一个脚本去检测haproxy服务的存活

我们采用killall -0 haproxy 来检查haproxy服务是否运行,当然也可采用其他方法

mkdir  /etc/keepalived/conf.d/scripts

vim  /etc/keepalived/conf.d/scripts/haproxy.sh

#haproxy 内容
#!/bin/bash
/usr/bin/killall -0 haproxy

赋予脚本可执行权限

keepalived 调用脚本
track_script {
    SCRIPT_NAME_1
    SCRIPT_NAME_2
}
定义脚本
vrrp_script <SCRIPT_NAME> {
    script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
    OPTIONS
}
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell 命令或脚本路径
interval <INTEGER> # 间隔时间,单位为秒,默认 1
timeout <INTEGER> # 超时时间
weight <INTEGER:-254..254> # 默认为 0, 如果设置此值为负数,
# 当上面脚本返回值为非 0
# 会将此值与本节点权重相加可以降低本节点权重,
# 即表示 fall.
# 如果是正数,当脚本返回值为 0
# 会将此值与本节点权重相加可以提高本节点权重
# 即表示 rise. 通常使用负值
fall <INTEGER> # 执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上
rise <INTEGER> # 执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME] # 执行监测脚本的用户或组
init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
操作实例 

 vim /etc/keepalived/conf.d/haproxy.conf

vrrp_script check_haproxy {
        script "/etc/keepalived/conf.d/scripts/haproxy.sh"
        interval 1
        weight -30
        fall 2
        rise 2
        timeout 2
}

 vim /etc/keepalived/conf.d/router.conf

vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 20
        priority 100
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }
        virtual_ipaddress {
                172.25.254.100/24 dev ens33 label ens33:0
        }
        unicast_src_ip 172.25.254.20
        unicast_peer {
                172.25.254.30
        }
        track_script{  #新加入的作用是调用
                check_haproxy
        }
}

测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux网络】NAT技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 随着互联网的飞速发展&#xff0c;IP地址资源日益紧张&#xff0c;这促使了NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术的诞生与发展。NAT技术不仅解决了IPv4…

webshell免杀--免杀入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理webshell免杀的一些基础思路 入门级&#xff0c;不是很深入&#xff0c;主要是整理相关概念 免杀对象 1.各类杀毒软件 类似360&#xff0c;火绒等&#xff0c;查杀己方webshell的软件。 2.各类流量…

计算机网络系统速成

Http与Https Http与Https是两种重要的网络通信协议&#xff0c;它们在Web通信中扮演着关键角色。以下是对Http与Https的详细解析&#xff1a; 一、Http&#xff08;超文本传输协议&#xff09; 1. 定义与功能 定义&#xff1a;Http&#xff08;HyperText Transfer Protocol…

打卡学习Python爬虫第三天|电影天堂案例

一、明确需求 目标&#xff1a;爬取最新更新的电影的豆瓣链接 观察网页和页面源代码&#xff0c;每部电影都有一个超链接去到子页面&#xff0c;我们需要的内容在子页面&#xff0c;如果我们一个一个子页面的去爬取会比较麻烦&#xff0c;可以尝试先通过首页爬取子页面的超链…

指针初阶(指针类型转换的使用、指针数组)

一.指针基础 0.指针的大小 指针指向的是一块地址&#xff0c;所以指针存储的是地址&#xff0c;例如在32位系统中。定义了一个int32_t类型的变量。使用int32_t *定义一个指针&#xff0c;使其指向该变量。 设该变量存储在地址为00000000000000000000000000000001&#xff08;3…

远程调用-OpenFeign(一)

目录 1.RestTemplate存在问题 2.OpenFeign介绍 一、主要特点 二、应用场景 3.OpenFeign快速上手 3.1引入依赖 3.2添加注解 3.3编写OpenFeign的客户端 3.4远程调用 ​编辑3.5测试 4.OpenFeign参数传递 4.1传递单个参数 4.2传递多个参数 4.3传递对象 4.4传递JSO…

编程修炼之Hibernate--- springboot启动初始化ddl过程

文章目录 跟踪Springboot整合hibernate的启动代码&#xff1a; 开始初始化 entityManagerFactory 创建方言 dialect 继续排查

Koa商城项目-轮播图模块(后端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 后端逻辑分析 首先编写route->banner.router.js /*** author: zxb* date: 2024-08-06…

Socket编程TCP 基础

一.什么是Socket(套接字&#xff09; 定义&#xff1a;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#x…

【文献阅读】A Comprehensive Review of Multimodal Large Language Models

一、回顾 MLLMs 在语言、图像、视频和音频处理等多模态任务中表现出色。这些模型通过整合多模态信息来增强多模态任务的有效性。 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;如文本生成和机器翻译&#xff0c;MLLMs 利用图像、视频和音频提供上下文支持&am…

C#开发实验--卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例

前不久在公众号GIS研发看到了暑假公益C#开发教程&#xff0c;教大家ArcGIS Engine开发。 想到了自己本科阶段也学习了C#开发和AE开发&#xff0c;学习了使用C#添加空间等&#xff0c;进行卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例。 下面的…

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难&#xff0c;但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用&#xff0c;因此小编今天带给大家二叉搜索树的原理及实现&#xff0c;话不多说&#xff0c;开始学习&#xff01;~~…

<Linux> git

在使用git之前&#xff0c;要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时&#xff0c;需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…