如何构建Keepalived+HAProxy实现高可用,负载均衡,动静分离。

简介:

一、HAProxy简介


HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

                                                                                                                                                                        ————百度百科

 

HAProxy负载均衡的调度算法:

roundrobin:动态调度算法,根据权重进行轮叫类似(wrr),并且权重可以在运行时进行调整,支持慢速启动。

static-rr:静态调度算法,轮叫方式,没有动态算法的特殊功能。

leastconn:最少连接调度算法类似(wlc),适用于给长连接应用做调度如MySQL,SSH。不适用于web场景。

source:同一个IP定向到同一个后端服务器,类似(sh)。可以通过hash-type 来定义类型,map-based(静态)consistent(动态)。

uri:对于同一个uri的请求到同一个后端服务器。(适用于调度缓存服务器)

url:根据url中的参数进行调度,可以根据来自同一个用户信息的请求,发往同一台后端服务器。

hdr:根据用户请求的首部进行调度。


接下来我们部署下面的环境:

wKioL1PkReHhdtaLAALB6MqzbNg718.jpg


nginx+php和MySQL这些后端服务器配置前面文章都有讲到这里省略


安装haproxy

yum install haproxy -y

编辑配置文件:vim  /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------

# Example configuration for a possible web application.  See the

# full configuration options online.

#

#   http://cbonte.github.io/haproxy-dconv

#

#---------------------------------------------------------------------


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats


#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http  //设定默认运行模式

    log                     global

    option                  httplog  //启用http请求日志。

    option                  dontlognull //不记录空信息

    option http-server-close  //开启服务器端关闭,支持客户端一侧的长连接。

    option forwardfor       except 127.0.0.0/8 //在转发请求的时候,给请求报文添加一个首部信息,忽略本机。

    option                  redispatch   //请求重新分发

    retries                 3  //向后端服务器发出请求失败后,重试的次数。

    timeout http-request    10s  //请求的超时时间

    timeout queue           1m  //在请求等待队列中的超时时间

    timeout connect         10s  //paproxy连接后端服务器的超时时间

    timeout client          1m   //客户端非活动长连接的超时时间

    timeout server          1m   //服务器端非活动长连接的超时时间

    timeout http-keep-alive 10s

    timeout check           10s   //健康状态检测超时时间

    maxconn                 5000  //设定每个进程所响应的最大连接数


#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

listen stats

  mode http

  bind *:9999  //设置侦听的端口

  stats enable  //启用stats

  stats hide-version  //隐藏程序的版本号

  stats uri  /administrator/login  // 指定url

  stats realm  HAProxy\ stats messages  //认证的提示标题信息

  stats auth  admin:admin  //定义登录stats帐号和密码。

  stats admin if TRUE  //启用管理功能,必须通过认证才允许登录管理

frontend  main

        bind *:80

    acl url_static       path_beg       -i /static /images /javascript /stylesheets

    acl url_static       path_end       -i .jpg .gif .png .css .js .bmp .ico .txt .html

    use_backend static          if url_static

    default_backend             dynamic    //定义默认代理的后端服务器群


#---------------------------------------------------------------------

# static backend for serving up images, stylesheets and such

#---------------------------------------------------------------------

backend static  定义静态请求响应服务器群

    balance     roundrobin  //定义负载均衡算法

    server      static1 172.16.1.110:80 check maxconn 6000


#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

backend dynamic  定义动态请求响应服务器群

    balance     roundrobin

    server   sport1 172.16.1.100:80 check inter 2 rise 1 fall 3 maxconn 2000

    server   sport2 172.16.1.101:80 check inter 2 rise 1 fall 3 maxconn 2000


配置haproxy日志

编辑/etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-c 2 -r "

定义日志设备

vim /etc/rsyslog.conf

local2.*                 /var/log/haproxy.log


然后安装keepalived,编辑配置文件 vim /etc/keepalived/keepalived.conf


! Configuration File for keepalived


global_defs {

   notification_email {

  root@localhost

   }

   notification_email_from keepalived@localhost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_script chk_haproxy {

        script /etc/keepalived/server.sh  //自定义脚本,用于维护haproxy进程。

        interval 1

        weight 3

}


vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass a0f12bf066bb9605

    }

    virtual_ipaddress {

        192.168.18.254/24 dev eth0 label eth0:0

    }

        track_script {

        chk_haproxy

}

        notify_master "/etc/keepalived/notify.sh master"   //自定义脚本,用于监控状态发生转变。

        notify_backup "/etc/keepalived/notify.sh backup"

        notify_fault "/etc/keepalived/notify.sh fault"

}


server.sh,这个脚本功能是检测,haproxy进程是否存在,如果不存在则重启haproxy服务。

如果当前主机启动不了haproxy服务时,则返回一个错误状态码,降低优先级,使得节点资源迁移。

#!/bin/bash

#

pidof haproxy &>/dev/null

RETVL=$?

if [ "$RETVL" -eq 0 ];then

        exit 0;

else

        /etc/init.d/haproxy restart

pidof haproxy &>/dev/null

RETVL=$?

[ "$RETVL" -eq 0] && exit 0 || exit 5

fi


notify.sh,这个脚本功能是在主备状态发生转换时发送邮件通知管理员,并且启动haproxy服务。

#!/bin/bash

#description: An example of notify script

vip=192.168.18.254

contact='root@localhost'


notify() {

    mailsubject="`hostname` to be $1: $vip floating"

    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"

    echo $mailbody | mail -s "$mailsubject" $contact

}


case "$1" in

    master)

        notify master

        /etc/rc.d/init.d/haproxy start

        exit 0

    ;;

    backup)

        notify backup

        /etc/rc.d/init.d/haproxy stop

        exit 0

    ;;

    fault)

        notify fault

        /etc/rc.d/init.d/haproxy stop

        exit 0

    ;;

    *)

        echo 'Usage: `basename $0` {master|backup|fault}'

        exit 1

    ;;

esac


haproxy配置两个节点一样。

keepalived备节点和主节点差不多,只需要改动初始状态为BACKUP降低优先级即可,将脚本文件也要一并同步过去。

配置完成以后,启动两边的keepalived即可。


笔者启用了6台虚拟机完成了,测试也基本成功,就不上图了。


欢迎大家与我交流QQ:1183710107



本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1536658




相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
负载均衡 安全 前端开发
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
48 1
|
5月前
|
负载均衡 前端开发 应用服务中间件
【Linux】Nignx的入门&使用负载均衡&动静分离(前后端项目部署)---超详细
【Linux】Nignx的入门&使用负载均衡&动静分离(前后端项目部署)---超详细
262 1
|
4月前
|
负载均衡 前端开发 应用服务中间件
【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包
【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包
361 0
|
17天前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
5月前
|
负载均衡 前端开发 应用服务中间件
Linux之Nignx及负载均衡&动静分离
Linux之Nignx及负载均衡&动静分离
145 0
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
134 0
|
3月前
|
负载均衡 算法 前端开发
Ngnix之反向代理、负载均衡、动静分离
Nginx是一个高性能的开源Web服务器,它还可以用作反向代理、负载均衡器以及动静分离的工具。
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
4月前
|
负载均衡 前端开发 应用服务中间件
百度搜索:蓝易云【Nginx使用之反向代理、负载均衡、动静分离教程。】
通过这样的配置,Nginx将根据请求的URL路径选择是将请求转发到后端服务器还是直接返回静态资源文件。
136 0
|
4月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关