前言
Keepalived 高可用组件的虚拟 IP 持续漂移,导致 MySQL 主从不断切换,进而导致 MySQL 主从数据同步失败。
虽然没能重现 Keepalived 的这个问题,但是我深入研究了下 Keepalived 的原理以及针对核心配置参数做了大量实验。悟空带着大家一起看下 Keepalived 到底是如何运转的,以及为什么它能做到高可用。
一、Keepalived 和 LVS 概述
1.1 Keepalived 概述
谈到 Keepalived,给人的印象就是用在高可用架构中,保证某个服务不故障,其实它还有很多其他的功能。Keepalived 是 Linux 系统下的一个比较轻量级的高可用解决方案,这个轻量级是相对于 Heartbeat 等组件的。虽然 Heartbeat 功能完善、专业性强,但是安装部署就没有 Keepalived 简单,Keepalived 只需要一个配置文件即可。企业中大多选择 Keepalived 作为高可用组件。
1.2 LVS 概述
Keepalived 最开始是由 Alexandre Cassen 使用 C 语言编写的开源软件项目,项目的目的主要是简化 LVS 项目的配置并增强 LVS 的稳定性。简单来说,Keepalived 就是对 LVS 的扩展增强。
LVS(Linux Virtual Server)翻译过来就是 Linux 虚拟服务器,由章文嵩博士主导开发的开源负载项目,目前 LVS 已经被集成到 Linux 内核模块中。
LVS 主要用在负载均衡方面,比如 Web 客户端想要访问后端服务,Web 请求会先经过 LVS 调度器,调度器根据预设的算法决定如何分发给后端的所有服务器。
1.3 LVS 基本原理
LVS 的基本原理如下图所示:
LVS基本原理
LVS 的核心功能就是提供负载均衡,负载均衡技术有多种:
- 基于 DNS 域名轮流解析方案。
- 基于客户端调度访问方案。
- 基于应用层系统的调度方案。
- 基于 IP 地址的调度方案。
而效率最高的是基于 IP 地址的调度方案。其实就是将请求转发给对应的 IP 地址 + 端口号,它的效率是非常高的,LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的,IPVS 是 LVS 集群系统的核心软件。
LVS 负载均衡器会虚拟化一个IP(VIP),对于客户端来说,它事先只知道这个 VIP 的,客户端就将请求发送给 VIP,然后 LVS 负载均衡器会将请求转发给后端服务器中的一个,这些服务器都称为 Real Server(真实服务器)。转发的规则是通过设置 LVS 的负载均衡算法来的,比如随机分配、按照权重分配等。
后端服务器的提供的功能要求是一致的,不论转发到哪台服务器,最终得到的结果是一致的,所以对于客户端来说,它并不关心有多少个后端服务器在提供服务,它只关心访问的 VIP 是多少。
那么后端服务处理完请求后,如何将数据返回给客户端呢?根据 LVS 的不同模式,会选择不同的方式将数据返回给客户端。LVS 的工作模式有三种:NAT 模式、TUN 模式、DR 模式。这个后面讲到路由机制再来细说。
二、Keepalived 流量转发原理
Keepalived 为 Linux 系统提供了负载均衡和高可用能力。负载均衡的能力来自 Linux 内核中的 LVS 项目模块 IPVS(IP Virtual Server)。
Keepalived 运行在 Linux 系统中