转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
使用 keepalived 搭建高可用服务 - 简书
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.jianshu.com](https://www.jianshu.com/p/05f207e0e228) ### 1. 理论篇 #### 1.1 Keepalived 与 VRRP 如果网络中只部署一个路由器,那么这个路由器坏了,整个网络就会瘫痪。因此,在高可用设计下,一般都会部署一对路由器,一主一备。当主路由器坏了之后,就启用备用路由器。 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称 VRRP)就是为以上情景设计的,它是由 IETF 提出的解决局域网中配置静态网关出现单点失效现象的路由协议。其原理如下: * 设定一个虚拟 IP(Virtual IP Address,VIP) * 多个冗余设备(服务器、路由器等)在选举阶段确定谁将最终获得这个虚拟 IP * 在同一时刻只允许一个设备拥有该虚拟 IP * VRRP 检测到主设备发生故障时,迅速将虚拟 IP 漂移到备用设备 服务器高可用问题也可以用相同的方法解决,Keepalived 就是这样一款产品,它同时实现了该协议的第二版和第三版。除此之外,Keepalived 还基于 IPVS(Linux IP Virtual Server)实现了负载均衡功能。 #### 1.2 VRRP 工作流程 1. 给每个 VRRP 的服务器设置一个权重 2. 权重最高的服务器将获得虚拟 IP 3. 确定主机以后,主机将定期给备机发送心跳消息 4. 一旦主机出现故障,最高权重的备机将获得虚拟 IP 继续提供服务 5. 如果运行在`抢占模式`,一旦有更高权重的服务器加入,就会自动获得虚拟 IP,成为主机 注意: * 协议规定主服务器权重为 255,其他备机权重小于 255。实际应用中,只要保证主服务器权重最高即可。 * 当主机接管虚拟 IP 时,会广播一个 ARP 消息,通知网络中的其他服务器与虚拟 IP 关联的 MAC 地址。这样就可以保证 2 层网络通信可以正常运行,同时可以加快虚拟 IP 的漂移。 #### 1.3 数据包格式 ![](/media/202304/2023-04-28_103149_5207720.7906363288056985.png) Picture2_2.png 通过 VRRP 的消息包,我们可以更好地了解 VRRP 是如何工作的。如上是通过`Wireshark`获取的 VRRP 广播消息: * 无论以太网还是 IP 网消息的目的地址都是组播地址,意味着消息将会发给网络上所有的主机 * VRRP 使用 112 端口,注意防火墙设置 * 网络中可能有多个 VRRP 实力,需要设置唯一的 VRID ### 2. 实践篇 #### 2.1 安装 Keepalived 下面以 ubuntu 18.04 LT 为例: ``` # 通过snap安装 snap install keepalived --classic # 查看版本 keepalived --version # 检查运行状态 snap services # 启动/停止服务 snap start keepalived snap stop keepalived ``` #### 2.2 配置 Keepalived Keepalived 的配置文件位于`/etc/keepalived/keepalived.conf` ``` # 主机配置 vrrp_instance VRRP_1 { # 设定一个VRRP的实例,名称为V1 state MASTER # 设定服务器的初始状态为 MASTER interface enp0s3 # 绑定网卡 virtual_router_id 60 # 网络中唯一的 VRRP 实例 ID priority 200 # 权重 advert_int 1 # 每隔1秒广播消息 authentication { auth_type PASS # 认证模式:文本密码 auth_pass 12345 # 密码 } virtual_ipaddress { 192.168.1.222/24 # 虚拟IP } } # 备机配置 vrrp_instance VRRP_1 { state BACKUP interface enp0s3 virtual_router_id 60 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.222/24 } } ``` 配置好之后,重启一下 keepalived 服务,可以看到以下网络信息: ``` # 主机,拥有虚拟IP ip -brief address show lo UNKNOWN 127.0.0.1/8 ::1/128 enp0s3 UP 192.168.1.174/24 192.168.1.222/24 fe80::a00:27ff:fee6:cf3b/64 # 备机 ip -br a lo UNKNOWN 127.0.0.1/8 ::1/128 enp0s3 UP 192.168.1.175/24 fe80::a00:27ff:fe0c:b917/64 ``` 如果我们将主机服务关闭,虚拟 IP 会自动切换到备机: ``` # 主机 snap stop keepalived.daemon ip -br a lo UNKNOWN 127.0.0.1/8 ::1/128 enp0s3 UP 192.168.1.174/24 fe80::a00:27ff:fee6:cf3b/64 # 备机 ip -br a lo UNKNOWN 127.0.0.1/8 ::1/128 enp0s3 UP 192.168.1.175/24 192.168.1.222/24 fe80::a00:27ff:fe0c:b917/64 ``` #### 2.3 监控 VRRP 通信 ``` # 主机 tcpdump proto 112 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes 05:05:00.615010 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 05:05:01.615515 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 05:05:02.616139 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 05:05:03.616957 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 05:05:04.617905 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 05:05:05.618120 IP dev4 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 60, prio 200, authtype simple, intvl 1s, length 20 ^C 6 packets captured 6 packets received by filter 0 packets dropped by kernel ``` ### 3. 进阶篇 默认情况下,Keepalived 通过心跳监测主机故障。除此之外,Keepalived 还提供更细粒度的故障监测方法。 #### 3.1 监测进程 以监测 Apache 服务为例: ``` vrrp_track_process track_apache { # 定义名为 track_apache 的进程监测指令 process httpd # Apache服务进程 weight 10 # 权重 } vrrp_instance VRRP_1 { state MASTER interface enp0s3 virtual_router_id 60 priority 200 # 如果http运行正常,权重为 200 + 10 = 210,否则为200 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.222/24 } track_process { track_apache # 使用进程监测指令 } } ``` #### 3.2 检测文件 如果文件权重为 0,那么文件中任何非 0 值,都认为是故障。 如果文件权重为非 0 值,那么权重为文件中的值乘以文件权重。 ``` vrrp_track_file track_app_file { # 定义名为 track_app_file的文件监测指令 file /var/run/my_app/vrrp_track_file } vrrp_instance VRRP_1 { state MASTER interface enp0s3 virtual_router_id 60 priority 200 # 如果文件中的值为5,权重为 200 + 5 * 1 = 205 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.222/24 } track_process { track_app_file weight 1 # 使用文件监测指令,权重为1 } } ``` #### 3.3 检测网卡 假设一个负载均衡器有两个网卡,一个是对外的虚拟 IP,一个是面向后端服务器。我们可以监测面向后端服务器的网络连接是否故障。 ``` vrrp_instance VRRP_1 { state MASTER interface enp0s3 virtual_router_id 60 priority 200 # 如果网卡正常,权重为 200 + 5 = 205 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.222/24 } track_interface { enth0 weight 5 # 使用网卡监测指令,权重为5 } } ``` #### 3.4 检测脚本 Keepalived 支持通过任意脚本来检测主机状态。以下例子中,如果脚本返回任何非`0`值,则进入异常状态。 脚本示例`/usr/local/bin/keepalived_check.sh`: ``` #!/bin/bash /usr/bin/ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1 ``` Keepalived 配置: ``` vrrp_script keepalived_check { # 定义监测脚本 script "/usr/local/bin/keepalived_check.sh" interval 1 # 脚本每隔1秒执行一次 timeout 5 # 脚本超时时间 5秒 rise 3 # 脚本成功返回3次,算健康 fall 3 # 脚本返回3次失败,算失败 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 244 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.122.200/24 } track_script { keepalived_check #使用监测脚本 } } ``` #### 3.5 通知脚本 Keepalive 支持触发通知脚本,通知脚本将收到 4 个参数: * `VRRP`组或`VRRP`实例 * `VRRP`组或`VRRP`实例名称 * `VRRP`组或`VRRP`实例将要进入的状态 * 权重 通知脚本示例: ``` # /usr/local/bin/keepalived_notify.sh #!/bin/bash echo "$1 $2 has transitioned to the $3 state with a priority of $4" > /var/run/keepalived_status ``` Keepalived 配置: ``` # keepalived.conf vrrp_script keepalived_check { script "/usr/local/bin/keepalived_check.sh" interval 1 timeout 5 rise 3 fall 3 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 244 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.122.200/24 } track_script { keepalived_check } notify "/usr/local/bin/keepalived_notify.sh" # 启用通知脚本 } ```
幻翼
2023年4月28日 10:32
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码