如何构建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




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
979 9
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
1003 3
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
549 1
|
负载均衡 算法 前端开发
HAProxy 和负载均衡概念简介
HAProxy 和负载均衡概念简介
326 3
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
负载均衡 NoSQL 应用服务中间件
搭建高可用及负载均衡的Redis
【7月更文挑战第10天】
943 1
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
655 0
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
410 21
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
428 2
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了"http://"。修正方法是删除上游服务器列表和proxy_pass中的"http://"。问题解决后,Nginx服务应能正常启动。
1262 4
解决nginx配置负载均衡时invalid host in upstream报错

相关实验场景

更多