Keepalived集群软件高级使用(工作原理和状态通知)

1、介绍

   Keeaplived主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived),有此需求者可参考以往博文:http://lizhenliang.blog.51cto.com/7876557/1343734。另一个是通过自身健康检查、资源接管功能做高可用(双机热备),实现故障转移。

  以下内容主要针对Keepalived+MySQL双主实现双机热备为根据,主要讲解keepalived的状态转换通知功能,利用此功能可有效加强对MySQL数据库监控。此文不再讲述Keepalived+MySQL双主部署过程,有需求者可参考以往博文:http://lizhenliang.blog.51cto.com/7876557/1362313

2、keepalived主要作用

   keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

3、工作在三层、四层和七层原理

Layer3:工作在三层时,keepalived会定期向热备组中的服务器发送一个ICMP数据包,来判断某台服务器是否故障,如果故障则将这台服务器从热备组移除。

Layer4:工作在四层时,keepalived以TCP端口的状态判断服务器是否故障,比如检测mysql 3306端口,如果故障则将这台服务器从热备组移除。

示例:
! Configuration File for keepalived
global_defs {
   notification_email {
     example@163.com
   }
   notification_email_from  example@example.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL_HA
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 50
    nopreempt                   #当主down时,备接管,主恢复,不自动接管
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        ahth_pass 123
    }
    virtual_ipaddress {
        192.168.1.200          #虚拟IP地址
    }
}
virtual_server 192.168.1.200 3306 {        
    delay_loop 6
#    lb_algo rr 
#    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 192.168.1.201 3306 {       #监控本机3306端口
        weight 1
        notify_down /etc/keepalived/kill_keepalived.sh   #检测3306端口为down状态就执行此脚本(只有keepalived关闭,VIP才漂移 ) 
        TCP_CHECK {         #健康状态检测方式,可针对业务需求调整(TTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK)
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

Layer7:工作在七层时,keepalived根据用户设定的策略判断服务器上的程序是否正常运行,如果故障则将这台服务器从热备组移除。

示例:
! Configuration File for keepalived
global_defs {
   notification_email {
     example@163.com
   }
   notification_email_from  example@example.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL_HA
}
vrrp_script check_nginx {
    script /etc/keepalived/check_nginx.sh    #检测脚本
    interval 2   #执行间隔时间
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 50
    nopreempt                   #当主down时,备接管,主恢复,不自动接管
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        ahth_pass 123
    }
    virtual_ipaddress {
        192.168.1.200          #虚拟IP地址
    }
    track_script {          #在实例中引用脚本
        check_nginx
    }
}
脚本内容如下:
# cat /etc/keepalived/check_nginx.sh
Count1=`netstat -antp |grep -v grep |grep nginx |wc -l`
if [ $Count1 -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    Count2=`netstat -antp |grep -v grep |grep nginx |wc -l`
    if [ $Count2 -eq 0 ]; then
        service keepalived stop
    else
        exit 0
    fi 
else
    exit 0
fi

4、健康状态检测方式

  4.1 HTTP服务状态检测

  HTTP_GET或SSL_GET {    
      url {
          path /index.html        #检测url,可写多个
          digest  24326582a86bee478bac72d5af25089e    #检测效验码
          #digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html 
          status_code 200         #检测返回http状态码
      }
      connect_port 80 #连接端口
      connect_timeout 3  #连接超时时间
      nb_get_retry 3  #重试次数
      delay_before_retry 2 #连接间隔时间
   }

  4.2 TCP端口状态检测(使用TCP端口服务基本上都可以使用)

  TCP_CHECK {    
      connect_port 80     #健康检测端口,默认为real_server后跟端口
      connect_timeout 5
      nb_get_retry 3
      delay_before_retry 3
  }

  4.3 邮件服务器SMTP检测

  SMTP_CHECK {            #健康检测邮件服务器smtp    
      host {
          connect_ip
          connect_port
      }
      connect_timeout 5
      retry 2
      delay_before_retry 3
      hello_name "mail.domain.com"
  }

  4.4 用户自定义脚本检测real_server服务状态

  MISC_CHECK {    
      misc_path /script.sh    #指定外部程序或脚本位置
      misc_timeout 3      #执行脚本超时时间
      !misc_dynamic       #不动态调整服务器权重(weight),如果启用将通过退出状态码动态调整real_server权重值
  }

5、状态转换通知功能

   keepalived主配置邮件通知功能,默认当real_server宕机或者恢复时才会发出邮件。有时我们更想知道keepalived的主服务器故障切换后,VIP是否顺利漂移到备服务器,MySQL服务器是否正常?那写个监控脚本吧,可以,但没必要,因为keepalived具备状态检测功能,所以我们直接使用就行了。

主配置默认邮件通知配置模板如下:
global_defs           # Block id
    {
    notification_email    # To:
        {
        admin@example1.com
        ...
         }
    # From: from address that will be in header
    notification_email_from admin@example.com
    smtp_server 127.0.0.1   # IP
    smtp_connect_timeout 30 # integer, seconds
    router_id my_hostname   # string identifying the machine,
                            # (doesn't have to be hostname).
    enable_traps            # enable SNMP traps
        }

  5.1 实例状态通知

      a) notify_master :节点变为master时执行

      b) notify_backup : 节点变为backup时执行

      c) notify_fault  : 节点变为故障时执行

  5.2 虚拟服务器检测通知

      a) notify_up   : 虚拟服务器up时执行

      b) notify_down  : 虚拟服务器down时执行

示例:
    ! Configuration File for keepalived
    global_defs {
       notification_email {
         example@163.com
       }
       notification_email_from example@example.com 
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id MYSQL_HA
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eth1
        virtual_router_id 50
        nopreempt           #当主down时,备接管,主恢复,不自动接管
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            ahth_pass 123
        }
        virtual_ipaddress {
            192.168.1.200
        }
            notify_master /etc/keepalived/to_master.sh
            notify_backup /etc/keepalived/to_backup.sh
            notify_fault /etc/keepalived/to_fault.sh
    }
    virtual_server 192.168.1.200 3306 {
        delay_loop 6
        persistence_timeout 50
        protocol TCP
        real_server 192.168.1.201 3306 {
            weight 1
            notify_up /etc/keepalived/mysql_up.sh
            notify_down /etc/keepalived/mysql_down.sh    
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }

状态参数后可以是bash命令,也可以是shell脚本,内容根据自己需求定义,以上示例中所涉及状态脚本如下:

1) 当服务器改变为主时执行此脚本

# cat to_master.sh 
#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')
Mail="baojingtongzhi@163.com"
echo "$Date $IP change to master." |mail -s "Master-Backup Change Status" $Mail

2) 当服务器改变为备时执行此脚本

# cat to_backup.sh
#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')
Mail="baojingtongzhi@163.com"
echo "$Date $IP change to backup." |mail -s "Master-Backup Change Status" $Mail

3) 当服务器改变为故障时执行此脚本

# cat to_fault.sh
#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')
Mail="baojingtongzhi@163.com"
echo "$Date $IP change to fault." |mail -s "Master-Backup Change Status" $Mail

4) 当检测TCP端口3306为不可用时,执行此脚本,杀死keepalived,实现切换

# cat mysql_down.sh
#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')
Mail="baojingtongzhi@163.com"
pkill keepalived
echo "$Date $IP The mysql service failure,kill keepalived." |mail -s "Master-Backup MySQL Monitor" $Mail

5) 当检测TCP端口3306可用时,执行此脚本

# cat mysql_up.sh
#!/bin/bash
Date=$(date +%F" "%T)
IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')
Mail="baojingtongzhi@163.com"
echo "$Date $IP The mysql service is recovery." |mail -s "Master-Backup MySQL Monitor" $Mail

本文出自 ““企鹅”那点事儿” 博客,请务必保留此出处http://lizhenliang.blog.51cto.com/7876557/1653523

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
由于博主所在公司最近业务量上升,各个项目进度加快,使得原有饱和的服务器资源变得紧张起来。博主很是着急啊,于是就做了一系列的资源使用统计和分析,然后向上递交了采购计划。 如题《记一次服务器上架的总结和反思》,服务器采购计划最终是批了。博主心情愉悦地等待着这批服务器的到达,并设计了相关的上架流程和自动化方案,最终进行了具体的实施操作。虽然在实施过程中遇到了一些问题,不过都是些不影响主流程的小问题,其中不乏在流程中忽略的点和未设计到的点,这些都是很值得事后思考和反思了。毕竟,这只是一次扩容,以后这种情况还会发生
前言 高可用集群,High Availability Cluster,简称HA Cluster,是指以减少服务中断时间为目的的服务器集群技术。通过上文可以看出,LVS集群本身并不能实现高可用,比如Director Server不能检测Real Server的健康度,一旦其中一台或全部 Real Server宕机, Director Server还会继续转发请求,导致站点无法访问,同样,如果 Director Server宕机站点就更不可能正常运转了。本文将讲解如何基于heartbeat v1实现LVS集群
假设现在需要构建一个 Wordpress 论坛站点,为了减轻站点压力,使用两台主机用于 Apache 服务器,对外提供 WEB 服务。且此两台主机都有独立 IP 地址。要求用 MariaDB 和 NFS 实现两个站点之间的数据同步。 拓扑如下 如上图所示。 SERVER1 有两块网卡,一块负责和外网通信,一块通过 S1 和内网中的 SERVER2 和 SERVER3 交互。以下是各主机的地址规划 主机 地址 用途 SERVER1 Eth0 : 192.168.252.10 配置两台虚拟主机,都安装上 Wo
目录 1、概述 2、percona-tooldit工具的安装 3、新建用户 4、pt-table-checksum使用 5、pt-table-sync使用 6、个人总结 1、概述 假如你是一位运维人员,假如你生产环境上部署了mysql系统,再假如你线上的mysql是基于主从复制的架构,那恭喜你,它将可能会带给你主从数据不一致的"恶运"。 由于mysql复制架构原生特性,主从服务器上的数据不可能做”同步“复制,所以延时是必然会有的,即使是不那么繁忙的服务器上,在业务不繁忙的时间里,从库能追上主库的进度,也可
1.pre 为了更方便的管理安装的软件需要创建个专用目录 cd~mkdirdata#diskcddatamkdirsoftware#软件安装位置mkdirtar_box#tar包存放位置 2.setup jdk 采用wget安装,安装源为官方jdk,选择jdk7 #cd/data/software#wget--no-cookies--no-check-certificate--header"Cookie:gpw_e24=http%3A%2F%2Fwww.oracle.com%2F;oraclelicens

LNMP分离式部署实例 - 2015-06-28 06:06:18

很多人在练习部署LNMP环境的时候,大都数是部署在同一个虚拟机上面的。但是实际工作中,我们一般都是分离部署的。 今天我就用3台虚拟机,部署下LNMP环境。以供参考! 网络拓扑图: 首先准备3台虚拟机: nginx:192.168.1.214 php:192.168.1.202 mysql:192.168.1.217 首先安装ngix(192.168.1.214): #解决依赖yuminstall-ygcc,openssl-devel,pcre-devel,zilb-develpcre-devel#关闭防火

Viola-Jones人脸检测--Harr特征 - 2015-06-27 14:06:01

Viola-Jones 人脸检测算法是第一个实时的人脸检测算法。其影响力就不用多说了,即便是现在,该算法的应用仍然非常广泛。众所周知, Viola-Jones 算法分为三个部分, Harr 特征和积分图,特征选择的 AdaptBoost 以及用于训练的 Cascade 模型。对于 Cascade 模型,它更多的表示的是一种 Strategy ,这可以当作一个另外的类别了,这个类别可以看作算法的一种“细节”处理,不同的人对其有不同的看法。 Cascade 模型主要的目的是降低训练时间,更重要的是使得分类器具
公司的缓存系统这几天出现问题,连接数超出限制的 2048 ,导致应用不能继续工作,我们需要确定是哪一台应用服务器上的哪个进程的连接数较多,假设缓存服务器的端口号为 11111 , IP 地址已用字母代替,具体方法如下: 1.找出应用服务器连接缓存服务器的连接数 #netstat
前言:由于服务器资源有限,keepalived未配主主、只配了一个VIP。本人在香港机房生产环境部署的实际案例,从2013年9月开始运行,服务从未挂过。由于涉及到生产环境,系统展示就不贴出来了。希望大家给予意见! Webserver部署的是lnmp环境,采用我自己写的一键编译安装脚本,安装目录在/data/webserver/。如大家想借鉴我的编译安装脚本,请留言向我索取。 一、架构规划 1、服务器IP地址规划 VIP:192.168.1.6 real_server1:192.168.1.7 real_s
Solaris 10(x86)构建Oracle 10g RAC之--配置系统环境(1) 系统环境: 操作系统:Solaris 10(x86-64) Cluster: Oracle CRS 10.2.0.1.0 Oracle: Oracle 10.2.0.1.0 如图所示:RAC 系统架构 本案例,通过Solairs 10(x86-64)系统,构建Oracle 10g 的RAC;共享存储采用RAW+ASM的方式进行管理。 一、操作系统环境 [root@node1:/]# uname -a SunOS nod