最近Twitter开发了一款分布式实时统计系统Rainbird。Rainbird可以用于实时数据的统计:

  • 统计网站中每一个页面,域名的点击次数

  • 内部系统的运行监控(统计被监控服务器的运行状态)

  • 记录最大值和最小值

性能要求

作为大型网站的分布式应用,需要具备以下性能: 

  • 极高的写入性能,可以达到100,000的WPS

  • 非常高的读取性能,可以达到10,000s的RPS

  • 高度的可扩展性,包括读取和存储等等,能够扩展到100+ TB的量级

  • 读取速度响应间隔短,绝大多数的读取速度应该不超过100ms

系统组件

Rainbird一款基于Zookeeper, Cassandra, Scribe, Thrift的分布式实时统计系统,这些基础组件的基本功能如下:

  • Zookeeper:Hadoop子项目中的一款分布式协调系统,用于控制分布式系统中各个组件中的一致性

  • Cassandra:NoSQL中一款非常出色的产品,集合了Dynamo和Bigtable特性的分布式存储系统,用于存储需要进行统计的数据,并且提供客户端进行统计数据的查询。(需要使用分布式Counter补丁CASSANDRA-1072)

  • Scribe:Facebook开源的一款分布式日志收集系统,用于在系统中将各个需要统计的数据源收集到Cassandra中。

  • Thrift:Facebook开源的一款跨语言C/S网络通信框架,开发人员基于这个框架可以轻易地开发C/S应用。

整体设计

Rainbird的设计架构图如下:

分布式服务常见问题—访问量统计如何做?_经验分享

整个Rainbird系统中各个组件之间的协调和容灾处理由ZooKeeper负责,Cassandra负责整个数据的存储和统计。Front End中部署了Scribe,收集需要统计的数据,然后将收集到数据实时地发生到Rainbird Aggregator中。Rainbird Aggregator将缓存收集的数据(1M),并将缓存的数据进行一次预处理,然后再将数据一次性批量写入到Cassandra中。这里预处理的作用类似于MapReduce框架中的combiner的作用,在Maper端做Reduce。Rainbird Query接受用户的查询请求,直接到Cassandra中查询已经统计好的数据返回给客户端。

页面URL统计示例

假设我们需要统计网站的页面点击的情况,那么如何使用Rainbird来进行统计呢?在统计的过程中,本博客中一篇文章的URL为:http://www.cnblogs.com/gpcuster/tag/Cassandra/。我们可以将这个URL分拆为以下四个部分com、cnblogs、www、http://www.cnblogs.com/gpcuster/tag/Cassandra/ 然后以分拆后的这四个部分组合为以下Key:

  • com,cnblogs,www,http://www.cnblogs.com/gpcuster/tag/Cassandra/

  • com,cnblogs,www

  • com,cnblogs

  • com

最后将这些Key的数据写入Cassandra中。这样就完成了整个统计的过程。如果需要查询页面http://www.cnblogs.com/gpcuster/tag/Cassandra/被访问了多少次,只要在Cassandra中查询Key为com,cnblogs,www,http://www.cnblogs.com/gpcuster/tag/Cassandra/的值即可。如果需要查询页面http://www.cnblogs.com被访问了多少次,只要在Cassandra中查询Key为com,cnblogs,www的值即可。如果要查询页面http://*cnblogs.com被访问了多少次,也可以进行类似的查询即可。

更多参考

  • 如果希望了解更详细的信息,可以参考:http://www.slideshare.net/kevinweil/rainbird-realtime-analytics-at-twitter-strata-2011

  • 另外,想了解更多关于Cassandra的信息,可以参考:http://www.cnblogs.com/gpcuster/tag/Cassandra/

  • 想了解更多关于ZooKeeper的信息,可以参考:http://www.cnblogs.com/gpcuster/tag/ZooKeeper/