负载均衡与反向代理-01 主机自身负载均衡-keepalived
最近打算再来一个系列,介绍下负载均衡和反向代理(全软件的不是F5和A10之类的硬件配置哦)。
基本上现在凡事需要发布的服务都有弹性扩展的需求,同时通过反向代理的部署可以解决后端服务暴露外部网络的风险管理问题等等
目前打算写如下几期
- 01 主机自身的负载均衡(keepalived+LVS)
- 02 服务负载均衡(Nginx+haproxy)
- 03 其他
主机自身负载均衡
以下开始第一篇 keepalived的介绍,keepalived 是一种高性能的服务器高可用或热备解决方案。
原理简介
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性
(HA)。
- VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议;
- VRRP 协议是为消除在静态缺省路由环境下的缺省路由器单点故障引起的网络失效而设计的主备模式的协议,使得在发生故障而进行设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。VRRP 协议需要具有 IP 地址备份,优先路由选择,减少不必要的路由器间通信等功能。
- VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个);
- 在路由器组内部,实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER(或者是通过算法选举产生)
- MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;
- 其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。
- 当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。
- VRRP 协议默认使用多播数据来传输 VRRP 数据;
- VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址;
- VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组);
- BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。
- 配置 VRRP 协议时需要配置每个路由器的虚拟路由器 ID(VRID) 和优先权值,使用 VRID 将路由器进行分组,具有相同 VRID 值的路由器为同一个组,VRID 是一个 0~255 的正整数;同一组中的路由器通过使用优先权值来选举 MASTER,优先权大者为 MASTER,优先权也是一个 0~255 的正整数。
MASTER 选举
- 如果对外的虚拟路由器 IP 就是路由器本身配置的 IP 地址的话,该路由器始终都是 MASTER;
- 否则如果不具备虚拟 IP 的话,将进行 MASTER 选举,各路由器都宣告自己是 MASTER,发送 VRRP 通告信息;
- 如果收到其他机器的发来的通告信息的优先级比自己高,将转回 BACKUP 状态;
- 如果优先级相等的话,将比较路由器的实际 IP,IP 值较大的优先权高;
- 不过如果对外的虚拟路由器 IP 就是路由器本身的 IP 的话,该路由器始终将是 MASTER,这时的优先级值为 255。
协议状态
VRRP 协议状态比较简单,就三种状态,初始化,主机,备份机
+---------------+
+--------->| |<-------------+
| | Initialize | |
| +------| |----------+ |
| | +---------------+ | |
| | | |
| V V |
+---------------+ +---------------+
| |---------------------->| |
| Master | | Backup |
| |<----------------------| |
+---------------+ +---------------+
初始化:
- 路由器启动时,如果路由器的优先级是 255(最高优先级,路由器拥有路由器地址),要发送 VRRP 通告信息,并发送广播 ARP 信息通告路由器 IP 地址对应的 MAC 地址为路由虚拟 MAC,设置通告信息定时器准备定时发送 VRRP 通告信息,转为 MASTER 状态;
- 否则进入 BACKUP 状态,设置定时器检查定时检查是否收到 MASTER 的通告信息。
主机:
主机状态下的路由器要完成如下功能:
- 设置定时通告定时器;
- 用 VRRP 虚拟 MAC 地址响应路由器 IP 地址的 ARP 请求;
- 转发目的 MAC 是 VRRP 虚拟 MAC 的数据包;
- 如果是虚拟路由器 IP 的拥有者,将接受目的地址是虚拟路由器 IP 的数据包,否则丢弃;
- 当收到 shutdown 的事件时删除定时通告定时器,发送优先权级为 0 的通告包,转初始化状态;
- 如果定时通告定时器超时时,发送 VRRP 通告信息;
- 收到 VRRP 通告信息时,如果优先权为 0,发送 VRRP 通告信息;否则判断数据的优先级是否高于本机,或相等而且实际 IP 地址大于本地实际 IP,设置定时通告定时器,复位主机超时定时器,转 BACKUP 状态;否则的话,丢弃该通告包;
备机:
备机状态下的路由器要实现以下功能:
- 设置主机超时定时器;
- 不能响应针对虚拟路由器 IP 的 ARP 请求信息;
- 丢弃所有目的 MAC 地址是虚拟路由器 MAC 地址的数据包;
- 不接受目的是虚拟路由器 IP 的所有数据包;
- 当收到 shutdown 的事件时删除主机超时定时器,转初始化状态;
- 主机超时定时器超时的时候,发送 VRRP 通告信息,广播 ARP 地址信息,转 MASTER 状态;
- 收到 VRRP 通告信息时,如果优先权为 0,表示进入 MASTER 选举;否则判断数据的优先级是否高于本机,如果高的话承认 MASTER 有效,复位主机超时定时器;否则的话,丢弃该通告包;
ARP 查询处理
当内部主机通过 ARP 查询虚拟路由器 IP 地址对应的 MAC 地址时,MASTER 路由器回复的 MAC 地址为虚拟的 VRRP 的 MAC 地址,而不是实际网卡的 MAC 地址,这样在路由器切换时让内网机器觉察不到;而在路由器重新启动时,不能主动发送本机网卡的实际 MAC 地址。如果虚拟路由器开启的 ARP 代理 (proxy_arp) 功能,代理的 ARP 回应也回应 VRRP 虚拟 MAC 地址。
VRRP 应用举例
+-----------+ +-----------+
| Rtr1 | | Rtr2 |
|(MR VRID=1)| |(BR VRID=1)|
|(BR VRID=2)| |(MR VRID=2)|
VRID=1 +-----------+ +-----------+ VRID=2
IP A ---------->* *<---------- IP B
| |
| |
------------------+------------+-----+--------+--------+--------+--
^ ^ ^ ^
| | | |
(IP A) (IP A) (IP B) (IP B)
| | | |
+--+--+ +--+--+ +--+--+ +--+--+
| H1 | | H2 | | H3 | | H4 |
+-----+ +-----+ +--+--+ +--+--+
Legend:
---+---+---+-- = Ethernet, Token Ring, or FDDI
H = Host computer
MR = Master Router
BR = Backup Router
* = IP Address
(IP) = default router for hosts
这是通常 VRRP 使用拓扑,两台路由器运行 VRRP 互为备份,路由器 1 作为 VRID 组 1 的 MASTER,IP 地址 A,VRID 组 2 的 BACKUP,路由器 2 作为 VRID 组 2 的 MASTER,IP 地址 B,VRID 组 1 的 BACKUP,内部网络中一部分机器的缺省网关地址是 IP 地址 A,一部分是 IP 地址 B,正常情况下以 A 为网关的数据将走路由器 1,以 B 为网关的数据将走路由器 2,如果一台路由器发生故障,所有数据将走另一台路由器。
协议定义
以太头
- 源 MAC
地址必须为虚拟 MAC 地址:
00-00-5E-00-01-{VRID}
VRID 为虚拟路由器 ID 值,16 进制格式,所以同一网段中最多有 255 个 VRRP 路由器;
- 目的 MAC
为多播类型的 MAC。
这里可以看出 VRID 非常重要
IP 头参数
VRRP 包的源地址是本机地址,目的地址必须为224.0.0.18,为一多播地址;IP 协议号为 112;IP 包的 TTL 值必须为 255。
VRRP 协议数据格式
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Type | Virtual Rtr ID| Priority | Count IP Addrs|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Auth Type | Adver Int | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| . |
| . |
| . |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP Address (n) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication Data (2) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
其中:
- version:版本,4 位,在 RFC3768 中定义为 2;
- Type:类型,4 位,目前只定义一种类类型:
- 通告数据,取值为 1;
- Virtual Rtr ID:虚拟路由器 ID,8 位
- Priority:优先级,8 位,具备冗余 IP 地址的设备的优先级为 255;
- Count IP Addrs:VRRP 包中的 IP 地址数量,8 位;
- Auth Type:认证类型,8 位,RFC3768 中认证功能已经取消,此字段值定义 0(不认证),为 1,2 只作为对老版本的兼容;
- Adver Int:通告包的发送间隔时间,8 位,单位是秒,缺省是 1 秒;
- Checksum:校验和,16 位,校验数据范围只是 VRRP 数据,即从 VRRP 的版本字段开始的数据,不包括 IP 头;
- IP Address(es):和虚拟路由器相关的 IP 地址,数量由 Count IP Addrs 决定
- Authentication Data:RFC3768 中定义该字段只是为了和老版本兼容,必须置 0。
接收数据时的必须检查
收到 VRRP 数据包时要进行以下验证,不满足的数据包将被丢弃:
- TTL 必须为 255;
- VRRP 版本号必须为 2;
- 一个包中数据字段必须完整;
- 校验和必须正确;
- 必须验证在接收的网卡上配置了 VRID 值,而且本地路由器不是路由 IP 地址的拥有者
- 必须验证 VVRP 认证类型和配置的一致;
结论
VRRP 实现了对路由器 IP 地址的冗余功能,防止了单点故障造成的网络失效,VRRP 本身是热备形式的,但可以通过互相热备实现路由器的均衡处理,新版的 VRRP 较老版简化了认证处理,实际不再进行数据的认证,这是因为在实际应用中经常出现认证成为造成多个 MASTER 同时使用的异常情况。
方案规划
VIP | IP | 主机名 | 服务端口 | 默认主从 |
---|---|---|---|---|
192.168.50.130 | 192.168.50.131 | srv01 | 80 | MASTER |
192.168.50.130 | 192.168.50.132 | srv02 | 80 | BACKUP |
-
主机系统-ubuntu Centos均可
-
keepalived 这个服务基本上千年不变推荐采用系统自身的命令安装即可。
- 对于 CentOS
sudo yum install -y ipvsadm keepalived
- 对于 Ubuntu
sudo apt install -y ipvsadm keepalived