Keepalived 是一款轻量级HA集群应用,它的设计初衷是为了做LVS集群的HA,即探测LVS健康情况,从而进行主备切换,不仅如此,还能够探测LVS代理的后端主机的健康状况,动态修改LVS转发规则。

   当LVS进行主备切换的时候,对外提供服务的IP是如何做到切换的呢?这就依赖于keepalived 所应用的vrrp协议,即Virtual Reduntant  Routing Protocol,虚拟冗余路由协议。简单来讲,此协议是将IP设置在虚拟接口之上,根据一定的规则实现IP在物理主机上流动,即哪台主机可以占有该IP。

   而且keepalived具有脚本调用接口,可通过脚本完成拓展功能。

  1.Keepalived

术语:

虚拟路由器:Virtual Router 
虚拟路由器标识:VRID(0-255)
物理路由器:
master:主设备
backup:备用设备
priority:优先级
VIP:Virtual IP 
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告内容:心跳,优先级等;周期性;
各主机通告以组播方式通信,只向组内的主机发送数据包,因为按照组播的mac地址发送,组播mac地址是和组播ip地址对应的。iana(internet assigned number authority)规定,组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。相应地网卡需要设置支持multicast。
抢占式,非抢占式;

默认为抢占式。当优先级高的主机恢复正常状态时,将夺回IP,重新成为MASTER。

安全认证:
无认证
简单字符认证   #一般采用此方式
MD5
工作模式:
主/备:单虚拟路径器;
主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)
假定两台主机A和B做HA,可以做两个虚拟接口,流动2个IP。接口1中,A设备优先级设定高,为MASTER;接口2种,B设备优先级高,为MASTER。

这样两台主机,能通过两个对外IP同时工作。即主主模式。

组件:

核心组件:
vrrp stack
ipvs wrapper
checkers
控制组件:配置文件分析器
IO复用器
内存管理组件

HA Cluster的配置前提:

(1) 各节点时间必须同步;
(2) 确保iptables及selinux不会成为阻碍;

2.Keepalived配置前需要了解的事

本文演示的环境为centos7.2。keepalived软件安装,配置好yum源,软件包已在base仓库中收录。

# yum install keepalived           安装即可

程序环境:

网卡支持multicast
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
Unit File:keepalived.service

配置文件组件部分:

通用的配置结构 

TOP HIERACHY

GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)

配置语法:

配置虚拟路由器:实现IP流动的部分
vrrp_instance <STRING> {
....
}
专用参数:
state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;
virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255;
priority 100:当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1:vrrp通告的时间间隔;
authentication {
auth_type AH|PASS
auth_pass <PASSWORD>
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface {
eth0
eth1
...
}
配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
nopreempt:定义工作模式为非抢占模式;
preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;
定义通知脚本:
notify_master <STRING>|<QUOTED-STRING>:当前节点成为主节点时触发的脚本;
notify_backup <STRING>|<QUOTED-STRING>:当前节点转为备节点时触发的脚本;
notify_fault <STRING>|<QUOTED-STRING>:当前节点转为“失败”状态时触发的脚本;
notify <STRING>|<QUOTED-STRING>:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;

3.Keepalived 双主虚拟路由配置实例

演示前说明: 

2台centos7.2 主机:node-00,node-01

VIP1:10.1.38.19预定node-00占有

VIP2:10.1.38.20 预定node-01占有

2台主机安装好keepalived之后,开始编辑配置文件

node-00的配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost #定义来信人
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-00
vrrp_mcast_group4 224.0.38.12
} vrrp_instance VI_1 {
state MASTER
interface team0
virtual_router_id 38
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.19/16 dev team0
} smtp_alert #状态切换,使用邮件通知
} vrrp_instance VI_2 {
state BACKUP
interface team0
virtual_router_id 39
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.20/16 dev team0
}
smtp_alert
}

复制要把备注删掉

node-01配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-01
vrrp_mcast_group4 224.0.38.12
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 38
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.19/16 dev bond0
}
smtp_alert
} vrrp_instance VI_2 {
state MASTER
interface bond0
virtual_router_id 39
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.20/16 dev bond0
}
smtp_alert
}

配置完成后,启动服务

#systemctl start keepalived

使用ip命令查看ip地址情况

#ip address show

node-00情况

node-01情况

此时,我们模拟node-00宕机,将node-00的keepalived服务停掉,那么10.1.38.19此ip会流动到node-01上

#systemctl stop keepalived

至此此部分演示完毕。

4.Keepalived ipvs 高可用集群配置实例

同样先科普的配置说明

虚拟服务器:
配置结构:
  virtual_server IP port 或者virtual_server fwmark int 
  {
    ...
    real_server {
      ...
    }
    ...
  }

常用参数:
  delay_loop <INT>:服务轮询的时间间隔;
  lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法;
  lb_kind NAT|DR|TUN:集群的类型;
  persistence_timeout <INT>:定向调度时长;
  protocol TCP:服务协议,仅支持TCP;
  sorry_server <IPADDR> <PORT>:备用服务器地址;当后端主机都失败时,由此主机提供友好提示页面。
  real_server <IPADDR> <PORT>  
  {
    weight <INT>
    notify_up <STRING>|<QUOTED-STRING>
    notify_down <STRING>|<QUOTED-STRING>
    HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法;
  }

  HTTP_GET|SSL_GET {
    url {
        path <URL_PATH>:定义要监控的URL;
        status_code <INT>:判断上述检测机制为健康状态的响应码;
        digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码;
    }
    nb_get_retry <INT>:重试次数;
    delay_before_retry <INT>:重试之前的延迟时长;
    connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
    connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
    bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
    bind_port <PORT>:发出健康状态检测请求时使用的源端口;
    connect_timeout <INTEGER>:连接请求的超时时长;
  }

  TCP_CHECK {
    connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
    connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
    bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
    bind_port <PORT>:发出健康状态检测请求时使用的源端口;
    connect_timeout <INTEGER>:连接请求的超时时长;
  }

开始演示实例

演示说明:

  node-00,node-01 作为ipvs主机,做HA。对外服务IP为10.1.38.15,即VIP。

  node-02,node-03 作为后端主机,提供web服务。

  node-02 IP:10.1.38.13

  node-03 IP:10.1.38.14

node-00配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-00
vrrp_mcast_group4 224.0.38.12
} vrrp_instance VI_1 {
state MASTER
interface team0
virtual_router_id 38
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.15/16 dev team0
} smtp_alert
}
virtual_server 10.1.38.15 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.38.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.1.38.14 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}

node-01 配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-01
vrrp_mcast_group4 224.0.38.12
} vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 38
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.15/16 dev bond0
} smtp_alert
}
virtual_server 10.1.38.15 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.38.13 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.1.38.14 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}

两台后端主机做好lvs  dr模式集群设置,并开启web服务。启动ipvs两台主机keepalived服务。

一切正常情况下,此时node-00拥有VIP,使用其他主机来访问 10.1.38.15

测试1:

#for i in {1..6};do curl 10.1.38.15;done

  轮询调度正常。

  测试2:

  停掉node-00 keepalived服务,模拟宕机,测试冗余性

  正常结果还是正常轮询的。

  测试3:

  两台ipvs主机正常运行,停掉node-02上web服务,模拟后端主机宕机,测试keepalived动态调整后端主机列表功能

  

  测试结果,前端调度器只将服务调度至node-03上。

  再将node-02 web服务启动,再测试

  

  结果显示恢复正常轮询,至此keepalived动态调整能力测试完毕。

  其实以上结果,再ipvs主机直接查看lvs规则也可看出

  #ipvsadm -Ln

5.Keepalived 做nginx 高可用集群配置实例

再学习一个新知识,脚本调用

  keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;   

  分两步:(1) 先定义一个脚本;(2) 调用此脚本;

  vrrp_script <SCRIPT_NAME> {
    script ""     #定义一个判定语句,如果退出状态码为非0,则执行减优先级操作。
    interval INT     #测试间隔
    weight -INT        #降低优先级,是其释放VIP所有权
  }

  track_script {
    SCRIPT_NAME_1 #检测的脚本列表
    SCRIPT_NAME_2
    ...
  }

开始演示实例

演示说明:

node-00,node-01 为nginx服务器,代理后端web服务器,使用keepalived做HA集群。

node-02,node-03 为后端web服务器。

node-00配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-00
vrrp_mcast_group4 224.0.38.12
} vrrp_script check_ngx { #脚本在引用前定义好
script "killall -0 nginx "  #探测nginx服务是否正常
interval 1
weight -5
}
vrrp_instance VI_1 {
state MASTER
interface team0
virtual_router_id 38
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.15/16 dev team0
}
track_script {  #在路由实例中引用自定义脚本
check_ngx
}
smtp_alert
}

node-01配置如下

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node-01
vrrp_mcast_group4 224.0.38.12
} vrrp_script check_ngx {
script "killall -0 nginx"
interval 1
weight -5
}
vrrp_instance VI_1 {
state BACKUP
interface bond0
virtual_router_id 38
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass x1er44q
}
virtual_ipaddress {
10.1.38.15/16 dev bond0
}
track_script {
check_ngx
}
smtp_alert
}

node-00,node-01 启动nginx服务,并已设置好代理两台后端web服务器;启动keepalived 服务。

node-02,node-03 启动web服务。

如果配置正确,会有以下结果。

测试1:使用另一台主机访问VIP,轮询响应结果正常,VIP在node-00。

测试2:停止node-00 nginx服务,模拟nginx服务异常,访问VIP,轮询响应结果正常,VIP在node-01。

测试3:恢复node-00 nginx 服务,VIP 流动回 node-00上。

完~

  

Keepalived 配置实例的更多相关文章

  1. Keepalived 双主虚拟路由配置实例

    Keepalived 双主虚拟路由配置实例 演示前说明: 2台centos7.2 主机:node-00,node-01 VIP1:10.1.38.19预定node-00占有 VIP2:10.1.38. ...

  2. 干货 | Keepalived高可用服务配置实例

    一个执着于技术的公众号 Keepalived系列导读 Keepalived入门学习 keepalived安装及配置文件详解 前言 在前面的章节中,我们学习了Keepalived简介.原理.以及Keep ...

  3. Keepalived 配置和使用

    keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现.keepalived主要目的在于,其自身启动一个服务,能够实现 ...

  4. keepalived配置主从备份

    keepalived配置主从备份   keepalived是一个用于做双机热备(HA)的软件,常和haproxy联合起来做热备+负载均衡,达到高可用. 运行原理 keepalived通过选举(看服务器 ...

  5. centso 7 Keepalived 配置脚本

    #!/bin/bash #This is keepalived bashshell. #MASTER/BACKUP yum install -y openssl openssl-devel keepa ...

  6. 二、Nginx配置实例

    Nginx配置实例 一.反向代理 实例一 1.实现效果 打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到linux系统tomcat主页面中. 2.准备工作 在linux系统中安装t ...

  7. nginx配置实例及多服务器负载

    目录 nginx配置实例 多服务器负载 nginx配置实例 nginx.conf worker_processes 1; events { worker_connections 1024; } htt ...

  8. Nginx 配置实例-配置高可用

    Nginx 配置实例-配置高可用 1. 实现效果 2. 两台机器 nginx 的安装 2.1 192.168.25.120 中 nginx 的安装 2.1.1 安装 pcre 依赖 2.1.2 安装其 ...

  9. Keepalived配置重载(reload)实现方法

    一.前言 Keepalived运行过程中,可能存在更改配置的需求,例如修改virtual_ipaddress,virtual_router_id,priority等参数.在keepalived不重启, ...

随机推荐

  1. Ninject之旅之一:理解DI

    摘要: DI(IoC)是当前软件架构设计中比较时髦的技术.DI(IoC)可以使代码耦合性更低,更容易维护,更容易测试.现在有很多开源的依赖反转的框架,Ninject是其中一个轻量级开源的.net DI ...

  2. git入门札记

    分布式版本控制(个人主机即版本库,有一台作为“中央服务器”来方便“交换”修改,管理修改 而非文件) vs.  SVN CVS git 安装后设置: git config - -global user. ...

  3. Parse the main function arguments

    int main(int argc, char **argv) { std::string reportDir; std::string transURL; std::string visualEle ...

  4. Loadrunner开发测试脚本

    Loadrunner开发测试脚本 开发测试脚本可以通过录制,也可以手动开发,建议能录制的尽量录制,省时省力,不能录制的只能费力自己开发了,具体看项目情况来决定. 使用Loadrunner开发脚本过程中 ...

  5. Python全栈开发day9

    一.面向对象进阶 1.利用python反射查看面向对象成员 对于对象:反射既可以找对象,类的成员 对于类:反射只能找类中的成员 2.利用反射操作模块(查找类,创建对象,查找对象中字段) 1 2 3 4 ...

  6. [ZT]嵌入视频播放器代码

    http://www.cnblogs.com/liulanglang/archive/2007/11/29/976638.html 页面插入REAL播放器代码: < id=video1 styl ...

  7. C# 导入EXCEL 报错外部表不是预期的格式错误 .

    错误经过:在读取Excel时,出现外部表不是预期的格式 错误原因1: 由于Excel 97-2003的连接格式与Excel 2010 的 不同造成. 以下是从网上摘抄原文 Excel “Externa ...

  8. lisp中的cons

    看到ANSI Common Lisp 第三章的游程编码时,就发现作者很准确的使用了list和cons来生成目标列表,虽然list是由cons扩展而来,区别也仅仅是最后一个元素的加入方式,于是勾起了之前 ...

  9. SqlServer传输数据到ORACLE,SSIS

    一.配置32位ODBC 配置tnsname文件,增加ORACLE数据库 打开32位ODBC 二.创建一个PROJECT并配置数据源 1.创建一个project 三.数据传输SSIS,工作流 四.为DT ...

  10. 执行超过1个小时的SQL语句

    SELECT MO.MO_ID, MO.ITEM, MO.QTYORDERED, MO.PLANNEDSTARTDATE, BR.MAXLOTSIZE FROM TEMP_MO MO, (SELECT ...