keepalived

keepalived

一、keepalived简介

1.1 keepalived是什么?

keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx、haproxy、mysql等)的高可用解决方案软件。

keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

Keepalived官网:http://www.keepalived.org/

2.2 Keepalived的重要功能

keepalived有三个重要的功能,分别是:

  1. 管理LVS负载均衡软件

  2. 实现LVS集群节点的健康检查

  3. 作为系统网络服务的高可用性

2.3 Keepalived高可用故障转移的原理

Keepalived高可用服务之间的故障切换转移,是通过VRRP来实现的。

在Keepalived服务正常工作时,主Master节点会不断地向备Backup节点发送(多播的方式)心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主节点的心跳了,于是调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

二、Keepalived原理

2.1 VRRP

Keepaliced高可用对之间是通过VRRP通信的,因此,我们从VRRP开始了解起:

  1. VRRP,中文名为虚拟路由冗余协议,是为了解决静态路由的单点故障。

  2. VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。

  3. VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间通信。

  4. 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。

  5. VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

2.2 Keepalived工作原理

Keepalived高可用是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主节点的优先级高于备节点,因此,工作时主节点会优先获得所有的资源,备节点处于等待状态,当主节点挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在Keepalived服务之间,只有作为主节点的服务器会一直发送VRRP组播包,告诉备节点它还活着,此时备节点不会抢占主节点,当主节点不可用时,即备节点监听不到主节点发送的组播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

三、Keepalived部署

3.1 keepalived配置文件说明

复制代码
 cd /etc/keepalived
 cp keepalived.conf conf keepalived.conf.ba
 cat keepalived.conf
复制代码
 # 配置文件重要信息含义
 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_instance VI_1 {           # 定义实例
     state MASTER          # 指定keepalived节点的初始状态,可选值为MASTER/BACKUP
     interface eth0     # VRRP实例绑定的网卡接口,用户发送VRRP包
     virtual_router_id 51 # 虚拟路由的ID,同一集群要一致
     priority 100   # 定义优先级,按优先级来决定主备角色,优先级越大越优先
     advert_int 1  # 主备通讯时间间隔
     authentication {     # 配置认证
         auth_type PASS   # 认证方式,此处为密码
         auth_pass 1111   # 同一集群中的keepalived配置里此处必须一致,推荐使用8为随机数
     }
     virtual_ipaddress {        # 配置要使用的VIP
         192.168.200.16
         192.168.200.17
         192.168.200.18
     }
 }
 ​
 virtual_server 192.168.200.100 443 { # 配置虚拟服务器
     delay_loop 6    # 健康检查的时间间隔
     lb_algo rr      # lvs调度算法
     lb_kind NAT     # lvs模式
     persistence_timeout 50 # 持久化超时时间,单位为秒
     protocol TCP    # 4层协议
 ​
 sorry_server  192.168.200.200 1358 # 定义备用服务器,当所有RS都故障时,用sorry_server来响应客户端
 ​
     real_server 192.168.201.100 443 {  # 定义真实处理请求的服务器
         weight 1       # 给服务器指定权重,默认为1
         SSL_GET {
             url {
               path /        # 指定要检查的URL路径
               digest ff20ad2481f97b1754ef3e12ecd3a9cc    # 摘要信息
             }
             url {
               path /mrtg/
               digest 9b3a0c85a887a256d6939da88aabd8cd
             }
             connect_timeout 3   # 连接超时时间
             retry 3             # get尝试次数
             delay_before_retry 3 # 在尝试之前延迟多长时间
         }
     }
 }

3.2 环境说明

master 192.168.100.100 CentOS-7

backup 192.168.100.200 CentOS-7

VIP 192.168.100.150

防火墙与selinux都关闭

配置阿里源与epel源

复制代码
 # 安装常用命令
 yum -y install vim wget gcc gcc-c++
 ​
 # 安装keepalived
 yum -y install keepalived
 ​
 # 安装nginx
 yum -y install nginx
 systemctl restart nginx
 systemctl enable nginx
 ​
 # master节点添加测试网页
 echo "master node" > /usr/share/nginx/html/index.html
 ​
 # backup节点添加测试网页
 echo "backup node" > /usr/share/nginx/html/index.html

3.3 配置主节点配置文件

复制代码
 global_defs {
    router_id ldh01
 }
 ​
 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.100.150
     }
 }
 ​
 virtual_server 192.168.100.150 80 {
     delay_loop 6
     lb_algo rr
     lb_kind DR
     persistence_timeout 50
     protocol TCP
 ​
     real_server 192.168.100.100 80 {
         weight 1
         TCP_CHECK {
             connect_port 80   
             connect_timeout 3  
             nb_get_retry 3
             delay_before_retry 3  
         }
     }
 ​
     real_server 192.168.100.200 80 {
         weight 1
         TCP_CHECK { 
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
         }
     }
 }
复制代码
 # 重启keepalived,并设置下次启动生效
  systemctl restart keepalived.service
  systemctl enable keepalived.service

3.4 配置备节点配置文件

复制代码
 global_defs {
    router_id ldh02
 }
 ​
 vrrp_instance VI_1 {
     state MASTER
     interface ens33
     virtual_router_id 51
     priority 90 # 比主节点小
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
         192.168.100.150
     }
 }
 ​
 virtual_server 192.168.100.150 80 {
     delay_loop 6
     lb_algo rr
     lb_kind DR
     persistence_timeout 50
     protocol TCP
 ​
     real_server 192.168.100.100 80 {
         weight 1
         TCP_CHECK {
             connect_port 80   
             connect_timeout 3  
             nb_get_retry 3
             delay_before_retry 3  
         }
     }
 ​
     real_server 192.168.100.200 80 {
         weight 1
         TCP_CHECK { 
             connect_port 80
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
         }
     }
 }
复制代码
 # 重启keepalived,并设置下次启动生效
  systemctl restart keepalived.service
  systemctl enable keepalived.service

3.5 主节点与备节点开启侦听VIP功能

复制代码
 vim /etc/sysctl.conf
 net.ipv4.ip_nonlocal_bind = 1
 ​
 sysctl -p

3.6 让keepalived监控nginx负载均衡

在master上编写脚本

复制代码
 mkdir /scripts
 cd /scripts/
 ​
 vim check.sh
 #!/bin/bash
 nginx_status=`ps -ef | grep -v "grep" | grep "nginx" | wc -l`
 if [ $nginx_status -lt 1 ];then
         systemctl stop keepalived
 fi
 :wq
 chmod +x check.sh
 ​
 vim notify.sh
 #!/bin/bash
 VIP=$2
 sendmail () { 
     subject="${VIP}'s server keepalived state is translate"
     content="`date +'%F %T'`: `hostname`'s state change to master"
     echo $content | mail -s "$subject" 843261424@qq.com
 }
 case "$1" in 
   master)
     nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
     if [ $nginx_status -lt 1 ];then
         systemctl start nginx
     fi
     sendmail
    ;;
    backup)                                      
     nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
     if [ $nginx_status -gt 0 ];then
         systemctl stop nginx
     fi
    ;;
    *) 
     echo "Usage:$0 master|backup VIP"
    ;;
 esac
 :wq
 chmod +x notify.sh

在backup上编写脚本

复制代码
 mkdir /scripts
 cd /scripts/
 scp root@192.168.100.100:/scripts/check.sh .
 scp root@192.168.100.100:/scripts/notify.sh .
 chmod +x check.sh
 chmod +x notify.sh
相关推荐
网安小白的进阶之路8 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-4
网络·web安全·php
七夜zippoe8 小时前
高性能网络编程实战:用Tokio构建自定义协议服务器
linux·服务器·网络·rust·tokio
wsx_iot8 小时前
TCP/IP 五层协议栈
网络·网络协议·tcp/ip
午安~婉9 小时前
浏览器与网络
前端·javascript·网络·http·浏览器
0和1的舞者11 小时前
网络通信的奥秘:网络层ip与路由详解(四)
大数据·网络·计算机网络·计算机·智能路由器·计算机科学与技术
Dobby_0512 小时前
【Docker】容器网络探索(二):实战理解 host 网络
网络·docker·云原生
小糖学代码12 小时前
网络:4.应用层自定义协议与序列化
网络
RAN_PAND14 小时前
计算机组成原理实验
网络·计算机组成原理
守城小轩15 小时前
轻量级HTTP&Socks代理GOST: Win编译安装
网络·网络协议·代理网络
七七七七0715 小时前
【计算机网络】深入理解ARP协议:工作原理、报文格式与安全防护
linux·服务器·网络·计算机网络·安全