`
touya
  • 浏览: 74559 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从博客系统优化联想到的

阅读更多
看到一篇比较有技术性的文章,讲的是博客系统优化,很有启发,联想到最近工作中遇到的系统瓶颈问题,很多可以借鉴,原文如下:
http://blog.sina.com.cn/s/blog_4b0f52990100foq2.html

新版博客宣讲会【第五讲】:体验双倍提速博客生活(2009-11-13 13:38:01)

新版博客的全面革新,来源于一支强有力的技术开发团队,在此次开发中,首要目标是完成产品更个性化的需求。开发理念则是坚持简单,稳定。最核心的则是加速。从各个细节去提高各个环节的处理速度。



数据库:

在此次改造前期博客的文章数据库处理能力已经严重不足,而产品在新版中对文章的萃取功能越来越多,所以这次数据库做了较大幅度的改造。博客的数据库物理是采用分库/分表的模式进行物理分离,有效的解决了横向扩展的问题,但由于文章表结构本身比较复杂(包含了所有的应用信息),再加上博客大量的用户数据,数据库物理文件已经很大,再加上大量的请求,处理能力已经严重不足。假如要从根本上解决这些问题,可能要改变目前的数据库应用模式,为了保证开发进度,根据应用特点进行了三个"取巧"的优化:



一、文章状态属性的无限扩展

文章萃取的需求,导致文章有更多的辅助属性,比如这篇文章是否有图片,这篇文章是否是wap发表的,以前的做法是新增字段来存储属性,这样做最大的坏处就是文章库结构越来越"恶心",且无法满足日后的一些扩展需求,更坏的是索引无法有效使用。所以本次设计了一个综合字段,用位的概念来代表文章的辅助属性。比如0001代表加密文章,0010代表wap文章,则0001和0010位与的值代表这篇文章既是加密文章也是wap文章。



二、文章大字段的剥离

以前文章库/表包含所有的文章信息,所以不管是什么应用,都要求数据库管理系统大量的进行i/o操作,带来了极大的负载,那么如何去拆分表结构呢?运维同事借鉴了数据库复制功能,便向的实现了大字段的剥离,更巧妙的不需要应用开发做过多的调整,具体的做法是在某些副库中强制将大字段的类型置为整形。这样在复制的过程中,大字段的内容被置为0。变向的实现了一组小字段的副库。



三、应用查询的拆分

传统做的比较多的是数据库物理的拆分,其实应用使用也可以进行拆分,主要是根据索引的使用进行副库拆分,某些副库可能就是大量查询文章列表,某些副库是查询单篇文章,而区别就是这些副库的索引不一样,这些库的存储引擎不一样,这些库的数量不一样,以满足应用的多点查询。而在实际使用过程中,这些库也根据使用效果,查询量进行合理的分配。



也许有人会说,这些优化可能根本就是滥用数据库,比如复制功能是实现备份,而我们却畸形的使用,数据库物理文件如此大,为什么不从根本上去进行分离,数据库的作用是存储,为什么要做如此多的逻辑处理,为什么不用数据库cache去进行数据的缓存。在这里要说的是,缓存我们有squid,物理的拆分可能无法解决真正的冷热数据剥离,在特定的架构下,数据库的使用方式尽量去迎合它,也许换种解决方式,那数据库可能就不是数据库。





博客渲染模式的变更:

博客首页元素特别的多,比如用户有自定义的模板信息,用户属性的设置,这些信息保存在conf高速接口中,该接口前端是nginx,后端是mdb。这个接口的最大的



好处是数据同静态页面分离,具有很强的灵活性。但是根据具体使用来看存在如下几个弊端:

(1)    该接口无法做到分布,这也可能局限于mdb本身的复制,所以在各个地方,实际响应速度可能比较慢。

(2)    前端ria太依赖于该接口,这个接口的执行顺序是最高的,一旦响应慢,则页面可能就是白屏,这也是博客页面经常出现"裸奔"的根本原因。

(3)    由于这是一个结构化数据的接口,无法直接对页面进行渲染,只能通过ria来进行页面渲染。造成页面的呈现非常不顺畅,且特别消耗客户端资源。

根据以上原因,我们尽量去慢慢剥离这些外部接口,尽量保证博客架构的一致性,具体的做法就是将这些自定义的渲染属性转化为特定的css属性,也就是每个博客用户都有一个自定义的css外联文件,这些css文件内容保存在squid中,也有效做到了web,用户属性有更新的时候,则删除存在在squid中的用户css文件。渲染模式变更的原则尽量是不依赖于ria的渲染,前端尽量简单化,强调异步处理。在目前的应用架构上,上述二点是从技术角度和应用特点进行的最多的改造。



在这次开发中,也在考虑一些问题,这也是博客技术未来发展的一些方向。



1.     数据cache和页面cache的一些使用区别,cache的分布,写入式缓存的使用,cache的自动清理机制。

2.     数据库的优化,数据结构设计的规范性,数据冷热的分离。

3.     博客整体的外布,目前我们仅仅是前端cache的外布,物理和应用并没有做到外布。

4.     队列机制在博客的应用及推广

5.     基础数据的萃取,任何技术的使用,方案都是建立在数据分析之上的,基础数据的灵活萃取和挖掘,也 能给产品提供更好的决策。

6.     应用开发结构的分离,尽量做到异步处理,低耦合,数据与表现的分离。

7.     最重要的一点就是,监控,具有前瞻性的监控机制。

8.     方法论的研究和使用。



产品最重要的是稳定和速度,而这是一个摸索和精益求精的过程,我们未必追求一些先进的技术方法,而是根据应用特点,去挖掘潜在的问题,去优化和改进。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics