当前位置: 首页 > news >正文

利用keepalived达成服务高可用

官方网站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通告的时间间隔,默认1sauthentication {auth_type PASS   #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 1111  #预共享密钥,仅前8位有效#同一个虚拟路由器的多个keepalived节点必须一样}virtual_ipaddress {#虚拟IP,生产环境可能指定上百个IP地址192.168.200.16192.168.200.17192.168.200.18}
}

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


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

3.配置解析

3.1全局配置

#全局配置
global_defs {notification_email { #keepalived 发生故障切换时邮件发送的目标邮箱acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.loc #发邮件地址smtp_server 192.168.200.1#邮件服务器地址smtp_connect_timeout 30   #邮件服务器连接timeoutrouter_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,默认32172.25.254.101/24 dev eth1172.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 6lb_algo wrrlb_kind DRprotocol TCP#sorry_server 172.25.254.30real_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5nb_get_retry 3delay_before_retry 3connect_port 80}
}
real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1nb_get_retry 3delay_before_retry 1}}
}
virtual_server 172.25.254.200 80 {delay_loop 6lb_algo wrrlb_kind DRprotocol TCP#sorry_server 172.25.254.30real_server 172.25.254.40 80 {weight 1TCP_CHECK {connect_timeout 5nb_get_retry 3delay_before_retry 3connect_port 80}
}
real_server 172.25.254.50 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 1nb_get_retry 3delay_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 webserverbind 172.25.254.100:80server web1 172.25.254.101:80 checkserver 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_1SCRIPT_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 1weight -30fall 2rise 2timeout 2
}

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

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

测试

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git使用方法(二)---常用命令-半小时学会git
  • rust 编译时报错:type annotations needed for Box
  • ant design pro v6 如何做好角色管理
  • FastAPI部署大模型Llama 3.1
  • STM32标准库学习笔记-6.定时器-输入捕获
  • final
  • Redis5优化-Redis
  • Burp Suite、Wireshark与Fiddler:三款网络工具深度解析与比较
  • 【C++篇】迈入新世界的大门——初识C++(上篇)
  • JavaEE篇:多线程(1)
  • 计算机网络中用于远程访问和文件传输的不同方式
  • 数据结构入门——07堆
  • Spring Boot自动配置原理
  • 乌龟对对碰在线版
  • 第七十四:前端实现点击页面某个菜单跳转到对应的锚点功能
  • [NodeJS] 关于Buffer
  • E-HPC支持多队列管理和自动伸缩
  • IndexedDB
  • iOS 系统授权开发
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python学习笔记 字符串拼接
  • 基于Android乐音识别(2)
  • 基于webpack 的 vue 多页架构
  • 力扣(LeetCode)357
  • 漂亮刷新控件-iOS
  • 思维导图—你不知道的JavaScript中卷
  • 微服务核心架构梳理
  • Spring第一个helloWorld
  • 阿里云移动端播放器高级功能介绍
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • # centos7下FFmpeg环境部署记录
  • # Kafka_深入探秘者(2):kafka 生产者
  • #define
  • #if #elif #endif
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (26)4.7 字符函数和字符串函数
  • (SERIES12)DM性能优化
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计高校学生选课系统
  • (接口自动化)Python3操作MySQL数据库
  • (十七)Flink 容错机制
  • (转载)利用webkit抓取动态网页和链接
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET简谈设计模式之(单件模式)
  • .NET文档生成工具ADB使用图文教程
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ 转载 ] SharePoint 资料
  • [].slice.call()将类数组转化为真正的数组