Haproxy-10万并发级别负载均衡器

Haproxy

第1章 前言

首先,我们知道nginx负载均衡集群,LVS负载均衡集群,和haproxy负载集群,这三种集群比较来说,LVS性能最好,但是搭建相对复杂,nginx的upstream模块支持集群负载,但是对web节点的健康检查功能不多,性能也没有haproxy好,这也是haproxy为什么受欢迎的原因之一!

第2章 Haproxy简介

1.      haproxy是一个使用C语言编写的开源软件,支持高可用,负载均衡,以及基于tcp和http的应用程序代理

2.      Haproxy特别适用于负载特别大的web站点,这些站点通常又需要会话保持或者7层处理,haproxy完全可以支持数以万计的并发连接,并且他的运行模式使得它可以简答安全的整合到您当前的架构中,保证您的web节点不暴露在网络上

3.      Haproxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发链接数,多进程或多线程模型受内存限制,系统调度器限制以及无处不在的锁限制,很少能处理数千并发链接

4.      事件驱动模型因为在有更好的资源和时间管理的用户空间,实现所有这些任务,所有没有这些问题,此模型的缺点是,在多核系统上,这些程序通常扩展性较差,这就是为什么他们必须进行优化,是每个CPU时间片做更多的工作

第3章 haproxy负载均衡的调度算法:

3.1 目前haproxy支持的调度算法常见有如下几种

先介绍表动态hash的特点:

服务器运行时就可进行权重调整,即只需要重新载入配置文件即可,不需要重新启动haproxy,并且支持慢速启动,即重新恢复的后端节点不会一次性接受大量请求,而是慢慢增加的

3.1.1 roundrobin:基于权重的轮询调度

动态加权轮询算法,支持权重的运行时调整及慢启动机制,最大支持4095个后端节点,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法

3.1.2 static-rr:不支持动态hash,没有后端数量限制,基本不用

静态轮询算法,不支持权重的运行时调整和慢启动机制,每个服务器根据权重轮流使用,此种算法对后端节点数量没有限制

3.1.3 lc:类似于LVS中wlc算法

但是这里是只考虑活动链接数,即选择活动连接数最少的,最好在长连接会话中使用

3.1.4 source:基于hash表的算法,类似于nginx中的ip_hash

源地址hash算法,对请求源ip地址进行hash,该算法一般用与不能插入cookie的tcp模式,它还可以用户广域网上为拒绝使用会话cookie的客户端提供最有效的粘连

3.1.5 uri:基于uri生成hash表的算法,主要用于后端节点是缓存服务器的场景

此种方法基于uri进行选择,如客户端访问了http://test.com/a.jpg,那么在这个uri缓存失效之前,任何一个客户访问这个路径,一定访问的就是a.jpg

3.1.6 url_params:

根据url的参数来调度,用于将同一个用户的信息,都发送到同一个后端节点

3.1.7 hdr:header基于头部的信息来构建hash表

基于用户请求的主机名进行调度

第4章 Haproxy负载均衡的简单实现

4.1 环境准备:

4.1.1 负载均衡前端:

10.0.0.41   172.16.1.41   backup

4.1.2 后端web服务器端:

10.0.0.17   172.16.1.17   web03
10.0.0.18   172.16.1.18   web04

4.2 yum安装:

yum –y install haproxy

4.3 配置文件说明:

#---------------------------------------------------------------------
# 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      当前进程pid文件
    maxconn     4000                      最大连接数
    user        haproxy                   所属用户
    group       haproxy                   所属用户组
    daemon                                以守护进程的方式运行haproxy
 
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
 
defaults
    mode                    http          默认的模式tcp:4层;http:7层;health:只会返回OK
    log                     global        应用全局的日志配置
    option                  httplog       启用日志记录http请求,默认haproxy的日志是不记录http请求日志的
option                  dontlognull   启动该项,日志中将不会记录空链接,所谓空链接就是在上游的
负载均衡器或者监控系统为了探测该服务器是否可用时
需要定期的连接或者获取某一固定的组件或者页面,
或者探测扫描端口是否在监听或开放等动作被称为空链接;
    option http-server-close              每次请求完毕后主动关闭http通道
    option forwardfor       except 127.0.0.0/8      如果服务器上的应用程序向记录发起请求的客户端的ip地址,需要在haproxy上配置此项,
    option                  redispatch    当时用了cookie时,haproxy会将其请求的后端服务器的server ID插入到cookie中,以保证会话的session持久性,而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置次参数,会将客户的请求强制定向到另外一个后端server上,以保证服务正常
retries                 3         定义连接后端服务器的失败重连次数
连接失败次数超过此值后将会标记对应后端服务器为不可用
    timeout http-request    10s       http请求超时时间
    timeout queue           1m        一个请求在队列里的超时时间
    timeout connect         10s       连接超时
    timeout client          1m        客户端超时
    timeout server          1m        服务端超时
    timeout http-keep-alive 10s      
    timeout check           10s       检测超时
    maxconn                 3000      每个进程可用最大连接数
 
frontend  main *:5000                 监听端口
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
 
    use_backend static          if url_static
default_backend             app              后端web集群组名
 
backend static
balance     roundrobin                       负载均衡算法, balance  roundrobin轮询 
balance  source保存session值
    server      static 127.0.0.1:4331 check      静态文件部署在本机
 
backend app
    balance     roundrobin                       负载均衡算法
    server  app1 127.0.0.1:5001 check            定义后端
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

4.4 web服务端部署:

这里为了快速部署,安装了httpd,yum安装即可

4.4.1 创建测试页面:

echo "172.16.1.17 web03" > /var/www/html/index.html
echo "172.16.1.18 web04" > /var/www/html/index.html

4.4.2 启动httpd服务:

systemctl start httpd.service

4.4.3 启动httpd服务后访问页面测试一下,确保后端节点访问正常

1.1 编写负载均衡服务器haproxy的配置文件:

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
frontend  http *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
 
    use_backend static          if url_static
    default_backend             web
backend web
    balance     roundrobin
    server  web03 172.16.1.17:80 check
    server  web04 172.16.1.18:80 check

1.2 启动haproxy服务:

systemctl start haproxy.service

1.3 进行负载测试:

1.3.1 第一次访问:

1.1.1 第二次访问:

1.1 查看httpd服务的日志:

1.1.1 日志记录的是负载均衡的ip地址,而非真实访问的源IP地址

[[email protected] html]# tail -2 /var/log/httpd/access_log
172.16.1.41 - - [18/Mar/2018:02:28:12 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
172.16.1.41 - - [18/Mar/2018:02:28:13 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"

1.1.2 解决办法:

找到定义日志记录格式的地方:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改记录http访问的头部信息:

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

重启httpd服务:

systemctl restart httpd.service

1.1.3 在此访问后验证:

[[email protected] html]# tail -2 /var/log/httpd/access_log
"10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
"10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"

第2章 实现基于cookie实现负载:

2.1 cookie可以实现根据客户端cookie信息来实现持久连接,实现原理:

客户端首次访问服务器,服务端会通过set-cookie设定客户端的cookie信息,以后客户端访问服务端时,会附加设置好的cookie信息进行访问

2.2 修改haproxy配置文件信息:   绿色为修改部分

backend web
    balance     roundrobin
    cookie webser insert nocache  
    server  web03 172.16.1.17:80 cookie web03
server  web04 172.16.1.18:80 cookie web04

cookie  关键字用法说明:

nocache:姜付加cookie信息的源不缓存于缓存服务器中

insert:插入cookie信息

rewrite:重写cookie

prefix:作为前缀

2.3 进行测试:  多次访问   都是同一台服务器

第1章 Haproxy状态页:

1.1 在配置文件中添加状态页相关信息:

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin/stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

1.2 在浏览器中输入网址访问

http://10.0.0.41:1080/haproxyadmin/stats

第1章 实现haproxy自动监控后端状态:

1.1 修改haproxy配置文件:

backend web
    balance     roundrobin
    server  web03 172.16.1.17:80 check port 80 inter 2 fall 2 rise 1
    server  web04 172.16.1.18:80 check port 80 inter 2 fall 2 rise 1

1.2 宕掉后端服务器,模拟故障:

[[email protected] html]# systemctl stop httpd.service
[[email protected] httpd-2.4.6]# systemctl stop httpd.service

1.3 进行访问:

1.1 恢复其中一台,再次进行测试:

后端服务器恢复后,立马上线

原文地址:http://blog.51cto.com/13520772/2095442

时间: 2024-10-18 22:51:51

Haproxy-10万并发级别负载均衡器的相关文章

让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求

让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求 今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service UnavailableThe [email protected] setting is being exceeded. Detailed Error Information: Module IIS Web Core Notification BeginReques

IIS服务器能支持10万并发

服务器能支持10万并发由于一个项目的访问量越来越大,从原来的几百个,增加到现在50多万个每天,所以阿里的服务器也扛不住了,于是就想办法,查了N多资料,总结了以下方法,才解决这问题,每天一共访问量50多万,并不是同时访问,所以,提高并发数才是关键. 由于网站一再打不开,按照排除原因来看,数据库连接.进程池满了.iis并发数太高,我能想到的就只有这三种情况,于是就一个一个排除,当项目网站打不开时,同服务器其他网站都正常,内存不到30%,CUP不到20%,怎么可能打不开呢,于是我先重启数据库,发现仍然

nginx优化 实现10万并发访问量

一般来说nginx配置文件中对优化比较有作用的为以下几项:worker_processes 8;1 nginx进程数,建议按照cpu数目来指定,一般为它的倍数.worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 0010000001000000 10000000;为每个进程分配 cpu,上例中将 8 个进程分配到 8 个 cpu,当然可以写多个,或者将一个进程分配到多个cpu.worker_rlimit_nofile

让Windows Server 2008r2 IIS7.5 ASP.NET 支持10万并发请求

由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支持10万个并发请求. 具体设置如下: 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535. IIS管理器 > 应用程序池 > 高级设置 队列长度: 65535 2.  调整IIS 7的appConcurrentRequestLimit设置 由原来的默认5000改为10000

让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求(转)

转自:http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html 今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service UnavailableThe [email protected] setting is being exceeded. Detailed Error Information: Module IIS Web Core Notificat

让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求(转载)

转自:http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html 今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service UnavailableThe [email protected] setting is being exceeded. Detailed Error Information: Module IIS Web Core Notificat

让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求 The [email protected] setting is being exceeded.

今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service UnavailableThe [email protected] setting is being exceeded. Detailed Error Information: Module IIS Web Core Notification BeginRequest Handler StaticFile Error Code 0x00000000 由于之前使

基于Nginx实现10万+并发,你应该做的Linux内核优化

由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能: 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器.反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,这里针对最通用的.使Nginx支持更多并发请求的TCP网络参数做简单的配置: 首先,你需要修改/etc/sysctl.conf来更改内核参数. fs.fil

属性 每秒10万吞吐 并发 架构 设计 58最核心的帖子中心服务IMC 类目服务 入口层是Java研发的,聚合层与检索层都是C语言研发的 电商系统里的SKU扩展服务

小结: 1. 海量异构数据的存储问题 如何将不同品类,异构的数据统一存储起来呢? (1)全品类通用属性统一存储: (2)单品类特有属性,品类类型与通用属性json来进行存储: 2. 入口层是Java研发的,聚合层与检索层都是C语言研发的 3. (1)数据库提供“帖子id”的正排查询需求: (2)所有非“帖子id”的个性化检索需求,统一走外置索引: 4. 定期全量重建索引 5. 为应对100亿级别数据量.几十万级别的吞吐量,业务线各种复杂的复杂检索查询,扩展性是设计重点: (1)统一的代理层,作为