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

keepalived

VRRP协议
VRRP(virtual route Redundancy Protocol),虚拟路由冗余协议。因为每个设备的都只有一个默认网关指向,一旦这个默认指向的网关处理问题。我们就需要重新设定默认网关的指向。VRRP就是解决这个问题出现,VRRP协议是将一组路由划分起来。在这组路由器中只设置一个虚拟IP和虚拟MAC地址,然后根据设定的规则在这组路由器中转移。每个路由器都有各自网卡和IP地址,同时在主路由上有VIP(飘移IP)。在这组路由中,通过投票选举的方式选出主路由。在故障工作过程中会一直向备用路由器通过组播方式发送自己健康工作的信息,一旦主路由出现故障,健康信息不会在发送。这是备用路由就会将VIP启用起来,同时发送一条免费IP报文,并且采取自发自应的方式。宣告自己获取IP,这样在后端其他主机不知情的情况下,完成了IP漂移。
术语 解释
VRID virtual router ID,虚拟路由标识。
MASTER 虚拟路由器中承担报文转发的任务的路由器。
BACKUP MASTER路由器出现问题,能够代替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   
           {
           [email protected]
           ...
           }
    notification_email_from [email protected]
    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
node1 centos 6.8 192.168.32.21 MASTEP 192.168.32.100
node2 centos 6.8 192.168.32.23 BACKUP 192.168.32.100
[[email protected] ~]# iptables -F#做实验建议将其清楚,不影响操作.[[email protected] ~]# setenforce 0#关闭selinux[[email protected] ~]# ssh-keygen -t rsa -P ‘‘#生成公钥和私钥[[email protected] ~]# ssh-copy-id -i .shh/id_rsa.pub [email protected]#将公钥拷贝至BACKUP主机[[email protected] ~]# ntpdate 10.1.0.1;ssh  [email protected] 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 
[[email protected] ~]# hostname ;ssh [email protected] hostnamenode1
node2#获取MASTER和BACKUP的主机名,然后修改各种的/etc/hosts文件,将名称和各自主机IP对应,便于通过主机名通信。[[email protected] ~]# 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对应起来[[email protected] ~]# yum install -y keepalived;ssh [email protected] yum install -y keepalived# 安装keepalived的程序包,一下修改配置文件操作,只需要在MASTER主机上操作,然后copy至BACKUP主机上,略作修改即可[[email protected] ~]# cd /etc/keepalived/[[email protected] ~]#  cp keepalived.conf{,.bak}[[email protected] ~]# vim keepalived.conf#打开配置文件很长,但是我们这里只需要配置主备模型,virtual server配置段及其以后的配置段均无用.注释或者删除掉即可.这里也不再贴出这些配置段的参数.[[email protected] keepalived]# vim keepalived.conf#前文中出现的参数这里不再解释#这里MASTER中的配置文件
   notification_email {
        [email protected]
   }
   notification_email_from [email protected]
   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
    }
}
[[email protected] 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就不会存在资源浪费的情况,同时也实现了高可用.
主机名 系统 IP VIP1 模式 VIP2 模式
node1 CentOS 6.8 192.168.32.23 192.168.32.100 MASTER 192.168.32.200 BACKUP
node2 CentOS 6.8 192.168.32.23 192.168.32.100 BACKUP 192.168.32.200 MASTER
#前期环境操作及环境设置与主备模型一直,因此这里只讲主主模型的配置文件附上。

[[email protected] keepalived]# vim keepalived.conf

global_defs {
   notification_email {
        [email protected]
   }
   notification_email_from [email protected]
   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
    }

}

[[email protected] 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=‘[email protected]‘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 {
        [email protected]
   }
   notification_email_from [email protected]
   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 {
        [email protected]
   }
   notification_email_from [email protected]
   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
        }
    }
}
[[email protected] 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 {
        [email protected]
   }
   notification_email_from [email protected]
   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
    }
}
时间: 2024-08-18 18:56:08

keepalived的高可用nginx和lvs实现负责均衡的相关文章

Keepalived实现高可用Nginx反向代理和基于NAT的LVS及分析

1. 前言 keepalived是一个C语言开发的,能够基于Linux基础架构提供一个HA实现的软件.HA是基于VRRP协议实现,可以为LVS.Nginx.HAProxy等实现的LB提供高可用. 下图是keepalived的软件架构图 主要核心模块: Checkers:负责对Real Server进行健康检查. VRRP栈:实现了VRRP协议,实现了vrrp_sync_group扩展,不依赖于LVS可以独立的使用.例如下面第一个实验keepalived+nginx反代. IPVS Wrapper

keepalived实现高可用nginx反向代理的简单案例

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 案例拓扑图 安装keepalived和nginx 安装keepalived # yum -y install keepalived 创建nginx用户组及nginx用户 # groupadd -r nginx # useradd -g nginx -r nginx 编译安装nginx-1.4.7 # tar xf nginx-1.4.7.tar.gz  # cd nginx-1.4.7 # ./

Keepalived实现高可用Nginx反向代理

由于好久没有接触过负载相关的调试了复习一下 实验系统: (1)CentOS 6.5_x86_64: (2)共有二台主机,本实验以ip地址来命名主机,即10主机.11主机. 实验前提:防火墙和selinux都关闭,主机之间时间同步 实验软件:nginx-1.10.2-1.el6.x86_64.keepalived-1.2.13-5.el6_6.x86_64.httpd-2.2.15-59.el6.centos.x86_64为了方便实验只起了2台虚机方便测试,每台虚机上都安装nginx.keepal

利用keepalived实现高可用nginx

实验拓扑图(1)本次基于VMware Workstation搭建一个四台Linux(CentOS 7.4)系统所构成的一个服务器集群,其中两台nginx做前端调度服务器(一台为主机,另一台为备机),另外两台作为真实的Web服务器(向外部提供http服务,这里仅仅使用了CentOS默认自带的http服务,没有安装其他的类似Tomcat.Jexus服务). (2)本次实验设置了一个VIP(Virtual IP)为172.18.38.99,用户只需要访问这个IP地址即可获得网页服务.其中,nginx主

配置Keepalived双实例高可用Nginx

我们知道Keepalived原生设计目的是为了高可用LVS集群的,但Keepalived除了可以高可用LVS服务之外,还可以基于vrrp_script和track_script高可用其它服务,如Nginx等.本篇主要演示如何使用Keepalived高可用Nginx服务(双实例),关于vrrp_script.track_script的更多介绍可以见上一篇博客<Keepalived学习总结>. 实验要求 ==> 实现Keepalived基于vrrp_script.track_script高可

LVS+Keepalived实现高可用负载均衡

用LVS+Keepalived实现高可用负载均衡,简单来说就是由LVS提供负载均衡,keepalived通过对rs进行健康检查.对主备机(director)进行故障自动切换,实现高可用. 1. LVS NAT模式配置准备三台服务器,一台director, 两台real serverdr1: 外网ip 192.168.75.130,内网ip 10.1.1.10 两台real serverrs1: 内网ip 10.1.1.11rs2: 内网ip 10.1.1.12 两台real server的内网网

架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层

1.概述 前两遍文章中,我们一直在说后文要介绍Nginx + Keepalived的搭建方式.这篇文章开始,我们就来兑现前文的承诺,后续的两篇文章我们将介绍Nginx + Keepalived和 LVS + Keepalived搭建高可用的负载层系统.如果你还不了解Nginx和LVS的相关知识,请参见我之前的两篇文章<架构设计:负载均衡层设计方案(2)--Nginx安装>(http://blog.csdn.net/yinwenjie/article/details/46620711).<

lvs+keepalived 实现高可用

一系统环境 centos6.5 lvs+keepalived(master) lvs+keepalived(slave) nginx(real-server) nginx(real-server) 二.lvs介绍 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.虚拟服务器最主要的功能是提供包转发和负载均衡,这个功能可以通过ipvsadm 具体实现.ip负载均衡技术包括:VS/NAT.VS/DR.VS/TUN.本文介绍DR方式. 三.k

实践:在CentOS7.3部署 keepalived 高可用nginx(负载均衡)

背景: 既然有了Lvs+keepalived这样高性能的组合,那为何还要有Nginx+keepalived呢,keepalived的初衷就是为了Lvs而设计的,我们都知道Lvs是一个四层的负载均衡设备,虽然有着高性能的优势,但同时它却没有后端服务器的健康检查机制,keepalived为lvs设计了一系列的健康检查机制TCP_CHECK,UDP_CHECK,HTTP_GET等.同时lvs也可以自己写健康检查脚脚本.或者结合ldirectory来实现后端检测.但是固LVS始终无法摆脱它是一个四层设备