菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
182
0

keepalived 配置笔记

原创
05/13 14:22
阅读数 54743

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 = "正文\n 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.\n";
    $smtp->auth( 'LOGIN', $user, $passwd );
    foreach my $mailto (@mailto) {
        $smtp->mail($mailfrom);
        $smtp->to($mailto);
        $smtp->data();
        $smtp->datasend("To: $mailto\n");
        $smtp->datasend("From:$mailfrom\n");
        $smtp->datasend("Subject: $subject\n");
        $smtp->datasend("\n");
        $smtp->datasend("$text\n\n");
        $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

发表评论

0/200
182 点赞
0 评论
收藏