基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群

  • 架构设计
  • Nginx
    • 安装
      • gcc 安装
      • PCRE pcre-devel 安装
      • zlib 安装
      • OpenSSL 安装
      • 下载源码包
      • 安装
      • 启动停止
      • 开机启动
        • 方法一 启动加载文件
        • 方法二 添加为系统服务
  • Haproxy
    • 安装
    • 启动
    • 客户端访问测试
    • Haproxy支持的负载均衡算法
  • Keepalived
    • 安装
    • keepalived配置
      • 主节点
      • 备份节点
    • 配置haproxy检测脚本
    • 启动keepalived
  • 测试
    • 测试VIP地址
      • 192.168.1.28
      • 192.168.1.29
    • 测试网络
    • 高可用测试

架构设计

主机名 IP地址
VIP 192.168.1.110
Haproxy1 192.168.1.28
Haproxy2 192.168.1.29
Nginx1 192.168.1.30
Nginx2 192.168.1.31

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第1张图片
基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第2张图片

Nginx

安装

gcc 安装

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel

下载源码包

 wget -c https://nginx.org/download/nginx-1.12.0.tar.gz --no-check-certificate

安装

tar -zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
make && make install

启动停止

cd /usr/local/nginx/sbin/
./nginx 
./nginx -s stop
./nginx -s quit
./nginx -s reload

./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。

./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

开机启动

方法一 启动加载文件

用vi打开/etc/rc.local文件,增加如下配置:

/usr/local/nginx/sbin/nginx

设置执行权限:

chmod 755 rc.local

方法二 添加为系统服务

在/etc/init.d下创建文件nginx

vim /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -n "$user" ]; then
      if [ -z "`grep $user /etc/passwd`" ]; then
         useradd -M -s /bin/nologin $user
      fi
      options=`$nginx -V 2>&1 | grep 'configure arguments:'`
      for opt in $options; do
          if [ `echo $opt | grep '.*-temp-path'` ]; then
              value=`echo $opt | cut -d "=" -f 2`
              if [ ! -d "$value" ]; then
                  # echo "creating" $value
                  mkdir -p $value && chown -R $user $value
              fi
          fi
       done
    fi
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $prog -HUP
    retval=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

添加执行权限

 chmod a+x /etc/init.d/nginx

至此就可以通过下面指令控制启动停止:

/etc/init.d/nginx start
/etc/init.d/nginx stop

上面的方法完成了用脚本管理nginx服务的功能,但是还是不太方便。

将nginx服务加入chkconfig管理列表:

chkconfig --add /etc/init.d/nginx

加完这个之后,就可以使用service对nginx进行启动,重启等操作:

service nginx start
service nginx stop
service nginx restart

设置开机自动启动:

chkconfig nginx on

centOS7永久关闭防火墙:

 systemctl stop firewalld
 systemctl disable firewalld 

Haproxy

HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。

HAProxy适用于那些负载较大的web站点,这些站点通常又需要会话保持或七层处理。

HAProxy可以支持数以万计的并发连接,并且HAProxy的运行模式使得它可以很简单安全的整合进架构中,同时可以保护web服务器不被暴露到网络上。

安装

# 下载haproxy
wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz
#解压
tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
#进入目录、进行编译、安装
cd /usr/local/haproxy-1.6.5
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
#用来存放配置文件
mkdir /etc/haproxy
#创建haproxy配置文件
touch /etc/haproxy/haproxy.cfg

haproxy的配置文件通常分为三部分: global(全局配置部分) defaults(默认配置部分) listen(应用组件部分)

#logging options
global
    log 127.0.0.1 local0 info
    maxconn 5120
    # ha的安装地址
    chroot /usr/local/haproxy
    uid 99
    gid 99
    daemon
    quiet
    nbproc 20
    pidfile /var/run/haproxy.pid
defaults
    log global
    #使用4层代理模式,”mode http”为7层代理模式
    mode tcp
    #if you set mode to tcp,then you nust change tcplog into httplog
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    contimeout 5s
     ##客户端空闲超时时间为 30秒 则HA 发起重连机制
     clitimeout 30s
     ##服务器端链接超时时间为 15秒 则HA 发起重连机制
     srvtimeout 15s
#front-end IP for consumers and producters
listen nginx_cluster
    bind 0.0.0.0:80
    #配置TCP模式
    mode tcp
    #balance url_param userid
    #balance url_param session_id check_post 64
    #balance hdr(User-Agent)
    #balance hdr(host)
    #balance hdr(Host) use_domain_only
    #balance rdp-cookie
    #balance leastconn
    #balance source //ip
    #简单的轮询
    balance roundrobin
    #集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
        server server1 192.168.1.30:80 check inter 5000 rise 2 fall 2
        server server2 192.168.1.31:80 check inter 5000 rise 2 fall 2

启动

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
#查看haproxy进程状态
ps -ef | grep haproxy

客户端访问测试

用浏览器打开 http://192.168.1.28

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第3张图片

用浏览器打开 http://192.168.1.29

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第4张图片

Haproxy支持的负载均衡算法

1.roundrobin
动态加权轮询算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机;在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
2.leastconn
最小连接数算法,连接数最少的服务器优先接收连接。建议用于长会话场景中使用,例如LDAP、SQL等协议,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。

3.static-rr
静态轮询算法,不支持权重的运行时调整和慢启动机制。每个服务器根据权重轮流使用,类似roundrobin。另外,它对服务器的数量没有限制。
4、source
源地址哈希算法,对请求源IP地址进行哈希;

取模法:将源地址hash计算后除以服务器总权重,服务器变动会影响全局调度效果;根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;

一致性hash:服务器变动仅影响局部调度;动态调度;

5、uri
表示根据请求的URI左端(问号之前)或整个URI做hash进行哈希计算,并与服务器的总权重相除后根据结果派发至某挑选出的后端主机。只要服务器正常,以最大限度的提高缓存的命中率。

作用是能够将对同一个uri的请求始终发往一个后端主机;适用于后端为缓存服务器和反病毒代理的场景; 该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。该算法只能用于HTTP后端。

6、url_param
在HTTP GET请求的查询串中查找中指定的URL参数的值做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求;

此算法常用来追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个后端主机;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

7、hdr(name)
对于每个http请求,此处由指定的http首部会被取出;如果此首部没有有效值,则用roundrobin代替;否则,对其值进行hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

8、rdp-cookie(name)
为每个进来的TCP请求查询并哈希RDPcookie;

该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。如果没有cookie,则使用roundrobin算法代替;

该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。

Keepalived

Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx、Haproxy等反向代理的负载均衡服务器配合实现web服务端的高可用。Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA).VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。

安装

#安装所需软件包
yum install -y openssl openssl-devel
#下载安装包
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
#解压、编译、安装
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
cd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
make && make install
# 将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作
#首先创建文件夹,将keepalived配置文件进行复制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#然后复制keepalived脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 设置的过程中如果出现已经存在则删除原有的文件,重新创建
ln -s -f /usr/local/sbin/keepalived /usr/sbin/
ln -s -f /usr/local/keepalived/sbin/keepalived /sbin/
#可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
chkconfig keepalived on

keepalived配置

主节点

! Configuration File for keepalived
global_defs {
   router_id haproxy1  ##标识节点的字符串,通常为本机hostname
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"  ##执行脚本位置
    interval 2  ##检测时间间隔
    weight -20  ##如果条件成立则权重减20
}
vrrp_instance VI_1 {
    state MASTER  ## 主节点为MASTER,备份节点为BACKUP-该配置非常重要
    interface ens33 ## 绑定虚拟IP的网络接口(网卡可以使用ifconfig查看)
    virtual_router_id 110  ## 虚拟路由ID号(主备节点一定要相同)-该配置非常重要
    mcast_src_ip 192.168.1.28 ## 本机ip地址
    priority 100  ##优先级配置(0-254的值),一般主节点的权重大于备份节点
    nopreempt
    advert_int 1  ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {  ## 认证匹配
        auth_type PASS
        auth_pass itcast
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.1.110  ## 虚拟ip
    }
}

备份节点

! Configuration File for keepalived
global_defs {
   router_id haproxy2  ##标识节点的字符串,通常为本机hostname
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"  ##执行脚本位置
    interval 2  ##检测时间间隔
    weight -20  ##如果条件成立则权重减20
}
vrrp_instance VI_1 {
    state BACKUP  ## 主节点为MASTER,备份节点为BACKUP-该配置非常重要
    interface ens33 ## 绑定虚拟IP的网络接口(网卡可以使用ifconfig查看)
    virtual_router_id 110  ## 虚拟路由ID号(主备节点一定要相同)-该配置非常重要
    mcast_src_ip 192.168.1.29 ## 本机ip地址
    priority 90  ##优先级配置(0-254的值),一般主节点的权重大于备份节点
    nopreempt
    advert_int 1  ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {  ## 认证匹配
        auth_type PASS
        auth_pass itcast
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.1.110  ## 虚拟ip
    }
}

配置haproxy检测脚本

#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then
    /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    sleep 2
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

执行脚本赋权:

chmod +x /etc/keepalived/haproxy_check.sh

启动keepalived

#启动两台机器的keepalived
service keepalived start | stop | status | restart
#查看状态
ps -ef | grep haproxy
ps -ef | grep keepalived

测试

测试VIP地址

192.168.1.28

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第5张图片

192.168.1.29

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第6张图片

测试网络

浏览器访问:http://192.168.1.110,轮流出现Server1,Server2。
基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第7张图片
基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第8张图片

高可用测试

停止192.168.1.28上的keepalived,访问仍然正常。

systemctl stop keepalived

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第9张图片

基于Haproxy+Keepalived+Nginx构建高可用负载均衡集群_第10张图片

你可能感兴趣的:(高可用,nginx,负载均衡,linux)