构建高性能缓存推送平台(添加squid支持)[原创] 不指定

刘天斯 , 2010/10/15 23:13 , Python , 评论(21) , 阅读(35251) , Via 本站原创 | |
       在web2.0网站系统架构中,缓存无处不在。如一个大的CDN平台,一个普通的页面级缓存等。合理的利用缓存可以提高用户下载速度、降低源服务器性能负载。如何高效去维护一个缓存集群?除了提高命中率便是缓存的推送管理。现与大家分享构建一个高性能的缓存推送平台思路及实现。

一、平台架构图
点击在新窗口中浏览此图片
       说明:平台使用Django+mysql开发,支持POS/GET两种模式,POST方式用于管理员的手工推送,GET方式则用于接口模式。平台将接收到的URL进行校验、分类后统一向所属缓存服务器组进行telnet pureg请求。遍历完所有主机后返回结果串。

二、平台截图
1、管理UI


2、接口说明


3、接口调用



三、功能说明
1、普通模式
     只限制于文件或目录的推送
  例:推送http://www.domain.com/web/index.shtml及http://www.domain.com/js/下的全部文件。

  1.1、手工方式
  输入框中输入:
引用

   http://www.domain.com/web/index.shtml
   http://www.domain.com/js/
后点[提交推送]按钮。

  1.2、接口方式
引用

  http://www.domain.com/push/executive/?PushURLid=http://www.domain.com/web/index.shtml,http://www.domain.com/js/&Advancedmode=

2、高级模式
     支持正则表达式的URL规则(适合专业人员使用)
  例:推送http://www.domain.com/main/下文件名为index,扩展名任意的文件及http://www.domain.com/images/下所有*.swf,*.gif文件。

  2.1、手工方式
  输入框中输入:
引用

   http://www.domain.com/main/index..*$
   http://www.domain.com/images/.*.(swf|gif)
选中[高级模式]后点[提交推送]按钮。

  2.2、接口方式
引用

  http://www.domain.com/push/executive/?PushURLid=http://www.domain.com/main/index..*$,http://www.domain.com/images/.*.(swf|gif)&Advancedmode=1

3、注意事项
   手工模式中禁止在输入框中出现空行、多个URL连接。
注:squid主机不支持高级模式及目录推送
三、性能测试
#ab -c 1000 -n 5000 http://sys.domain.com/push/executive/?PushURLid=http://1.domain.com/1.js,http://2.domain.com/img/&Advancedmode=
3.1、Nginx+Django+fastcgi模式测试数据
点击在新窗口中浏览此图片

3.2、Nginx+Django+UWSGI模式测试数据
点击在新窗口中浏览此图片

结论:对接口进行了压力测试,以5000次1000并发进行请求,fastcgi模式速度很快,但存在很多返回错误,从后台日志来看,都是NGINX 502 Bad Gatewa信息,说明后端fastcgi已经处理超时了,UWSGI模式速度不及fastcgi,但表现得很稳定。最终选择了UWSGI+Nginx组合。

三、平台部署
1、部署环境平台
参考:Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器[原创]

2、部署代码
#cd /opt/www
#wget http://blog.liuts.com/Purgesys.tar.gz
#tar -zxvf Purgesys.tar.gz

#cd Purgesys
#vi setting.py
红色为修改项
引用

# Django settings for Purgesys project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
     ('Liuts', 'liutiansi@gmail.com'),
)

MANAGERS = ADMINS


#数据库信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'Purgesys',                      # Or path to database file if using sqlite3.
        'USER': 'dbuser',                      # Not used with sqlite3.
        'PASSWORD': 'dbpass',                  # Not used with sqlite3.
        'HOST': '192.168.100.215',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '3306',                      # Set to empty string for default. Not used with sqlite3.
    }
}


#varnish管理端口与varnish启动参数.. -T 127.0.0.1:2603保持一致。
VARNISHADMINPORT=2603
SQUIDADMINPORT=80


# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Asia/Shanghai'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'zh-cn'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = '/opt/www/Purgesys/static/'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/static/'

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/static/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'tj)*mv!pc_)!zsk*cki$u_f9fg9&^)2^64qi#8!c8xjji--sm7'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'Purgesys.urls'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/opt/www/Purgesys/templates'
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'Purgesys.purgeapp',
    'Purgesys.publicclass',
)



3、导入数据库文件
cd Purgesys/sql

添加用户数据(注意关联关系):
purgeapp_resource(缓存主机表)
purgeapp_resourcegroup(应用表)

4、Varnish配置项
配置应用主域名set req.http.host = "web.domain.com",这样做有两个好处:
  ①对单应用多域名只缓存一份数据;
  ②有利于缓存推送。
引用

sub vcl_recv {
   ...
       if (req.http.host ~ "web.domain.com") {
               set req.backend = webserver;
               set req.http.host = "web.domain.com";
               if (req.request != "GET" && req.request != "HEAD") {
                       return(pipe);
               }
               else {
                       return(lookup);
               }
       }
...
}


5、Varnish启动参数
-T 0.0.0.0:3500一定要与setting.py中的ADMINPORT=2603保持一致,否则无法进行推送操作。

6、访问测试
http://sys.domain.com/push/

7、缓存推送平台1.0下载
下载文件 (已下载 1508 次)


缓存推送平台1.1下载
(添加squid支持)
下载文件 (已下载 1839 次)


四、后续问题
1、我的服务端口非80怎么办?如URL:http://test.domain.com:8080/static/main.gif。
解决方法:
  在数据库添加应用主机名称时加上端口便可,即ResourceGroupName(表)插入:
  “test.domain.com:8080 - varnish”

如大家有什么疑问或感兴趣的话题可以通过weibo与我交流:http://t.qq.com/yorkoliu
铝单板 Homepage
2014/08/10 14:04
好东西,谢谢分享
lanxera Email Homepage
2012/02/14 14:26
如果能出个php版的话就更好了。不懂python,但业务上又需要一个推送平台。呵呵~
cong
2011/05/23 12:45
我远程调用,一直出现-006
http://freshcache.cnbb.com.cn/push/executive/?PushURLid=http://pic.cnbb.com.cn/cms/uploads/allimg/101225/
刘天斯 回复于 2011/05/23 14:46
目前只支持GET提交。
cong
2011/05/23 12:29
已经解决,是mysql-python版本问题
现在跑通的环境是centos 5.5,nginx 1.0.2,uWSGI 0.9.7.2,python 5.5,Django 1.3,Mysql-python 1.2.2
-----------------------------------------
同时,我如何添加删除缓存的机器?
刘天斯 回复于 2011/05/23 14:45
已经有一些demo的数据,直接修改或添加即可。
cong
2011/05/23 11:00
我用nginx 1.02,uWSGI 0.9.7.2,django 1.3,mysql 5.1,出现下来错误
没找到方法,求救

ImportError at /

cannot import name utils

Request Method:   GET
Request URL:   http://freshcache.xxxxxxx.com/
Django Version:   1.3
Exception Type:   ImportError
Exception Value:   

cannot import name utils

Exception Location:   /usr/local/lib/python2.5/site-packages/django/db/backends/mysql/base.py in <module>, line 28
Python Executable:   /usr/local/src/nginx-1.0.2/
Python Version:   2.5.5
Python Path:   

['/var/htdocs/',
'/var/htdocs/Purgesys',
'.',
'',
'/usr/local/lib/python2.5/site-packages/setuptools-0.6c11-py2.5.egg',
'/usr/local/lib/python2.5/site-packages/MySQL_python-1.2.3-py2.5-linux-x86_64.egg',
'/usr/local/lib/python25.zip',
'/usr/local/lib/python2.5',
'/usr/local/lib/python2.5/plat-linux2',
'/usr/local/lib/python2.5/lib-tk',
'/usr/local/lib/python2.5/lib-dynload',
'/usr/local/lib/python2.5/site-packages']
刘天斯 回复于 2011/05/23 11:19
应该是django版本不兼容引起,尝试用使用django1.2.3。
电脑知识与技术博客 Email Homepage
2011/01/13 16:24
高深的技术。学习了
路过
2011/01/04 09:17
不知道有没有nginx的缓存推送?
刘天斯 回复于 2011/01/04 10:04
不支持,以后也不会考虑。
linuxer202
2010/12/05 17:58
终于等到刘老大的1.0出来了,现在升级去。哈哈!!!
renwofei423
2010/11/30 00:03
呵呵  支持 研究研究!
ugg Bailey Button Boots Email Homepage
2010/11/17 15:54
很好。。。。支持一下。。。
邵程程 Email Homepage
2010/11/11 16:10
呵呵,刘天斯你好,多次光顾你的博客,业内牛人。
我一直觉得技术人得有自己的社区,虽然很多人都会自立门户,自建网站,但是不妨也可以试一下在社区建一个博客,所以想邀请你来51CTO开个博客,更专业,更优化,更有人气。
呵呵,可以来体验一下,有意向的可以跟我联系。
QQ:1141613622
msn:51ctoblog@sina.com
刘天斯 回复于 2010/11/12 23:51
多谢你的邀请,分析得也很有道理。个人比较倾向于个性化、可定制的平台,所以选择了独立BLOG。另数据迁移也是一个麻烦事。见谅!
impact wrench Email Homepage
2010/11/09 16:23
不错,实在是太强了。谢谢博主介绍的这么仔细,让我学习到了。
梦飞
2010/11/09 16:21
支持 squid的 2.0 版本 开源吗? 要是开源,啥时候开源啊?
刘天斯 回复于 2010/11/09 17:21
由于时间的关系还没来得及整理,请多关注。
lislike Email
2010/11/08 19:48
今天安装上了,好强大。谢谢天斯。
chuangtse Email Homepage
2010/11/02 13:14
支持一下。另外问下绘图工具用的什么呢?
刘天斯 回复于 2010/11/02 21:25
亿图图示专家
muxueqz Email Homepage
2010/10/25 11:45
学习,感谢分享
鸿雁 Email Homepage
2010/10/21 10:24
支持squid、nginx缓存推送吗?
刘天斯 回复于 2010/10/21 21:24
目前只支持Varnish。
vista2010
2010/10/19 23:59
多谢分享,老刘的好东西真不少啊。
badb0y Homepage
2010/10/16 21:35
支持一下,,转载了!
liliyum
2010/10/16 16:05
刘老大太强了,期待开源,呵呵。
分页: 1/2 第一页 1 2 下页 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]