原理简述

本篇主要学习keepalived配合nginx实现nginx的高可用, 也就是需要keepalived检测到nginx宕机时停用keepalived, 备用keepalived会自动接收过来.

简单的原理(如下图), 主备服务器会配置相同的vip(虚拟ip), 谁的优先级高谁来接收vip的请求, 然后nginx和keepalived部署在同一个服务器上面, keeplived控制机器接收到vip的请求, 交给了nginx来处理请求. nginx的功能主要是负责负载均衡, nginx的安装配置在此不再赘述, 可以参考这个: ngix安装与使用

keepalived功能有很多, 此篇只是最简单的配合ngxin实现高可用的demo.

安装

  • 安装常用的的指令包: yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel

  • 安装: yum install -y keepalived

  • 启动: systemctl start keepalived

  • 重启: systemctl restart keepalived

  • 关闭: systemctl stop keepalived

  • 开机自启: systemctl enable keepalived

  • 修改配置文件: vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    # 定义虚拟路由, 必须叫VI_1
    vrrp_instance VI_1 {
    state MASTER #设置为主服务器, 备份服务器设置为BACKUP
    interface enp0s3 #监控的网络接口(ifconfig或者ip addr指令找出网卡)
    priority 100 #(优先级, 主机大一点, 备份机小一点)
    virtual_router_id 99 #同一个vrrp_instance下routerId必须是一致的 authentication {
    auth_type PASS #vrrp认证方式主备必须一致
    auth_pass 12345 #密码
    } virtual_ipaddress {
    192.168.0.99 #虚拟ip, 主从一致, 可配置多个
    }
    }
  • 另外一台机相同方法, 相同配置(state改成BACKUP, priority调整调一下, 此例中是80)

vrrp 的主从并不是通过stat配置的MASTERBACKUP决定的, 是通过优先级决定的

参考1: Linux下Keepalived安装与配置

参考2: Keepalived原理介绍和配置实践

参考3: keepalived介绍、安装及配置详解

参考4: https://codor.lanzoue.com/b012qnsvc 密码:1i77

检查是否脑裂

  • 使用a或者b进行查看, 默认的广播通道为224.0.0.18 (我把时间删除了, 内容是我改的)

    192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
    192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
    192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
  • 如果结果如上, 说明出现了脑裂(主备都向外宣誓我是老大),

    出现这种情况的原因是防火墙或者iptables拦截了vrrp请求, 进行放行即可.

    防火墙(推荐):

    firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
    firewall-cmd --reload

    iptables:

    iptables -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT

    不存在可以进行安装, yum install iptables-services

  • 最后附上正常运行结果, 即只有100或者80优先级的机器来广播自己是老大

    09:26:55.782258 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    09:26:56.782910 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    09:26:57.783787 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    09:26:58.784709 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    09:26:59.784792 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
    09:27:00.785171 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20

测试ip漂移

`ip漂移`: 就是主备切换过程成, vip漂到真实ip上的过程. 也称为`主备切换`.

测试过程就是停用master机器上面的keepalived或者关机master机器, 查看backup机器是否正常接过来, 一般1s左右可以切换过去. 当出现脑裂情况的时候切换过程也能实现, 只是很慢大约7s左右. 具体原因未深究.

漂移过程可以通过抓包实现, 也可以通过两给ngxin转发到不同tomcat中的项目或网页, 或者修改ngxin的默认网页进行测试都可.

至此位置简单使用就完成了, 下面介绍几个功能配置

VRRP脚本

  • 签到keepalived的配置文件夹: cd /etc/keepalived/

  • 创建一个脚本文件: vim nginx_check.sh

    #!/bin/bash
    count=`ps -C nginx --no-header |wc -l`
    if [ $count -eq 0 ];then
    killall keepalived
    fi
  • 赋予执行权限: chmode +x nginx_check.sh

  • 引入脚本: vim keepalived.conf

    vrrp_instance同级, 其中

    • chk_nginx: 脚本名称, 自定义的

    • script: 脚本位置

    • interval: 执行间隔

    • weight: 权重, 如果是负数, 当执行失败时候会影响vrrp_instance中的优先级priority, 因为主备切换是通过优先级的高低的进行切换的, 所以也可以通过这个优先级来进行主动控制主备切换. 而脚本中的内容可以很灵活地实现很多功能. 此个demo中只是简单实现检测到ngxin关闭后自动关闭keepalived, 也可以实现检测启动后进行开启, 然后延迟2s后查看是否启动成功, 未成功再进行关闭keepalived或者降低优先级(配合右键通知).

      vrrp_script chk_nginx {
      script "/etc/keepalived/nginx_check.sh"
      interval 2
      #weight -30
      }
  • 配置到vrrp_instance中, 与authentication和virtual_ipaddress同级

    track_script {
    chk_nginx
    }
  • 修改后的配置文件

    ! Configuration File for keepalived
    
    vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    #weight -30
    } vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    priority 100
    advert_int 1
    virtual_router_id 99
    authentication {
    auth_type PASS
    auth_pass 221531
    } track_script {
    chk_nginx
    } virtual_ipaddress {
    192.168.0.99
    }
    }
  • 测试

    正常启动时候, 手动关闭nginx, 查看keepalived的状态.

  • 参考:

邮件配置

邮件功能是linux上面的mail指令.

  • 安装mail: yum -y install mailx

  • 编辑配置文件(设置发送人信息): vim /etc/mail.rc, 在末尾处添加

    set from=xxx@163.com
    set smtp=smtp.163.com
    set smtp-auth-user=xxx@qq.com
    set smtp-auth-password=KJFHTOSXZQPNFAIU #邮箱需要开启POP3/SMTP服务并设置密钥
    set smtp-auth=login
    set ssl-verify=ignore
  • 测试mail功能: echo test mail | mail -s testa 收件人id@qq.com

    • -s 后面是主题的意思

    • echo test maill 中的test mail 是邮件正文.

    • 最后跟着收件人

  • 配置到keepalived中, 方法1

    • 创建脚本 vim mail_send.sh(记得赋予执行权限)

      可以使用./mail_send.sh master进行测试

      #!/bin/bash
      contact='收件人邮箱@qq.com'
      notify() {
      mailsubject="$(hostname) to be $1, vip 转移"
      mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
      echo "$mailbody" | mail -s "$mailsubject" $contact
      }
      case $1 in
      master)
      notify master
      ;;
      backup)
      notify backup
      ;;
      fault)
      notify fault
      ;;
      *)
      echo "Usage: $(basename $0) {master|backup|fault}"
      exit 1
      ;;
      esac
    • 修改配置文件: vim keepalived.conf

      vrrp_instance下与authentication同级处

      notify_master "/etc/keepalived/mail_senc.sh master"
      notify_backup "/etc/keepalived/mail_send.sh backup"
      notify_fault "/etc/keepalived/mail_send.sh fault"
    • 整体配置文件

      ! Configuration File for keepalived
      
      vrrp_script chk_nginx {
      script "/etc/keepalived/nginx_check.sh"
      interval 2
      #weight -30
      } vrrp_instance VI_1 {
      state MASTER
      interface enp0s3
      priority 100
      advert_int 1
      virtual_router_id 99
      # 当进入master/backup/fault状态时触发脚本, 可携带参数
      notify_master "/etc/keepalived/mail_send.sh master"
      notify_backup "/etc/keepalived/mail_send.sh backup"
      notify_fault "/etc/keepalived/mail_send.sh fault"
      authentication {
      auth_type PASS
      auth_pass 221531
      } track_script {
      chk_nginx
      } virtual_ipaddress {
      192.168.0.99
      }
      }
  • 配置到keepalived中, 方法2

    • 脚本内容, 下面这个是漂移到master时, 另外创建backup和fault

      #!/bin/bash
      contacts='收件人邮箱1, 收件人邮箱2'
      ip a > ipa_temp.txt echo "$(date +'%F %T'): Keepalived instance I became MASTER on $(hostname). --- from master" | mail -s "Master Keepalived notification" -a ipa_temp.txt "$contacts"
    • 修改配置文件: vim keepalived.conf

      vrrp_instance下与authentication同级处, 后面的root是执行人和所在组

      notify_master /etc/keepalived/mail_send_master.sh root root
      notify_backup /etc/keepalived/mail_send_back_up.sh root root
      notify_fault /etc/keepalived/mail_send_faul.sh troot root
  • 测试状态转移时有没有邮箱接收到即可, 通过重启, 停用

  • 参考:


学习链接

keepalived的简单使用的更多相关文章

  1. 测试redis+keepalived实现简单的主备切换【转载】

    转自: 测试redis+keepalived实现简单的主备切换 - Try My Best 尽力而为 - ITeye技术网站http://raising.iteye.com/blog/2311757 ...

  2. 高可用技术之keepalived原理简单了解

    Keepalived 工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议. 虚拟路由冗余协 ...

  3. keepalived+lvs简单实现

    一,部署实战环节 01,服务架构图: 服务器镜像为centos6.9   02,服务安装: 10.0.0.10: 下载keeplived官方包--> http://www.keepalived. ...

  4. Keepalived之简单有效的配置

    1.简介 官网地址:https://www.keepalived.org/ 源码包下载地址:https://www.keepalived.org/download.html Keepalived是一种 ...

  5. 配置LVS + Keepalived高可用负载均衡集群之图文教程

    负载均衡系统可以选用LVS方案,而为避免Director Server单点故障引起系统崩溃,我们可以选用LVS+Keepalived组合保证高可用性.  重点:每个节点时间都同步哈! C++代码 [r ...

  6. Linux 高可用(HA)集群之keepalived详解

    http://freeloda.blog.51cto.com/2033581/1280962 大纲 一.前言 二.Keepalived 详解 三.环境准备 四.LVS+Keepalived 实现高可用 ...

  7. keepalived双机热备nginx

    nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽 ...

  8. haproxy+keepalived(涵盖了lvs,nginx.haproxy比较)

    文章转载自: haproxy+keepalived    https://cloud.tencent.com/developer/article/1026385 网络四层和七层的区别   https: ...

  9. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  10. keepalived与zookeeper

    keepalived与zookeeper都可以用来实现高可用,高可用一般跟负载均衡会一起考虑,所以通常也会考虑到相应的负载均衡能力, 1.概括对比: 1.1.Keepalived: 优点:简单,基本不 ...

随机推荐

  1. vue项目浏览器ioc小图标

    1 先有一个需要图片,png .jpg ...格式都可以 2 把图片转换成 .con 格式的图标  ,http://www.bitbug.net/使用比特虫转换 ,目标尺寸:16*16 或者 32*3 ...

  2. Jmeter四、jmeter脚本组成和组件搭配

    一.jmeter脚本开发原则 简单:去除无关的组件,同时能复用的尽量复用. 正确:对脚本或者业务正确性进行必要的判断,不能少也不能多(200) 高效:部分组件仅仅在脚本开发模式使用,在真正生产环境下不 ...

  3. std::ref

    The std::thread constructor copies the supplied values, without converting to the expected argument ...

  4. 【python】第一模块 步骤五 第一课、内存管理机制

    第一课.内存管理机制 一.课程介绍 1.1 课程概要 课程概要 赋值语句的内存分析 垃圾回收机制 内存管理机制 课程目标 掌握赋值语句内存分析方法 掌握id()和is()的使用 了解python的垃圾 ...

  5. leetcode 1636

    一些关于hashmap和list的用法 class Solution { public int[] frequencySort(int[] nums) { Map<Integer, Intege ...

  6. 免费Linux RDP,用来练习linux或者Python,还能做成远程桌面

        分类:资源| 阅读:1103次阅读 goorm提供了免费的Linux容器,用它来在线练习命令行是非常不错的. 它的注册非常简单:https://ide.goorm.io/ 直接用谷歌账号登录即 ...

  7. XML_DTD_20200415

    <!-- xml的注释写法 --> 格式良好的xml语言必须具备的几个条件  1.必须有xml声明语句,声明版本号与编码字符集 2.必须有且仅有一个根元素 3.标签大小写敏感  4.属性值 ...

  8. django_模板层的变量和标签

    一.模板层的变量 1.能传递到模板层的数据类型:str(字符串).list(数组).dict(字典).obj(类实例化的对象).fun(函数)等. 2.在模板中使用变量的方法: (1)字符串:{{ 变 ...

  9. 第十二组 -摩天脆脆冰淇淋队-第四次团队作业:Git实战

    这个作业属于哪个课程 至诚软工实践F班 - 福州大学至诚学院 - 班级博客 - 博客园 (cnblogs.com) 这个作业要求在哪里 第四次团队作业:Git实战 - 作业 - 至诚软工实践F班 - ...

  10. 磊磊零基础打卡算法:day16 c++ Trie树

    5.19 Trie树: 用处:快速的查找和高效存储字符串集合的数据结构. 类似如此的查找,存储 其简单的两个操作:插入和删除 插入: void insert(char str[]) { int p; ...