热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用nginxurlhash提高squid服务器命中率

作者:Ayouurlhash是用于提高squid命中率的一种架构算法,一般现行的架构通常是使用dns轮询或lvs等将访问量负载均衡到数台squid,这样做可以使squid的访问量做到了均衡,但是忽略了一个重要方面--数据量。在这种架构下,每台squid的数据量虽然是一致的,但

作者:Ayou

url hash是用于提高squid命中率的一种架构算法,一般现行的架构通常是使用dns轮询或lvs等将访问量负载均衡到数台squid,这样做可以使squid的访问量做到了均衡,但是忽略了一个重要方面--数据量。在这种架构下,每台squid的数据量虽然是一致的,但通常都是满载,并且存在数据重复缓存的情况。如果后端服务器数据容量或者用户的访问热点数远远超过缓存机器的内存容量,甚至配置的disk cache容量,那么squid将会大量使用磁盘或者不停与后端服务器索取内容。

在新的架构下,使用nginx架载于squid之前,如果squid机器有4台,那么在这4台机器上装上nginx,nginx使用80端口,而squid改为3128端口或其他端口。nginx的效率非常高,消耗内存也非常少,所以并不需考虑加装nginx所带来的性能损耗。然后在nginx上配置url hash,使访问量根据url均衡分布到各台squid,根据url分流之后,每一个url就会只存在于一台squid中,每台squid的数据都会完全不同。我们有4台机器,每台2G内存的话,原先极有可能因为数据大量重复,内存使用率仍然为2G,而现在我们经过数据均衡分布,8G内存可以达到充分利用。

是否会存在访问不均的情况呢?是有可能的,但是根据大数原理,访问量基本可以保持一致,只要不存在单一的特别夸张的热点。

假如squid是利用squidclient来刷新数据的话,新的架构提供了更高效的方法:在后端服务器中模拟url hash的算法来找到内容所在的squid,然后对此服务器刷新内容即可。在旧的架构中,需要遍历所有的服务器,比较低效。

具体配置如下:

nginx本身并没有提供url hash功能(暂时),需要安装第三方模块ngx_http_upstream_hash_module

http://wiki.codemongers.com/NginxHttpUpstreamRequestHashModule?action=AttachFile&do=get&target=nginx_upstream_hash-0.2.tar.gz

cd nginx-0.5.xx

patch -p0
./configure时加上参数

--add-module=path/to/upstream/hash/directory

make; make install

完成安装

配置:

在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
    server squid1:3128;
    server squid2:3128;
    hash   $request_uri;
    hash_method crc32;
}

hash算法可以使用crc32和默认的simple,在java中可利用java.util.zip.CRC32类实现,simple算法的c语言实现如下

#define ngx_hash(key, c)   ((u_int) key * 31 c)

u_int ngx_hash_key(u_char *data, size_t len)
{
    u_int  i, key;

    key = 0;

    for (i = 0; i         key *= 31;
        key = data[i];
    }

    return key;
}

java代码(随手写未测试):

public static long getSimpleHash(String data)
{
long key = 0;
char[] chars = data.toCharArray();
for (int i=0; i   key *= 31;
  key = (int) chars[i];
}
return key;
}

然后对生成的key和upstream里的服务器数量做一次求余计算,得到服务器号。

提供hash算法的目的如前所述,是便于后端服务器迅速找到内容对应的squid服务器。

在ngx_http_upstream_hash_module模块里有一个hash_again的标签,可以解决squid意外死机的问题。不过,如果使用了该标签,那么后端的计算对应服务器的方法就会出现错误。可以使用的办法为,提供一台备份的squid服务器,假如有squid死机,那么在nginx里设置error_page 404和502到这台备份服务器,后端刷新缓存时亦要同时刷备份服务器。


推荐阅读
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • 护墙_搭建LVS负载均衡NAT和DR模式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了搭建LVS负载均衡NAT和DR模式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • pm2常用的命令用法介绍pm2是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • Nginxgaodaima.comnginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
  • nginx使用内置模块配置限速限流的方法实例_nginx
    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景,下面这篇文章主要给大家介绍了关于nginx使用内置模块配置限速限流的 ... [详细]
author-avatar
Cindere丷lla_茹满
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有