Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262493
  • 博文数量: 19
  • 博客积分: 1608
  • 博客等级: 上尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-10 10:05
文章分类

全部博文(19)

文章存档

2012年(3)

2011年(6)

2010年(7)

2009年(3)

分类: LINUX

2010-06-02 13:54:13

HAProxy后端keepalive设计原理 1 概述

HAProxy后端keepalive指的是在HAProxy服务完一次request后,不关闭HAProxy和后端Squid的连接,而是维护这个连接以备后续的request复用。

2 配置

启用HAProxy后端长连接需要配置如下:

    option http-pretend-keepalive

    option http-srv-kpa

squid需要配置如下:

pconn_timeout 60 seconds //该时间可调,对于我们的环境可以考虑配置的长一点

client_persistent_connections on

3 相关数据结构
  1. struct pconn

    77 #define PCONN_INI 0x0000

    78 #define PCONN_NEW 0x0001

    79 #define PCONN_REUSE 0x0002

    80 #define PCONN_RM 0x0004

    81 #define PCONN_RM_END 0x0008

    82

    83 struct pconn {

    84 int fd;

    85 int flags;

    86 struct pconn *next;

    87 };

  2. struct pconn *p_free_hdr

    该分量为存放所有的free pconn的链表

  3. server->phdr

    struct server结构中新增phdr分量struct pconn *phdr,该分量为存放所有可重用的连接信息的链表。

  4. fdtab

    struct fdtab结构中新增struct server *srv分量标记该fd属于那个server(只有后端的fd才不为空),新增struct pconn *pcn标记连接信息。

4 改动流程
  1. connect_server函数

    connect_server函数完成连接到后端server的操作(分配到那个serversess_prepare_conn_req函数中实现)。该函数完成申请socket,设置socketconnect后端server及其它变量设置。

    我们在这个函数中的改动是在申请socket时首先,从server->phdr中查找是否有重用的连接,有则取链表中的第一个结点,没有则从p_free_hdr 中取一个free节点存放新连接。

  2. fd_delete函数

    fd_delete函数完成连接的释放。目前我们修改为不释放连接信息,而是把连接信息依据状态把连接信息存放至p_free_hdrserver->phdr




  1. soft_stop

    soft_stop完成程序退出的资源清理。在其中把server->phdr的连接信息释放;释放p_free_hdr

阅读(4793) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

chinaunix网友2010-09-03 13:14:11

您好,您的后端keepalive patch我近期进行了测试,发现如下问题测试过程:对于相同url,确定是可以只分发到后端同一squid上, 当在配置文件中开启option http-srv-kpa,确定为开启了后端keep-alive, 但是:当开启option http-srv-kpa时对haproxy后端的某个url进行压力测试后,haproxy将不在对此url进行转发,而只对其他url转发。 不开启时,则测试正常。 希望提供下解决方法,期待您的答复。qq:38036763