zoukankan      html  css  js  c++  java
  • keepalived 配置笔记

    keepalived+nginx,实现nginx高可用

    1. VIP不需要在服务器网络配置文件中配置。一般为未使用的IP充当虚拟IP
    2. nginx主不可用时,需要kill掉nginx主的keepalived服务,这样才可以实现VIP切换,因为主的keepalived优先级高。
    3. 故障切换即keepalived主备切换 触发notify_maste(节点变成主节点)指定的脚本
    4. keepalived自带的邮件通知基于sendmail 不推荐使用
    5. 配置文件 /etc/keepalived/keepalived.conf

    全局配置

    # 全局def配置块
    global_defs {
        # 将接收通知邮件的电子邮件帐户
        notification_email {
            coldsmog@foxmai.com
            email
        }
        # sendmail 发送者
        notification_email_from coldsmog.work@foxmai.com
        # smtp 用于发送邮件通知的服务器地址
        smtp_server host
        # 指定SMTP处理超时
        smtp_connect_timeout 30
        # 指定LVS主管的姓名 一般为本机的hostname
        lvs_id string
    }
    

    虚拟服务器配置

    # 虚拟服务器定义块
    virtual_server (@IP PORT)|(fwmark num) {
        # 以秒为单位指定两次检查之间的间隔
        delay_loop 6
        # 选择特定的调度程序(rr|wrr|lc|wlc|sh|dh|lblc)
        lb_algo rr
        # 选择特定的转发方式(NAT|DR|TUN)
        lb_kind NAT
        # 如果您不将LVS与Linux内核2.2系列一起使用,则“ nat_mask”关键字已过时。该标志使您能够定义反向NAT粒度。
        (nat_mask @IP)
        # 指定持久连接的超时值
        persistence_timeout 50
        # 为持久连接指定粒度掩码
        persistence_granularity @IP
        # 指定用于HTTP | SSL_GET的HTTP虚拟主机
        virtualhost string
        # 指定协议种类(TCP|UDP)
        protocol TCP
    
        # 如果所有真实服务器都已关闭,则将服务器添加到池中
        sorry_server @IP PORT
        # 指定一个真实的服务器成员
        real_server 192.168.201.100 443 {
            # 权重
            weight 1
            # 使用TCP连接检查实际服务器的可用性
            TCP_CHECK {
                connect_port num
                connect_timeout num
            }
        }
        real_server 192.168.200.1 1358 {
            weight 1
            # 使用用户定义的脚本检查实际服务器的可用性
            MISC_CHECK {
                # 不需要携带参数
                misc_path /path_to_script/script.sh
                # 对于需要自变量的脚本,路径和参数必须用双引号(“)引起来
                (or misc_path “ /path_to_script/script.sh <arg_list>”)
            }
        }
        real_server 192.168.200.2 1358 {
            weight 1
            # 使用(HTTP_GET|SSL_GET)请求检查实际服务器的可用性
            HTTP_GET {
                # 可以添加多个URL块
                url {
                  path /testurl/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334d
                }
                url {
                  path /testurl2/test.jsp
                  digest 640205b7b0fc66c1ea91c463fac6334d
                }
                connect_timeout 3
                retry 3
                delay_before_retry 3
            }
        }
    }
    

    VRRP实例配置

    # 标识VRRP同步实例组
    vrrp_sync_group string {
        group {
            string
            string
        }
        # 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
        notify_master /etc/keepalived/send_mail.sh
        notify_backup /etc/keepalived/send_mail.sh
        notify_fault /etc/keepalived/send_mail.sh
    }
    # VRRP实例定义块
    vrrp_instance VI_1 {
        # 声明节点实例状态 (MASTER|BACKUP)
        state MASTER
        # 指定要在其上运行实例的网络接口 一般为eth0
        interface eth0
        # 本机IP地址
        mcast_src_ip @IP
        # 指定要在其上运行lvs_sync_daemon的网络接口
        lvs_sync_daemon_interface eth0
        # 指定实例所属的VRRP路由器ID, 相同的VRID为一个组,他将决定多播的MAC地址,一般为VIP(xx.xx.xx.73)最后一段 
        virtual_router_id 73
        # 在VRRP路由器中指定实例优先级
        priority 100
        # 组播信息发送间隔,两个节点设置必须一样,默认1s
        advert_int 1
        # 激活SMTP通知以进行主状态转换
        smtp_alert
        # 
        authentication {
            # 指定要使用的身份验证类型(PASS|AH)
            auth_type PASS
            # 指定要使用的密码字符串 同组节点必须一致
            auth_pass string
        }
        # VRRP VIP定义块 注意VIP必须是没有使用过的IP
        virtual_ipaddress { # 限制为20个IP地址
            172.16.xx.73
        }
        virtual_ipaddress_excluded { # 排查IP地址
            @IP
            @IP
        }
        # 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
        notify_master /etc/keepalived/send_mail.sh
        notify_backup /etc/keepalived/send_mail.sh
        notify_fault /etc/keepalived/send_mail.sh
    }
    

    Nginx 检查脚本

    如果nginx停止运行,尝试启动,如果无法启动则杀死本机的keepalived进程,keepalied将虚拟ip绑定到BACKUP机器上
    vi /etc/keepalived/nginx_check.sh

    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/sbin/nginx  
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    

    通知邮件配置

    安装依赖

    yum -y install perl-CPAN
    cpan Net::SMTP_auth
    

    vi /etc/keepalived/send_mail.sh

    #!/usr/bin/perl -w  
    use Net::SMTP_auth;
    use strict;
    #smtp服务器
    my $mailhost = 'smtp.exmail.qq.com';
    #发送邮件的邮箱
    my $mailfrom = 'from@qq.com';
    #接收邮件的邮箱
    my @mailto   = ('to@qq.com');
    #邮件主题
    my $subject  = 'keepalived up on backup';
    #邮件正文
    my $text = "正文
     nginx-1服务器宕机!!nginx-2变为master!!!";
    #发送邮件的用户名
    my $user   = 'from@qq.com';
    #发送邮件的邮箱密码
    my $passwd = '123456';
    &SendMail();
    ##############################  
    # Send notice mail  
    ##############################  
    sub SendMail() {
        my $smtp = Net::SMTP_auth->new( $mailhost, Timeout => 120, Debug => 1 )
          or die "Error.
    ";
        $smtp->auth( 'LOGIN', $user, $passwd );
        foreach my $mailto (@mailto) {
            $smtp->mail($mailfrom);
            $smtp->to($mailto);
            $smtp->data();
            $smtp->datasend("To: $mailto
    ");
            $smtp->datasend("From:$mailfrom
    ");
            $smtp->datasend("Subject: $subject
    ");
            $smtp->datasend("
    ");
            $smtp->datasend("$text
    
    ");
            $smtp->dataend();
        }
        $smtp->quit;
    }
    

    参考 https://github.com/acassen/keepalived
    参考 https://www.cnblogs.com/John-2011/p/7838794.html
    参考 http://my.oschina.net/hncscwc/blog/158746

  • 相关阅读:
    解决Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4
    spring task:annotation-driven 定时任务
    Windows注意目录
    vbScript 备忘
    java 将字符串数组变为字典顺序排序后的字符串数组
    jquery选中以什么开头的元素
    java如何将毫秒数转为相应的年月日格式
    jstl foreach 取index
    jQuery 效果
    js判断一个字符串是以某个字符串开头
  • 原文地址:https://www.cnblogs.com/hyry/p/14525843.html
Copyright © 2011-2022 走看看