高可用集群--KeepAlived


在这里插入图片描述
KeepAlived:通用的高可用集群解决方案。

集群类型

1.LB: Load Balance负载均衡
  LVS/HAProxy/nginx (http/upstream, stream/upstream).

2.HA: High Availability高可用集群
  数据库、Zookeeper、Redis
  KeepAlived通用的高可用集群
  SPoF: Single Point of Failure,解决单点故障

3.HPC: High Performance Computing 高性能集群
  https://www.top500.org

VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性,解决局域网中配置静态网关出现单点失效现象的路由容错协议。

VRRP 允许两台或多台交换机使用同一个虚拟的MAC地址和IP地址,看起来多台交换机就像一个台大交换机,其实这台大交换机并不存在,只是多台互为备份的交换机。

虚拟路由冗余协议,解决静态网关单点风险
  物理层:路由器、三层交换机
  软件层:keepalived

为什么需要VRRP

基础网络的可靠性日益成为用户关注的焦点,能够保证网络传输不中断对于终端用户非常重要。

如图1-2,现网中的主机使用缺省网关与外部网络联系时,如果Gateway出现故障,与其相连的主机将与外界失去联系,导致业务中断。
在这里插入图片描述
如图1-3,VRRP的出现很好地解决了这个问题。VRRP将多台设备组成一个虚拟设备,通过配置虚拟设备的IP地址为缺省网关,实现缺省网关的备份。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。如下图所示,当Master设备故障时,发往缺省网关的流量将由Backup设备进行转发。
在这里插入图片描述

参考链接:https://support.huawei.com/enterprise/zh/doc/EDOC1100209553/,

在这里插入图片描述

KeepAlived

KeepAlived介绍

vrrp协议的软件实现,原生设计目的为了高可用ipvs服务。

官方网站:https://keepalived.org/

Keepalived 是一个用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于著名且广泛使用的Linux 虚拟服务器(IPVS) 内核模块,提供第 4 层负载均衡。Keepalived 实现了一组检查器,根据服务器池的健康状况动态、自适应地维护和管理负载平衡服务器池。另一方面,高可用性是通过 VRRP协议实现的。VRRP 是路由器故障转移的基本要素。此外,Keepalived 实现了一组挂钩到 VRRP 有限状态机,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供有弹性的基础设施。Keepalived

KeepAlived功能:
  1.基于vrrp协议完成地址流动;
  2.为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)3.为ipvs集群的各RS做健康状态检测;
  4.基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务。

KeepAlived架构

官方文档:
https://keepalived.org/doc/
https://keepalived.org/documentation.html

在这里插入图片描述
Keepalived 完全由纯 ANSI/ISO C 编写。该软件围绕提供实时网络设计的中央 I/O 多路复用器进行连接。主要设计重点是在所有元素之间提供同质模块化,这就是为什么创建核心库来消除代码重复的原因。另一方面,目标是生成安全可靠的代码以确保生产稳健性和稳定性。

为了确保稳健性和稳定性,守护进程被分成 3 个不同的进程。全局设计基于一个极简的父进程,负责分叉的子进程监控。然后是 2 个子进程,一个负责 VRRP 框架,另一个负责健康检查。

每个子进程都有自己的调度 I/O 多路复用器,这样 VRRP 调度抖动就得到了优化,因为 VRRP 调度比健康检查器更合理/更关键。另一方面,这种拆分设计最小化了健康检查对外部库的使用,并将其自身操作最小化到空闲主循环,以避免自身导致故障。

父进程监控框架称为看门狗(WatchDog),设计如下:每个子进程打开一个接受 unix 域套接字,然后在守护进程引导时,父进程连接到这些 un​​ix 域套接字并向子进程发送定期(5 秒)的 hello 数据包。如果父进程无法将 hello 数据包发送到远程连接的 unix 域套接字,它只需重新启动子进程。

这种看门狗设计有两个好处,首先,从父进程发送到远程连接的子进程的 hello 数据包是通过 I/O 多路复用器调度程序完成的,这样它就可以检测子进程调度框架中的死循环。第二个好处是使用 sysV 信号来检测死子进程。运行时,您将在进程列表中看到:

1.用户空间核心组件:
  vrrp stack: VIP消息通告
  checkers: 监测Real Server
  system call: 实现vrrp协议状态转换时调用脚本的功能
  SMTP:邮件组件
  IPVS wrapper:生成IPVS规则
  Netlink Reflector:网络接口
  WatchDog:监控进程
  
2.控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

3.IO复用器:针对网络目的而优化的自己的线程抽象

4.内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

编译安装

编译安装以ubuntu2004为例,事前需要安装一些依赖。

apt update
apt -y install make gcc ipvsadm build-essential pkg-config automake autoconf libipset-dev libnl-3-dev libnl-genl-3-dev libssl-dev libxtables-dev libip4tc-dev libip6tc-dev libipset-dev libmagic-dev libsnmp-dev libpcre2-dev libnftnl-dev libmnl-dev libsystemd-dev

1.下载源码包并解压

wget https://keepalived.org/software/keepalived-2.2.7.tar.gz

在这里插入图片描述

2.查看install文件的安装说明

在这里插入图片描述
在这里插入图片描述

3.执行“./configure”

./configure --prefix=/usr/local/keepalived

在这里插入图片描述

4.make && make install

make -j 2 && make install   # -j 2是加上自己的cpu核数可以加速编译

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看版本信息

 /usr/local/keepalived/sbin/keepalived -v

在这里插入图片描述

5.指定keepalived.conf配置文件

完成第4步后还启动不了keepalived服务,启动会报错,journalctl日志提示“Config files missing ‘/usr/local/etc/keepalived/keepalived.conf’”缺失这个配置文件,然而我们自定义的编译安装的目录在/usr/local/keepalived目录下,所以我们需要再server文件中指定我们自定义的配置文件的目录。
在这里插入图片描述
我们先将keepalived.conf.sample的模板文件拷贝致我们的安装目录“/usr/local/keepalived/etc”下作为keepalived.conf配置文件,
在这里插入图片描述

6.修改keepalived的server文件

在keepalived.service文件中指定keepalived.conf的位置。

 vim /lib/systemd/system/keepalived.service
ExecStart=/usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived.conf --dont-fork $KEEPALIVED_OPTIONS

在这里插入图片描述

报错 WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist

报错提示“WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist”
在这里插入图片描述
看下,我的网卡名好像不是eth0是ens33,需要修改keepalived.conf中的
在这里插入图片描述
vim /usr/local/keepalived/etc/keepalived.conf
在这里插入图片描述

7.重启成功

修改上面的配置之后启动就成功了
在这里插入图片描述
keepalived服务成功起来后,使用ip命令可以看到生成了许多ip地址。
在这里插入图片描述

再创建一个KeepAlived节点

复制以上编译安装的文件,再重新创建一个ka2的服务节点。

拷贝keepalived文件

scp -r /usr/local/keepalived/ 192.168.10.150:/usr/local

在这里插入图片描述
拷贝service文件

scp -r /lib/systemd/system/keepalived.service 192.168.10.150:/lib/systemd/system/keepalived.service

在这里插入图片描述
这次我们尝试将keepalived.conf文件放在/etc/keepalived下,然后在/usr/lib/systemd/system/keepalived.service文件中不指定keepalived.conf的位置,看系统能否自己找到。
在这里插入图片描述
vim /usr/lib/systemd/system/keepalived.service
在这里插入图片描述

启动service服务

root@ka2:~# systemctl daemon-reload
root@ka2:~# systemctl enable --now keepalived.service 

启动成功了,说明系统会默认去/etc/keepalived下找keepalived.conf
在这里插入图片描述
此时ka2的ip地址好像没有增多
在这里插入图片描述

ka1和ka2的ip地址漂移

在这里插入图片描述
我停掉ka1的service服务
在这里插入图片描述

是否能ping通ka发布的IP地址

我修改了ka新增的ip子网掩码为24
vim /etc/keepalived/keepalived.conf
在这里插入图片描述

在这里插入图片描述
现在我找一台192.168.10.149的机器,看能否ping通192.168.200.16等ip地址
在这里插入图片描述
刚开始ping不通,可能会有很多原因,
原因一:keepalived.conf中的配置需要注释掉vrrp_strict
在这里插入图片描述
原因二:192.168.10.X和192.168.200.X不在同一网段(这个解释可能有错误,后面知道正确的原因后再回来改正)
在192.168.10.149的机器上新增一个192.168.200.X的ip地址

新增一个ip地址

ip a a 192.168.200.123/24 dev ens33   

删除一个ip地址

ip a del 192.168.200.123/24 dev ens33 

在这里插入图片描述
可以ping通了
在这里插入图片描述

初体验KA的ip漂移的高可有

分别在ka1和ka2上安装nginx,两个nginx对外提供同一个web服务,默认页面都是 “This is + ip地址”
在这里插入图片描述
在192.168.10.149中配置hosts文件
vim /etc/hosts

192.168.200.16 www.leiweb.com

此时192.168.200.16的地址是在150的机器上的,则由150的机器提供nginx的web服务
在这里插入图片描述当我宕掉150的keepalived服务后,192.168.200.16的地址漂移到了137的机器上去了,此时则由137来提供nginx的web服务。在这里插入图片描述

KeepAlived配置说明

vim /etc/keepalived/keepalived.conf

配置文件组成

1.GLOBAL CONFIGURATION

Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等

2.VRRP CONFIGURATION

VRRP instance(s):定义每个vrrp虚拟路由器

3.LVS CONFIGURATION

Virtual server group(s)
Virtual server(s):LVS集群的VS和RS

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 230.1.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100    # 是master还是backup最终由优先级决定
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
}

全局配置

/etc/keepalived/keepalived.conf

global_defs {
  notification_email {
  root@localhost  #keepalived发生故障切换时邮件发送的目标邮箱,可以按行区分写多个,据说配了没用
  root@wangxiaochun.com
  xxxxxx@qq.com
  }
  notification_email_from keepalived@localhost  #发邮件的地址
  smtp_server 127.0.0.1  #邮件服务器地址
  smtp_connect_timeout 30  #邮件服务器连接timeout
  router_id ka1.example.com #每个keepalived主机唯一标识,建议使用当前主机名,如果多节点重名可能会影响切换脚本执行
  vrrp_skip_check_adv_addr  #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
  vrrp_strict #严格遵守VRRP协议,启用此项后以下状况将无法启动服务:
              #1.无VIP地址
              #2.配置了单播邻居 
              #3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,
              #建议不加此项配置
  vrrp_garp_interval 0 #gratuitous ARP messages报文发送延迟,0表示不延迟
  vrrp_gna_interval 0  #unsolicited NA messages(不请自来)消息发送延迟
  vrrp_mcast_group4 224.0.0.18  #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18
  vrrp_iptables  #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}

抓包

tcpdump -i ens33 -nn host 224.0.0.18

137在不断地向组播地址224.0.0.18发送消息,当宕掉137的ka服务之后,150或继续向224.0.0.18发送
在这里插入图片描述
宕掉137的ka服务
在这里插入图片描述

虚拟路由器配置

vrrp_instance <STRING> { #<String>为vrrp的实例名,一般为业务名称
   配置参数
   ....
}

#配置参数:
state MASTER|BACKUP  #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME  #绑定为当前虚拟路由器使用的物理接口,如:eth0, ens33, bond0 ,br0,可以和VIP不在一个网卡

virtual_router_id vRID  #每个虚拟路由器唯一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepa1ived节点必须相同,务必要确认在同一网络中此值必须唯一

priority 100  #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepa7ived主机节点此值不同
advert_int 1  #vrrp通告的时间间隔,默认1s
authentication { #认证机制
    auth_type AH|PASS  #AH为IPSEC认证(不推荐), PASS为简单密码(建议使用)
    auth_pass <PASSWORD>  #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepa7ived节点必须一样
}

virtual_ipaddress {  #虚拟IP,生产环境可能指定上百个IP地址
    <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>labe1 <LABEL>
    192.168.200.100  #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix ,默认为/32
    192.168.200.101/24 dev eth1  #指定VIP的网卡,建议和interface指令指定的网卡不在一个网卡
    192.168.200.102/24 dev eth2 1abe1 eth2:1  #指定VIP的网卡1abel
}

track_interface {   #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
   eth0
   eth1
   ...
}

启用keepalived日志功能

在service文件中查看下面这个文件
vim /usr/local/keepalived/etc/sysconfig/keepalived
在这里插入图片描述
默认ka的系统日志记录在log_daemon中,log_daemon的配置在/etc/rsyslog.d/50-default.conf
在这里插入图片描述
vim /etc/rsyslog.d/50-default.conf
在这里插入图片描述
但daemon日志开启后,/var/log/daemon.log会记录很多daemon日志,会ka的daemon日志杂糅在一起不利于观察,于是我们就自定义一个文件在记录ka的daemon信息。

独立记录ka的日志

1.设置log-facility
vim /usr/local/keepalived/etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6"

/usr/local/keepalived/etc/sysconfig/keepalived文件的查看方法,先找到ka的service路径,打开keepalived.service文件后,EnvironmentFile等号后面的值便是。
在这里插入图片描述
在这里插入图片描述
2.定义规则文件
vim /etc/rsyslog.d/6-keepalived.conf

local6.*   /var/log/keepalived.log

3.重启ka服务
重启keepalived.service和rsyslog.service
在这里插入图片描述
由日志了
在这里插入图片描述

实现ka独立子配置文件

当生产环境复杂时,/etc/keepalived/keepalived.conf文件中内容过多,不易管理,可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中。

利用include指令可以实现包含子配置文件,格式如下:

include /etc/keepalived/conf.d/*.conf

vim /etc/keepalived/keepalived.conf
在这里插入图片描述

mkdir /etc/keepalived/conf.d/

vim leimall.org.conf

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
}

抢占模式和非抢占模式

默认为抢占模式 preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt,即高优先级主机恢复后,并不会抢占低优先级主机的master角色。

注意:非抢占模式下,如果原主机down机, VIP迁移至的新主机,后续新主机也发生down时,仍会将VIP迁移回原主机。

注意:要关闭VIP抢占,必须将各Keepalived服务器state配置为BACKUP

#ha1主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface ens33  
  virtual_router_id 66
  priority 100    #优先级高
  advert_int 1
  nopreempt       #添加此行,设为nopreempt
}

#ha2主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface ens33
  virtual_router_id 66
  priority 80     #优先级低
  advert_int 1
  #nopreempt       #生产中ka2主机是抢占式,不添加此行,否则会导致ka1即使优先级降低,也不会切换至ka2
}

抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP

preempt_delay    #指定抢占延迟时间为#s,默认延迟300s

注意:需要各keepalived服务器state为BACKUP,并且不要启用vrrp_strict

#ka1主机配置
vrrp_instance VI_1 {
  state BACKUP         #都为BACKUP
  interface eth0
  virtual_router_id 66
  priority 100         #优先级高
  advert_int 1
  preempt_de1ay 60     #抢占延迟模式,默认延迟300s
}

#ka2主机配置
vrrp_instance VI_1 {
  state BACKUP    #都为BACKUP
  interface eth0
  virtual_router_id 66
  priority 80     #优先级低
  advert_int 1
}

VIP单播配置

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。机器不多就用单播。

注意:启用vrrp_strict时,不能启用单播

在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络

unicast_src_ip <IPADDR>      指定发送单播的源IP
unicast_peer {
   <IPADDR>       指定接收单播的对方目标主机IP
   ......
}

192.168.10.137的MASTER配置

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150     指向对方主机IP
       192.168.10.151     如果有多个keepalived,再加其他节点的ip
    }
}

192.168.10.150的BACKUP配置

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
        192.168.200.17/24
        192.168.200.18/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
}

抓包观察

tcpdump -i ens33 -nn src host 192.168.10.137 and dst host 192.168.10.150

在这里插入图片描述
可以看出已经是192.168.10.137向192.168.10.150单播发送消息了,不再是使用多播地址224.0.0.18广播消息了。

KA通知脚本配置

当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户

默认以用户keepalived_script身份执行脚本,如果此用户不存在,以root执行脚本

可以用下面指令指定脚本执行用户的身份

global_defs {
  ....
  script_user <USER>
  ....
}

通知脚本类型

1.当前节点成为主节点时触发的脚本

notify_master <STRING>|<QUOTED-STRING>

2.当前节点转为备节点时触发的脚本

notify_backup <STRING>|<QUOTED-STRING>

3.当前节点转为“失败”状态时触发的脚本

notify_fault <STRING>|<QUOTED-STRING>

4.通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

notify <STRING>|<QUOTED-STRING>

5.停止VRRP时触发的脚本

notify_stop <STRING>|<QUOTED-STRING>

notify.sh

#!/bin/bash
wall The host is to being $1 state

在这里插入图片描述

脚本调用方法

脚本的使用可以参看编译安装后的路径下的示范案例
在这里插入图片描述

在vrrp_instance Vl_1语句块的末尾加下面行

notify_master "/etc/keepalived/conf.d/notify.sh master"
notify_backup "/etc/keepalived/conf.d/notify.sh backup"
notify_fault "/etc/keepalived/conf.d/notify.sh fault"

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当我关掉150的ka服务之后
在这里插入图片描述

实现KA的双主架构

ka1主机配置

root@ka1:~# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

include /etc/keepalived/conf.d/*.conf

ka1的cluster1.conf

root@ka1:~# cat /etc/keepalived/conf.d/cluster1.conf 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_fault "/etc/keepalived/conf.d/notify.sh fault" 
}

ka1的cluster2.conf

root@ka1:~# cat /etc/keepalived/conf.d/cluster2.conf 
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 61
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.17/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_fault "/etc/keepalived/conf.d/notify.sh fault" 
}

在这里插入图片描述

ka2主机配置

ka2的keepalived.conf

root@ka2:~# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  # vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

include /etc/keepalived/conf.d/*.conf

ka2的cluster1.conf

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

ka2的cluster2.conf

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { 
        192.168.200.17/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

在这里插入图片描述
查看IP
在这里插入图片描述

实现多主架构

三个节点的三主三从

在这里插入图片描述

第一个节点ka1配置:
virtual_router_id 1, vrrp instance 1, MASTER, 优先级100
virtual_router_id 3, vrrp instance 2, BACKUP, 优先级80

第二个节点ka2配置:
virtual_router_id 2, vrrp instance 1, MASTER, 优先级100
virtual_router_id 1, vrrp instance 2, BACKUP, 优先级80

第三个节点ka3配置:
virtual_router_id 3, vrrp instance 1, MASTER,优先级100
virtua1_router_id 2, vrrp instance 2, BACKUP,优先级80

三个节点的三主六从架构

在这里插入图片描述

第一个节点ka1配置:
virtual_router_id 1,  vrrp instance 1, MASTER,优先级100
virtual_router_id 2,  vrrp instance 2, BACKUP,优先级80
virtual_router_id 3,  vrrp instance 3, BACKUP,优先级60

第二个节点ka2配置:
virtua1_router_id 1,  vrrp instance 1, BACKUP,优先级60
virtua1_router_id 2,  vrrp instance 2, MASTER,优先级100
virtual_router_id 3,  vrrp instance 3, BACKUP,优先级80

第三个节点ka3配置:
virtua1_router_id 1,  vrrp instance 1, BACKUP,优先级80
virtual_router_id 2,  vrrp instance 2, BACKUP,优先级60
virtual_router_id 3,  vrrp instance 3, MASTER,优先级100

实现IPVS的高可用

IPVS相关配置

每一个虚拟服务器即一个IPVS集群,可以通过下面语法实现

virtual_server IP port {
    ......
    
    real_server IP port {
        ......
    }

    real_server IP port {
        ......
    }
}

环境准备

1.两台ka服务137和150,VIP为192.168.200.16/24
2.两台web服务151和153,因为是基于DR模式的ipvs,所以VIP都配192.168.200.16/24
在这里插入图片描述

修改RS的内核参数

两台web服务需要修改自己的VIP为不应答和广播,这里我们使用脚本配置
lvs_dr_rs.sh

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.200.16
mask='255.255.255.0'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "`hostname -I`" > /var/www/html/index.html

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac

两台web服务同时执行脚本
在这里插入图片描述

虚拟服务器配置

virtual_server IP port{               VIP和PORT
    delay_loop <INT>                  检查后端服务器的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh  定义调度方法
    lb_kind NAT|DR│TUN                集群的类型,注意要大写
    persistence_timeout <INT>         持久连接时长
    protocol TCP|UDP|SCTP             指定服务协议,一般为TCP
    sorry_server <IPADDR><PORT>       所有RS故障时,备用服务器地址
    real_server <IPADDR><PORT> {      RS的IP和PORT
        weight <INT>                  RS权重
        notify_up <STRING> |<QUOTED-STRING>     RS上线通知脚本
        notify_down <STRING> |<QUOTED-STRING>   RS下线通知脚本
        HTTP_GET| SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }  定义当前主机健康状态检测方法
     }
}

注意:括号必须分行写,两个括号写在同一行,如:}}会出错

137的cluster1.conf

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
   notify_master "/etc/keepalived/conf.d/notify.sh master"
   notify_backup "/etc/keepalived/conf.d/notify.sh backup"
   notify_master "/etc/keepalived/conf.d/notify.sh master"
}

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.10.153 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

150的配置

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.150
    unicast_peer {
        192.168.10.137
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_fault "/etc/keepalived/conf.d/notify.sh fault"
}

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

   real_server 192.168.10.153 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

重启ka服务,查看ipvsadm规则

systemctl restart keepalived.service

在这里插入图片描述
这是keepalived自动生成的ipvsadm规则

模拟客户端访问VIP

这里还有问题,先跳过,后续补上

后端服务的健康性检查

KA是怎么探测后端服务的健康性的呢?

默认通过KeepAliveClient浏览器来发送HTTP/1.0协议

HTTP_GET

应用层检测:HTTP_GET |SSL_GET

HTTP_GET|SSL_GET {
    url {
       path <URL_PATH>          定义要监控的URL
       status_code <INT>        判断上述检测机制为健康状态的响应码,一般为 200
   }
   connect_timeout <INTEGER>    客户端请求的超时时长,相当于haproxy的timeout server
   nb_get_retry <INT>           重试次数
   delay_before_retry <INT>     重试之前的延迟时长
   connect_ip <IP ADDRESS>      向当前RS哪个IP地址发起健康状态检测请求
   connect_port <PORT>          向当前RS的哪个PORT发起健康状态检测请求
   bindto <IP ADDRESS>          向当前RS发出健康状态检测请求时使用的源地址
   bind_port <PORT>             向当前RS发出健康状态检测请求时使用的源端口
}

示例

virtual_server 192.168.200.16 80 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
        sorry_server 127.0.0.1 80
        
        real_server 192.168.10.151 80 {
            weight 1
            HTTP_GET {
                url {
                   path /monitor.html
                   status_code 200
                }
                connect_timeout 1
                nb_get_retry 3
                delay_before_retry 1
           }
        }
        
        real_server 192.168.10.153 80 {
            weight 1
            HTTP_GET {
                url {
                    path /
                    status_code 200
                }
                connect_timeout 1
                nb_get_retry 3
                delay_before_retry 1
            }
        }
}

TCP监测

传输层检测:TCP_CHECK

TCP_CHECK {
     connect_ip <IP ADDRESS>     向当前RS的哪个IP地址发起健康状态检测请求
     connect_port <PORT>         向当前RS的哪个PORT发起健康状态检测请求
     bindto <IP ADDRESS>         发出健康状态检测请求时使用的源地址
     bind_port <PORT>            发出健康状态检测请求时使用的源端口
     connect_timeout <INTEGER>   客户端请求的超时时长,等于haproxy的timeout server
}

示例

virtual_server 192.168.200.16 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 120      会话保持时间
    protocol TCP
    sorry_server 127.0.0.1 80
    
    real_server 192.168.10.151 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
         }
     }
     
    real_server 192.168.10.153 80 {
         weight 1
         TCP_CHECK {
             connect_timeout 5
             nb_get_retry 3
             delay_before_retry 3
             connect_port 80
        }
    }
}

基于VRRP Script实现其他应用的高可用性

keepalived利用VRRP Script技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能。

VRRP Script 配置

VRRP Script的配置分两步实现定义脚本和调用脚本。

1.定义VRRP script

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值监控指定应用的状态,一旦发现应用的状态异常,则触发对MASTER节点的权重的减小,减至低于SLAVE节点,从而实现VIP切换到SLAVE节点。

公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后;是和global_defs平级的语句块。

当keepalived_script用户存在时,会以此用户身份运行脚本,否则默认以root运行脚本

注意:此定义脚本的语句块一定要放在下面调用此语句vrrp_instance语句块的前面

vrrp_script <SCRIPT_NAME> {
  script <STRING>|<QUOTED-STRING>   此脚本返回值为非O时,会触发下面OPTIONS执行
  OPTIONS
}
vrrp_script <SCRIPT_NAME> {              定义一个检测脚本,在global_defs之外配置
      script <STRING> |<QUOTED-STRING>   shell命令或脚本路径
      interval <INTEGER>                 间隔时间,单位为秒,默认1秒
      timeout <INTEGER>                  超时时间
      weight <INTEGER:-254..254>         默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与  本节点权重相加可以降低本节点权重,即表示fa11,
                                         如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
      fall <INTEGER>                     执行脚本连续几次都失败,则转换为失败,建议设为2以上
      rise <INTEGER>                     执行脚本连续几次都成功,把服务器从失败标记为成功
      user USERNAME [GROUPNAME]          执行监测脚本的用户或组
      init_fail                          设置默认标记为失败状态,监测成功之后再转换为成功状态
}

2.调用VRRP script

track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script

track_script {
  SCRIPT_NAME_1
  SCRIPT_NAME_2
}
vrrp_instance VI_1 {
    ....
    track_script {
        <SCRIPT_NAME>
   }
}

示范案例

vrrp_script check_down {
    script "[ ! -f /etc/keepalived/down ]"     /etc/keepalived/down 存在时返回非0,触发权重-30
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/24
    }
    unicast_src_ip 192.168.10.137
    unicast_peer{
       192.168.10.150
    }
    track_script{
        check_down
    }
    notify_master "/etc/keepalived/conf.d/notify.sh master"
    notify_backup "/etc/keepalived/conf.d/notify.sh backup"
    notify_master "/etc/keepalived/conf.d/notify.sh master"
}

在这里插入图片描述
“-f /etc/keepalived/down” 表示文件知否存储,

"[! -f /etc/keepalived/down ]"      /etc/keepalived/down 存在时返回非0,触发权重-30

在这里插入图片描述

实现HAproxy高可用

1.在两个ka1和ka2上实现haproxy的配置

vim /etc/haproxy/haproxy.cfg

[root@ka1 ~]#cat /etc/haproxy/haproxy.cfg
listen leiedu_http
    bind 192.168.200.16:80
    server 192.168.10.151 192.168.10.151:80 check
    server 192.168.10.153 192.168.10.153:80 check
    
listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri    /haproxy-status
    stats auth   haadmin: 123456

2.在两个ka1和ka2两个节点启用内核参数

vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

sysctl -p
在这里插入图片描述

3.创建check_haproxy.sh

vim /etc/keepalived/ check_haproxy.sh

#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy

赋予脚本执行权限

chmod a+x /etc/keepalived/check_haproxy.sh

4.配置keepalived调用脚本

vim /etc/keepalived/keepalived.conf

! configuration File for keepalived
    g1obal_defs {
        notification_email {
        root@localhost
    }
     notification_emai1_from kaadmin@localhost
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id ka1.lei.org            在另一个节点为ka2.lei.org
     vrrp_mcast_group4 224.0.100. 100
}

vrrp_script check_haproxy {           定义脚本
    script "/etc/keepalived/check_haproxy.sh"
    interval 1
    weight -30
    fall 3
    rise 2
    timeout 2
}
vrrp_instance VI_1 {
    state MASTER            在另一个节点为BACKUP
    interface eth0
    virtual_router_id 66
    priority 100            在另一个节点为80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtua1_ipaddress {
       192.168.200.16/24 dev ens33 labe1 ens33:1
    }
    track_interface {
       ens33
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup " /etc / keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fau1t"
    track_script {
       check_haproxy      调用上面定义的脚本
    }
}

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值