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都一致,直接返回本地版本,否则做版本修复
Cassandra阅读笔记

心情分类
推荐日记
分享排行