坚信科学,分享技术

2018全新版本,未来在blog.54chen.com更新博客!

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

Category Archives: 架构研究

大负载网站架构相关的研究记录。

海纳百川——人人网海量存储系统Nuclear开发手记

此文为《程序员》杂志约稿,发表在2010年9月刊。怀念过去美好的时光和所有的UGC兄弟真挚友谊,谨以此文为个人职业发展阶段作一个美好的终结。以下是全文原稿。 2009年8月左右,由于业务扩展的需要,我们的团队开始了一个新项目的研发,其中需要完成一个存储系统,把评论数据聚合到一起同时还要提供线上的读写服务。这些评论来自不同的业务产品,数据量非常之巨大;同时对稳定性的要求非常高,因为如果出现宕机,将影响到大量的业务线。于是,我们开始了对此类系统的探索。 Nuclear 的由来 经过需求分析阶段,摆在我们面前的是五点要求:高可用、高可扩展、高性能、Key-Value存储、支持关系化查询。经过一段痛苦的系统选型分析,我们最终决定开发属于人人网的海量存储系统。Nuclear,正如其名,nuclear的未来将要肩负起整个评论系统存储的核反应般的压力爆发的重任。由于当时并没有这方面的经验,一切都是摸着石头过河,我们设计了好几期的雏形,一开始明显就是有问题的构架设计,慢慢地在学习和进步的过程中,团队的成员也在慢慢地成长,离我们的目标也越来越近。又因为业务模型的需要和方便分布到集群,这个系统慢慢演变,最后成为了一个可靠的分布式key- value存储系统。以下特将在研发过程中遇到的问题做一个总结。 Key-Value系统的优缺点 NoSQL系统在过去的一两年里,饱受了争议和技术界的目光。从原理上讲,基本上这类系统都会有一些相同的优点和缺点: 优点: 1. 只有高效的查询可用,性能是可想像的。 2. 容易分布到集群。 3. 可以很容易增加缓存层用来加

Continue reading

Posted in java, 架构研究 | Tagged , , | 16 Comments

国内互联网公司数据库访问层调查

在WEB开发中,数据库的数据读写和传输一向是瓶颈,在此基础上的解决方案基本都是数据库连接层的设计,一个公司数据库连接层的牛B与否可以标识这个公司的全局规划的“工艺水平”到达一个什么样了。下面的内容来自明查暗访,决无BS之意,旨在提供给需要统一规划整体架构的架构师一个帮助。 54chen声明:本文所有内容本着技术分享的原则,收集资料皆来自网络,绝不透露不该透露的内容,绝不隐藏不该隐藏的内容(阿弥托佛,资本家万岁)。 1.人人网 参考:http://ugc.renren.com/2009/12/28/renren-ice-problem/ 关键词:ice中间层,统一配置数据源,开发者不关心分库分表 与很多大型的网站一样,人人网的系统全部是由开源软件构建的。使用Nginx做前端接入,resin做容器,Memcached做通用 cache,MySQL做数据库,使用Linux操作系统。 除了上述的部分外,人人网还有一个与众不同的中间层。中间层以服务的形式存在,位于MySQL和resin中间,提供高并发低成本的数据访问层。 2.百度 参考:http://wenku.baidu.com/view/9daa2b8102d276a200292e9c.html 关键词:dbproxy,服务器都是flash卡,DBA与开发者都不关心分裤分表(半自动) 百度的dbproxy利器,将mysql的管理半自动化,HA等功能一应俱全,再加上SSD等硬件支持,性能相当不一般。 3.盛大-技术保障中心 参考:网友 关键词:无中间件,每个系统一个数据库,开发者严重关心分库分表 4.新浪 参考:网友 关键词:无

Continue reading

Posted in linux, 架构研究 | Tagged , | 5 Comments

大型网站登录项目的重要性

中国互联网最不缺少的就是复制,为什么美国一个行业的网站都是一家独大?有人说是因为他们上网的人少,先入为主的效果比较大,后面进入市场的网站基本都存活不久。 而在国内,大家都在把皮毛抄来抄去,真正的核心却是抄不去的,比如说登录。 登录,垃圾广告的第一关 网站大了,自然被一堆的spam盯上,少量的spam不会怎么样,但是到处是牛皮蘚一样的广告,给网站的正常用户的感觉可想而知。 大多数网站针对这些spam有着以下的一堆策略: 1.anti Spam项目针对各种各样的关键词一概禁止发 坏处:关键词越来越多性能越来越差。 2.举报项目让自觉的用户去举报 坏处:往往还没有举报用户就走掉了。 3.对发送次数过多的用户判断发送次数,次数过多的出验证码 坏处:正常用户也可能会被影响。 看国内网站的登录 1)豆瓣:登录强度指数1 无https,无验证码,无加密,用代码模拟登录http://www.douban.com/login轻而易举,不知为何在豆瓣似乎看不到诸如淘宝商城之类的广告,看来另有人肉在?求验证。 2)人人网:登录强度指数1 薄弱原因,未统一入口,无加密,http://3g.renren.com/login.do?fx=0&autoLogin=true无https,无验证码,用代码模拟登录非常简单,淘宝小广告、陌生人加好友现象普遍存在(也可能是我经常用的缘故)。 3)百度:登录强度指数2 采用两次取票,https传送,比前两位稍强,但对于执意要模拟登录来说,丝毫没有增加难度,只是多发几次请求而已。 4)腾讯:登录强度指数4 这个最强,统一前后端,统一入口,虽未启用http

Continue reading

Posted in 架构研究 | Tagged , , | 14 Comments

用搜索的倒排轻松搞定“好友的文章”类相关推荐功能

在SNS网站中,“好友的相册”、“好友的日志”、“好友常去的小组”,这样的功能到处都是,如果处理不当,对整个系统的压力都会非同小可。 这里介绍一种利用sphinx的搜索天性,倒排索引群中的人,然后把好友的XX功能化解为或关系的搜索,下面是是一些记录。关于sphinx的安装,详细见54chen之前的一些手记:http://www.54chen.com/tag/sphinx 第一步,制造随机数据 这里为方便理解,作一个假设的场景,要索引的字段缩减到2个字段,字段1是目标id,表示相册id\日志id\小组id等等,字段2是一个text,里面以逗号隔开记录了所有的和这个目标id有关系的人的id号,大致如下所示: id members 1 1,2,3,4,5,6 这样一个表,标识了id为1的一个目标,都有什么用户和他有关。比如可以表示:id为1的群都有12345这五个人加过;id为1的相册都有12345这五个人看过;id为1的相册都有12345这五个人回复过,等等。 下面代码片段所做之事,是将10万条记录插入到表中,表的members的记录在五千条内随机,里的人id从1到50000随机产生,这样,基本能够模拟一个中型应用的水平了。 $db = new DLConnection(); $sql = "INSERT INTO `forum`.`forum_info` (`id` ,`members`)VALUES"; $dot = ""; for ($i=0;$

Continue reading

Posted in WEB相关, 架构研究 | Tagged , | 7 Comments

[54chen开发日记]注解和拦截器实现权限通用模型的设计实践

------------------英文大爱-----------------------         在近期的开发过程中,有使用到拦截器来实现权限控制,使用这种设计方案,可以很好地分离权限与系统本身的功能,让开发过程更加关注系统的核心功能,同时可以很容易做到开发时的任务划分,同时使项目代码的可读性大大提升。先来普及几个相关的名词: 1.AOP:是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程,也有叫面向方面编程,不过切面更加形象。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 2.GoF:《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或 GoF)"书。话说为首的Erich Gamma,在QCon的大会上54chen也有半面之缘。 权限模型的常量定义      &n

Continue reading

Posted in java, 架构研究 | Tagged , , | 1 Comment

rose pipe–一次对http技术的伟大革新实现(54chen乱弹版)

网站速度一直是互联网公司所关注的核心目标之一,作为SNS网站更是这样。来自世界第一大的打不开的SNS网站facebook的工程师日志中提到,BigPipe: Pipelining web pages for high performance。 原文在墙外,豆瓣有存根,地址为http://9.douban.com/site/entry/139173635/。 来自infoq的一篇资料报道:http://www.infoq.com/cn/news/2010/08/bigpipe-facebook-optimize 它本意是充分利用http,将用户感受到的延迟时间降低一半,是如何做到的呢,下面由54chen流水记账一篇解释实现原理。院内曾经由人人网架构师王志亮大侠发表过一篇文章,地址是http://www.54chen.com/architecture/rose-open-source-portal-framework.html,本文将以此例中的项目举例。 HTTP协议 HTTP是一个客户端和服务器端请求和应答的标准,尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。 在这里重新解释HTTP是为了后面做铺垫,一次http访问的过程如下: 1.打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求动作; 2.服务器在处理完客户的请求之后,要向客户机发送响应消息; 3.客

Continue reading

Posted in 架构研究 | Tagged , , | 9 Comments

sphinx安装配置手记(中文分词54chen支持版)

介绍 Sphinx[英] [sfɪŋks] [美] [sfɪŋks] 出自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Coreseek是一款基于Sphinx的开源检索引擎,支持Tb级的全文数据索引,专门为中文用户提供免费开源的中文全文检索系统。 下载 wget http://www.coreseek.cn/uploads/csft/3.2/csft-3.2.12.tar.gz wget http://www.coreseek.cn/uploads/csft/3.2/mmseg-3.2.12.tar.gz 解压 tar -zxvf mmseg-3.2.12.tar.gz tar -zxvf csft-3.2.12.tar.gz 中文依赖下载和安装 wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz tar zxvf libiconv-1.13.tar.gz cd libiconv-1.13/ ./configure --with-libiconv-prefix make make install 建立系统动态链接 在/etc/ld.so.conf中加一行/usr/local/lib,运行ldconfig。 ld.so.conf和ldconfig是维护系统动态链接库的。真不明白为什么iconv库安装时不把这一步也做了 安装mmseg分词 cd mmseg-3.2.12 yum -y in

Continue reading

Posted in 架构研究 | Tagged , | 5 Comments

用sphinx轻松搞定方便管理的多节点过亿级数据搜索

概述 来自俄罗斯的开源全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级),实测千万级数据在0.0X秒和0.00X秒占大多数。 Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,实测30W线上复杂的blog数据需要5分钟,创建1000万条记录的索引可以在50分钟内完成,实测时间比这个更长得多,而只包含最新10万条记录的增量索引,重建一次只需几十秒,实测十万条在一分钟不到的时间。 Sphinx 是一个基于 GPL 2 协议颁发的免费开源的全文搜索引擎.它是专门为更好的整合脚本语言和SQL数据库而设计的.当前内置的数据源支持直接从连接到的 MySQL 或 PostgreSQL 获取数据, 或者你可以使用 XML 通道结构(XML pipe mechanism , 一种基于 Sphinx 可识别的特殊xml格式的索引通道) 。 sphinx安装 安装见 用Sphinx快速搭建站内搜索功能 配置多节点协同工作 第一点,原理 在sphinx.conf中可以配置index段落里的local和agent两个参数,local = blog_1表示使用本地索引名为blog_1的索引,agent = 10.1.1.1:3312:blog_2表示使用10.1.1.1这个机器的3312端口上服务的blog_2索引。这两个参数均可在此段落中重复出现。 利用这两个参数,可进行节点与节点间的配置。如图1所示,一个searchd服务在接到请求时两种使用索引的示意图。 图1 一个searchd服务在接到请求时两种使用索引的示意图

Continue reading

Posted in linux, 架构研究 | Tagged , | 11 Comments

一条SQL引发的对order by的思考

==========尽职的安静的分隔线=========== 在实际工作中遇到下面一个问题: 有一个表,存有2000万数据。 主键为ID bigint(20) NOT NULL auto_increment 另有一字段time timestamp NOT NULL default CURRENT_TIMESTAMP 故事从这两个字段说起: sql1需要从这个表中检索出来时间为2010-05-26 11:55:00之前并且id号大于20000的前10条数据 sql2需要从这个表中检索出来时间为2010-05-26 11:55:00之后并且id号大于20000的前10条数据 两条sql写出来大概是这样子的: sql1:select * from table where time 20000 order by id limit 10; sql2:select * from table where time >'2010-05-26 11:55:00' …

Continue reading

Posted in 架构研究 | Tagged , | 19 Comments

7月3日 infoQ Qclub分享演示文稿下载

本次活动以RIA为主题,参会者多为关心RIA及后端数据服务的开发者和管理者。 我的主题是:"Ria的强力后盾:rest+海量存储 主要内容是给参会者分享了淘宝在nginx上作的关于rest的事情,和一些人人网nuclear的原理。 下面是此次会上我所使用的slide。(国外 有点慢 需忍) Ria的强力后盾:rest+海量存储 View more presentations from zhen chen.

Continue reading

Posted in 架构研究 | Tagged , , , | 4 Comments
Page 4 of 7« First...23456...Last »