首页 > 代码库 > keepalived的高可用nginx和lvs实现负责均衡

keepalived的高可用nginx和lvs实现负责均衡

keepalived

VRRP协议
VRRP(virtual route Redundancy Protocol),虚拟路由冗余协议。因为每个设备的都只有一个默认网关指向,一旦这个默认指向的网关处理问题。我们就需要重新设定默认网关的指向。VRRP就是解决这个问题出现,VRRP协议是将一组路由划分起来。在这组路由器中只设置一个虚拟IP和虚拟MAC地址,然后根据设定的规则在这组路由器中转移。每个路由器都有各自网卡和IP地址,同时在主路由上有VIP(飘移IP)。在这组路由中,通过投票选举的方式选出主路由。在故障工作过程中会一直向备用路由器通过组播方式发送自己健康工作的信息,一旦主路由出现故障,健康信息不会在发送。这是备用路由就会将VIP启用起来,同时发送一条免费IP报文,并且采取自发自应的方式。宣告自己获取IP,这样在后端其他主机不知情的情况下,完成了IP漂移。
术语解释
VRIDvirtual router ID,虚拟路由标识。
MASTER虚拟路由器中承担报文转发的任务的路由器。
BACKUPMASTER路由器出现问题,能够代替MASTER主机承担报文转发任务的路由器。
虚拟IP地址一个虚拟路由器可以有一个或者多个虚拟IP地址。
虚拟MAC地址一个虚拟路由器只有一个MAC地址,虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。
优先级VRRP根据优先级来确定虚拟路由器中每台路由器的地位
非抢占方式如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障, Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器。一旦MASTER出现问题,BACKUP承担分发任务后,即使MASTER主机恢复,也不会再抢回分发的任务。
keepalived简介
keepalive是Linux下一个轻量级的高可用方案解决。众所周知的LVS解决负载均衡的问题,但是因为Director是单主机存在。因此容易出现SPOF(sing point of failure:单点故障),因此keepalived最初的设计就是为了解决lvs的SPOF诞生的。在随后的发展过程中,keepalived又添加了VRRP(virtual router redundancy protocol),解决静态路由出现的单点故障问题,可以保证网络不间断的稳定运行。
keepalived的组成,如图所示

技术分享

(1)WatchDog:检测Checker和VRRP进程。
(2)Checker:实现对服务器运行状态的检测和故障隔离。
(3)VRRP Stack:通过此模块再结合lvs负载均衡软件即可部署一个高性能的负载均衡的集群系统。
(4)IPVS wrapper:这是IPVS功能的一个实现。IPVS wrapper模块可以讲设置好的IPVS规则发送到内核空间,并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。
(5)Netlink Reflector:用来实现高可用集群中的Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间层Netlink模块完成。
keepalived的安装的及配置文件详解
1.yum 安装
从CentOS 6.4开始keepalived被红帽官方收入之yum原base仓库。之前在epel源中。yum install -y keepalived
2.源码编译:
#需现在http://www.keepalived.org上获取源码。
 tar xf keepalived-1.2.24.tar.gz 
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/3.10.0-327.36.2.el7.x86_64/#因为lvs是工作在内核当中,keepalived中的lvs功能就需要读取内核源码的头文件。若不需要使用lvs功能此选项,省略即可。make&&make install
3.配置文件
/etc/keepalived/keepalived.conf

配置文件分为全局配置段,VRRPD配置段,LVS配置段。

全局配置段如下:

global_defs         
    {
    notification_email   
           {
           admin@example1.com
           ...
           }
    notification_email_from admin@example.com
    smtp_server 127.0.0.1       
    smtp_connect_timeout 30      
    router_id my_hostname       
    vrrp_mcast_group4 224.0.0.18 
    vrrp_mcast_group6 ff02::12  
    enable_traps                
    }
    notification_email        #用于设置报警邮箱地址,可以设置多个每行一个。
    notification_email_from        #设置用于发送报警的邮箱地址。
    smtp_server 127.0.0.1
        #用于设置邮箱的IP地址
    smtp_connect_timeout 30
        #用于设置连接smtp server 的超时时间。
    router_id        #表示运行keepalived服务器的一个标识,是发送邮件时显示在邮件主机中的信息

VRRP设置段

vrrp_sync_group VG_1 {       group {
         inside_network   
         outside_network  
         ...
       }n
       notify_master /path/to_master.sh
       notify_backup /path/to_backup.sh
       notify_fault "/path/fault.sh VG_1"
       notify /path/notify.sh
       smtp_alert
    }group
    #同步组,此项功能不常用。notify_master    #指定Keepalived进入MASTER状态时执行的脚本。notify_backup    #指定Keepalived进入backup状态时执行的脚本。notify_falut    #指定Keepalived进入fault状态时执行的脚本。notify_stop    #指定Keepalived程序终止状态时执行的脚本。vrrp_instance <String> {    state MASTER|BACKUP 
    当前节点在此虚拟路由器中的初始状态;
    interface eth0
        VRRP实例工作的网络接口
    virtual_router_id
        虚拟路由器ID,范围0-255
    priority 100
        当前物理节点在此虚拟路由器中的优先级
    advert_int #
        用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。
    mcast_src_ip
        用于设置发送多播包的地址,若不设置,将使用interface设置的网卡的接口的IP地址。
    garp_master_delay
        用于设定在切换到MASTER状态后延时进行Gratuitous arp请求
    track_interface
        用于设定一些额外的网络监控接口,其中任何一个接口出现故障,keepalived都会进入fault状态。
    authentication{ 认证方式
        auth_type PASS 简单密码
        auth_pass 1111 (改为随机,字符串.不能超过8位,openssl rand -hex 4 )
    }
    virtual_ipaddress{(定义虚拟IP)        192.168.200.16 (虚拟路由IP,VIP,)
	格式: 	<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    }
    nopreempt
        非抢占模式
    preempt_delay
        抢占延迟,用于设置抢占延迟的时间,单位为秒。

Virtual server参数

virtual_server    #设置虚拟服务器开始的标识,后面接虚拟IP地址和服务端口,IP与端口用空格隔开。lb_algo rr|wrr|lc|wlc|lblc|sh|dh	#定义负责均衡调度方法delay_loop <INT>
	#定义服务轮询时间间隔lb_kind NAT|DR|TUN
persistence_timeout <INT>
	#持久连接时长,有了这个功能,用户的请求会一直分发到某个服务节点persistence_granularity    #此选项配合persistence_timeout一同使用,表示持久连接的粒度。默认为255.255.255.255,如果改为255.255.255.0,那么客服端IP所在的整个网段的请求都会分配到同一个Real Serverprotocol TCP	#服务协议ha_suspend    #节点从MASTER切换到BACKUP时,暂时不启用Real Server节点的健康检查。virtualhost
    在通过HTTP_GET/SSL_GET做健康检测时,指定的Web服务器的虚拟主机地址。
sorry_server <IPADDR> <PORT>
	#所有RS均故障时,提供say sorry的服务器;real_server <IPADDR> <PORT>{
	weight 
	    #权重
	inhibit_on_failure:表示再real server节点失效后,把它的weight值设置为0,而不是从IPVS中删除。
	notify_up <STRING>|<QUOTED-STRING>
		#当前节点上线调用的通知脚本
	notify_down <STRING>|<QUOTED-STRING>
		#当前节点离线时调用的通知脚本
	#HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
		#支持的所有健康状态检测方式
	HTTP_GET|SSL_GET
     {
         url {
           path <STRING>
           	#健康状态检测时请求的资源的URL
           digest <STRING>
           	 #基于获取内容摘要码进行健康状态判定
           status_code <INT>
           	  #基于状态码进行健康状态判定
         }
nb_get_retry <INT>
	#尝试的次数delay_before_retry <INT>
	#两次尝试之间的时间间隔connect_ip <IP ADDRESS>
	#向此处指定的地址发测试请求connect_port <PORT>
	#向此处指定的端口发送测试请求bindto <IP ADDRESS>
	#指定测试请求的源IP
 bind_port <PORT>
 	#指定测试请求的源PORT
 connect_timeout <INTEGER>
 	#连接的超时时长}

HTTP_GET和SSL_GET检测方式中参数解释

url    #用来指定HTTP/SSL检查的url信息,可以指定多个URL。path    #后面跟具体的URL路径digest    #SSL检查摘要信息,这些摘要信息可以通过genhash命令获取。
    #e.g.   genhash -s 192.168.32.130 -p 80 -u /index.htmlstatus_code    #指定HTTP检查返回正常状态码的类型。一般为200bindto    #表示通过此地址来发送请求对服务起进行检查。

实验:

HA Cluster的配置前提:
	(1) 各节点时间必须同步;
		ntp, chrony
	(2) 确保iptables及selinux不会成为阻碍;
	(3) 各节点之间可通过主机名互相通信(对KA并非必须);
		建议使用/etc/hosts文件实现; 
	(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)

1.单主模型

主机名主机IP模式VIP
node1centos 6.8192.168.32.21MASTEP192.168.32.100
node2centos 6.8192.168.32.23BACKUP192.168.32.100
[root@localhost ~]# iptables -F#做实验建议将其清楚,不影响操作.[root@localhost ~]# setenforce 0#关闭selinux[root@localhost ~]# ssh-keygen -t rsa -P ‘‘#生成公钥和私钥[root@localhost ~]# ssh-copy-id -i .shh/id_rsa.pub root@192.168.32.23#将公钥拷贝至BACKUP主机[root@localhost ~]# ntpdate 10.1.0.1;ssh  root@192.168.32.23 ntpdate  10.1.0.1#这是本地的时间服务器2 Nov 20:21:27 ntpdate[2532]: adjust time server 10.1.0.1 offset 0.231396 sec2 Nov 20:21:28 ntpdate[3633]: adjust time server 10.1.0.1 offset 0.215564 sec 
[root@localhost ~]# hostname ;ssh root@192.168.32.23 hostnamenode1
node2#获取MASTER和BACKUP的主机名,然后修改各种的/etc/hosts文件,将名称和各自主机IP对应,便于通过主机名通信。[root@localhost ~]# vim /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.32.21 node1 node1.localdomain#添加192这行将主机名与IP对应起来[root@localhost ~]# yum install -y keepalived;ssh root@192.168.32.23 yum install -y keepalived# 安装keepalived的程序包,一下修改配置文件操作,只需要在MASTER主机上操作,然后copy至BACKUP主机上,略作修改即可[root@localhost ~]# cd /etc/keepalived/[root@localhost ~]#  cp keepalived.conf{,.bak}[root@localhost ~]# vim keepalived.conf#打开配置文件很长,但是我们这里只需要配置主备模型,virtual server配置段及其以后的配置段均无用.注释或者删除掉即可.这里也不再贴出这些配置段的参数.[root@localhost keepalived]# vim keepalived.conf#前文中出现的参数这里不再解释#这里MASTER中的配置文件
   notification_email {
        root@localhost
   }
   notification_email_from admin.keepalived@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.24.18
        #发送组播地址,默认配置文件没有,需要自行添加}

vrrp_instance node1 {    state MASTER
    interface eth3
    virtual_router_id 51
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 04d5479b            #小于等于8位的密钥,可以用#openssl rand -hex 8
    }
    virtual_ipaddress {        192.168.32.100
    }
}
[root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的state为BACKUP# 2.修改priority的值,不能让两个优先级别一致# 3.修改当前使用的interface
实验结果图,先启用的BACKUP主机,然后启动的MASTER主机,vip地址会从BACKUP的主机飘逸到MASTER主机上。其他故障检测操作这里就不上图片。

2.主主模型

1.主备模式存在一个缺点就浪费一台主机作为备用主机。因此我们可以用主主模型.
2.主主模型就是用两台主机,一台主机作为另外一台主机备用主机。这样两台主机都是各自的调度地址的MASTER就不会存在资源浪费的情况,同时也实现了高可用.
主机名系统IPVIP1模式VIP2模式
node1CentOS 6.8192.168.32.23192.168.32.100MASTER192.168.32.200BACKUP
node2CentOS 6.8192.168.32.23192.168.32.100BACKUP192.168.32.200MASTER
#前期环境操作及环境设置与主备模型一直,因此这里只讲主主模型的配置文件附上。

[root@localhost keepalived]# vim keepalived.conf

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from admin.keepalived@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.24.18}

vrrp_instance node1 {
    state MASTER
    interface eth3
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 04d5479b
    }
    virtual_ipaddress {        192.168.32.100/24 dev eth3 label eth3:0
    }
}

vrrp_instance node11 {
    state BACKUP
    interface eth3
    virtual_router_id 53
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 0as5479b
    }
    virtual_ipaddress {        192.168.32.200/24 dev eth3 label eth3:1
    }

}

[root@localhost keepalived]# scp 192.168.32.23:/etc/keepalived/keepalived.conf# 1.修改其中的各自备用的state为BACKUP# 2.修改priority的值,不能让两个优先级别一致# 3.修改当前使用的interface# 4.两台主机的虚拟路由地址不能一样.即virtual_router_id 不能相同。
实验结果图,先启用的BACKUP主机,然后启动的MASTER主机,vip地址会从BACKUP的主机飘逸到MASTER主机上。其他故障检测操作这里就不上图片

技术分享技术分享

3.keepalived启动,停止等脚本测试。

邮件脚本实例,用主备模型进行示例。#!/bin/bash#contact=‘root@localhost‘notify(){
        mailsubject="$(hostname) to be $1,vip is removed"
        mailbody="$(date +‘%F %T‘):vrrp transition,$(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact}case $1 inmaster)
        notify master
;;
backup)
        notify backup
;;
fault)
        notify fault
;;
*)        echo "Usage : $(basename $0) {master|backup|fault}"
        exit 2
        ;;esac接下来开始调用此脚本,只需要在全局端调用脚本即可,其他配置不需要修改。切记时间同步,不然你收不到邮件。

]# vim /etc/keepalived/keepalived.confglobal_defs {
   notification_email {
        root@localhost
   }
   notification_email_from admin.keepalived@localhost.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.24.18
    notify_master "/etc/keepalived/testmail.sh master"
    notify_backup "/etc/keepalived/testmail.sh backup"
    notify_fault "/etc/keepalived/testmail.sh fault"}

4.搭建高可用的lvs。

#下面贴出的是主路由的配置,backup的配置这里也不在描述怎么修改。和前面一样。]# yum install -y ipvsadm]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from sen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
        vrrp_mcast_group4 224.0.100.19}

vrrp_instance VI_1 {
    state MASTER
    interface eth3
    virtual_router_id 51
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass d33d5328
    }
    notify_master "/etc/keepalived/testmail.sh master"
    notify_backup "/etc/keepalived/testmail.sh backup"
    notify_falut"/etc/keepalived/testmail.sh falut"
    virtual_ipaddress {        192.168.32.13/24 dev eth3 label eth3:1
    }
}

virtual_server 192.168.32.13 80 {
    delay_loop 3
    lb_algo rr
    lb_kind  DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.32.129 80 {
        weight 1
        HTTP_GET {
              path /
             status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    real_server 192.168.32.128 80 {
        weight 1
        HTTP_GET {
            url {
              path /
             status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
[root@node2 keepalived]# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.32.13:80 rr persistent 50
  -> 192.168.32.128:80            Route   1      0          20        
  -> 192.168.32.129:80            Route   1      0          0

5.keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

#此实验通过高可用nginx负责均衡实现,因此需要先安装或者编译nginx。编译nginx时需要启用stream模块,因为此实验是通过调用stream模块实现的。#实现此功能分为两步:(1) 先定义一个脚本;(2) 调用此脚本;#添加如下行启用nginx反向代理# vim /etc/nginx/nginx.confstream {
    upstream srvs {
        server 192.168.32.128:80;
        server 192.168.32.129:80;
        hash $remote_addr consistent;
    }
    server {
        listen 192.168.32.13:80;
        proxy_pass srvs;
    }
}
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from sen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
        vrrp_mcast_group4 224.0.100.19}

vrrp_scripts chk_down {
        scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        interval 1
        weight -5}
vrrp_script chk_nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -5}
vrrp_instance VI_1 {
    state MASTER
    interface eth3
    virtual_router_id 51
    priority 98
    advert_int 1
    vrrp_script chk_down
    vrrp_script chk_nginx
    authentication {
        auth_type PASS
        auth_pass d33d5328
    }
    notify_master "/etc/keepalived/testmail.sh master"
    notify_backup "/etc/keepalived/testmail.sh backup"
    notify_falut"/etc/keepalived/testmail.sh falut"
    virtual_ipaddress {        192.168.32.13/24 dev eth3 label eth3:1
    }
}


本文出自 “11539909” 博客,请务必保留此出处http://11549909.blog.51cto.com/11539909/1869652

keepalived的高可用nginx和lvs实现负责均衡