layout: post
title: Keepalived—HA原理
date: 2018-03-13
tags: [“Cluster services”,”软件服务”]


一、keepalived简介

Keepalived是一个用C编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载均衡和高可用性设施。 Loadbalancing框架依赖于众所周知且广泛使用的提供Layer4负载平衡的Linux虚拟服务器(IPVS)内核模块。 Keepalived实现了一组检查器,根据其健康动态地自适应维护和管理负载均衡服务器池。 另一方面,通过VRRP协议实现高可用性。 VRRP是路由器故障转移的基础砖块。 此外,Keepalived还为VRRP有限状态机提供了一系列挂钩,以提供低级别和高速协议交互。 Keepalived框架可以独立使用,也可以一起使用,以提供弹性基础设施。

二、工作原理

1、Keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core、check和vrrp。

core**:**是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等。

check**:** 负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查。

vrrp**VRRPD子进程,VRRPD子进程就是来实现VRRP协议的以上是主要组件;下面是其他库: libipfwc:iptables/ipchains库,配置LVS会用到 libipvs*:配置LVS会用到注意,keepalived和LVS完全是两码事,各司其职相互配合。

2、软件设计


keepalived启动后会产生三个进程:1、守护进程;2、vrrp子进程;3、healthcheckor子进程

守护进程中的WatchDog会监管vrrp和healthcheckor两个子进程,healthchecker子进程实现检查各自服务器的健康程度,如果healthchecker子进程检查到MASTER上服务不可用,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。

三、配置文件

1、配置文件组件部分:

  1. GLOBAL CONFIGURATION
  2. Global definitions
  3. Static routes/addresses
  4. VRRPD CONFIGURATION
  5. VRRP synchronization group(s):vrrp同步组
  6. VRRP instance(s):即一个vrrp虚拟 路由器
  7. LVS CONFIGURATION
  8. Virtual server group(s)
  9. Virtual server(s):ipvs集群的vsrs

2、 配置语法:

全局配置:

  1. global_defs {
  2. notification_email {
  3. root@localhost #调用sendmail模块,节点状态发生变化发送通知
  4. }
  5. notification_email_from keepalived@localhost #定义邮件发送人
  6. smtp_server 127.0.0.1 #定义smtpserver
  7. smtp_connect_timeout 30 #定义发送超时时间
  8. router_id node1 #节点名,在另一结点为node2
  9. vrrp_mcast_group4 224.0.100.100 #定义组播地址
  10. }

自定义脚本配置:

  1. vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外
  2. vrrp_script <SCRIPT_NAME> {
  3. script ""
  4. interval INT
  5. weight -INT
  6. }

vrrp实例,配置虚拟路由器:

  1. vrrp_instance <STRING> {
  2. ....
  3. }
  4. 上下文参数:
  5. state MASTER'BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP
  6. interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口
  7. virtual_router_id VRID:当前虚拟路由器惟一标识,范围是0-255
  8. priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254(master要比slave高)
  9. advert_int 1:vrrp通告的时间间隔,默认1s
  10. authentication { #认证机制
  11. auth_type AH'PASS
  12. auth_pass <PASSWORD> 仅前8位有效
  13. }
  14. virtual_ipaddress { #虚拟IP
  15. #格式 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
  16. 192.168.200.17/24 dev eth1
  17. 192.168.200.18/24 dev eth2 label eth2:1
  18. }
  1. track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态
  2. 实现地址转移
  3. eth0
  4. eth1
  5. ...
  6. }
  7. nopreempt:定义工作模式为非抢占模式
  8. preempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
  9. track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
  10. track_script {
  11. SCRIPT_NAME_1
  12. SCRIPT_NAME_2
  13. }
  14. 定义通知脚本:
  15. notify_master ':当前节点成为主节点时触发的脚本
  16. notify_backup ':当前节点转为备节点时触发的脚本
  17. notify_fault ':当前节点转为"失败"状态时触发的脚本
  18. notify ':通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

IPVS实例配置(如果是做lvs的主备):

  1. virtual_server real_server {
  2. ...
  3. real_server {
  4. ...
  5. }
  6. virtual_server的上下文参数:
  7. delay_loop <INT>:检查后端服务器的时间间隔
  8. lb_algo rr'wrr'lc'wlc'lblc'sh'dh:定义调度方法
  9. lb_kind NAT'DR'TUN:集群的类型
  10. persistence_timeout <INT>:持久连接时长
  11. protocol TCP:服务协议,仅支持TCP
  12. sorry_server <IPADDR> <PORT>:所有RS故障时,备用服务器地址
  13. real_server <IPADDR> <PORT>{ #真是服务器地址和端口
  14. weight <INT> RS权重
  15. notify_up <STRING>'<QUOTED-STRING> RS上线通知脚本
  16. notify_down <STRING>'<QUOTED-STRING> RS下线通知脚本
  17. HTTP_GET'SSL_GET'TCP_CHECK'SMTP_CHECK'MISC_CHECK {
  18. ...
  19. }:定义当前主机的健康状态检测方法
  20. HTTP_GET'SSL_GET:应用层检测
  21. HTTP_GET'SSL_GET {
  22. url {
  23. path <URL_PATH>:定义要监控的URL
  24. status_code <INT>:判断上述检测机制为健康状态的响应码
  25. digest <STRING>:判断为健康状态的响应的内容的校验码
  26. }
  27. connect_timeout <INTEGER>:连接请求的超时时长
  28. nb_get_retry <INT>:重试次数
  29. delay_before_retry <INT>:重试之前的延迟时长
  30. connect_ip <IP ADDRESS>:向当前RS哪个IP地址发起健康状态检测请求
  31. connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
  32. bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址
  33. bind_port <PORT>:发出健康状态检测请求时使用的源端口
  34. }
  35. TCP_CHECK { 第四层检测
  36. connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
  37. connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
  38. bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址
  39. bind_port <PORT>:发出健康状态检测请求时使用的源端口
  40. connect_timeout <INTEGER>:连接请求的超时时长
  41. }
  42. }
文档更新时间: 2018-12-20 11:15   作者:张尚