绝想首页

Cassandra阅读笔记

张洁g3kewn2p [激励] 2013-03-05 23:20:49 星期二 晴天 查看:290 回复:0 发消息给作者

CassandraDaemon类是服务端的入口,Cassandra利用Thrift作为客户端和服务端的网络通信框架,CassandraDaemon,调用Thrift的API监听端口,启动服务。

客户端数据首先经过Cassandra.Processor,具体处理过程如下:
1。通过TProtocol读取TMessage,TMessage包含了消息的顺序编号,需要服务端执行的操作名称
2。根据操作名称,Cassandra.Processor通过名称和具体处理类的映射找到处理类,然后调用处理类的process方法
3。具体处理类,其实只做了对TMessage体的decode工作,然后交由CassandraServer来真正处理。
4。CassandraServer实现了Cassandra.Iface接口,Iface接口定义了客户端能和服务端能够执行的具体调用。

举个列子吧:
客服端要执行get_column(String tableName,String key,String columnPath)操作。
此操作被Thrift encode后发送到服务端,服务端通过Thrift把事件传递到Cassandra.Processor对象,Cassandra.Processor 通过TProtocol.readMessageBegin得到TMessage,根据TMessage.name知道是要执行get_column操作,于是操作被传递到get_column类,改类实现了ProcessFunction接口,get_column对象执行process操作,process操作继续通过TProtocol.read得到具体参数,即tableName,key,columnPath三个参数,有了参数后调用Iface的get_column的方法来处理,这个时候代码到了CassandraServer类了。

CassandraServer怎么处理呢?说来就话长了,慢慢来吧
CassandraServer把要执行的操作封装到Command对象里面,如果是读取操作具体就是ReadCommand对象,然后调用StorageProxy.readProtocol(command,StorageService.ConsistencyLevel.WEAK)来执行命令。

StorageProxy根据一致性级别(StorageService.ConsistencyLevel)来决定怎么获取数据。
共有强弱两种级别WEAK,STRONG。
看看StorageProxy怎么区别对待这两种级别。
Weak:读的时候,只选择一个合适节点,什么是合适节点呢?如果N个节点里包括local节点,那就读本地的,如果不包括本地节点,就调用StorageService.findSuitableEndPoint来得到,findSuitableEndPoint函数优先找一个在同一个数据中心的健康的节点。
       写的时候,写分block和non block两种方式

在说StorageProxy之前,先看看StorageService吧


DHT
StorageService.getAllRangs(Set tokens)
这个方法根据token来获取所有的Rang,算法很简单,把tokens排序,然后相邻2个tokens构成一个Rang,比如token包含1,2,3,4,5则范围为(1,2),(2,3),(3,4),(4,5),(5,1)

写数据
1。客户端随机找一个集群中的节点发出一个写的请求
2。由Partitioner器来决定那些节点需要响应该请求
3。在每个节点本地将该写操作log下来,应用到一个内存版本
4。内存版本数据被定期Commit log被存储到磁盘

3读数据
1。找到应该响应读请求的节点
2。该节点得到一个本地版本
3。同时向其他副本节点发送Digest Query(只要数据的摘要,不需要完整数据)
4。如果Digest都一致,直接返回本地版本,否则做版本修复

顶一下(34 写日记 1168213 226568
分享排行

 

 

留住已经逝去的峥嵘岁月 记住曾经绽现的万种风情 在记忆即将淡漠的时候 来把这些重新回味

Copyright (C) 2008-2014 www.juexiang.com, All Rights Reserved.

京ICP备2023001011号-3   京公网安备11010802011908号

客服QQ 1017160561 违法和不良信息举报电话 13148464312 邮箱 1017160561@qq.com