本文主要描述Cassandra的数据读取流程,包括节点的选定以及选定以后如何从Memtable和SSTable读取数据的过程.
节点的选定流程
主入口在SelectStatmemt.execute(NormalPager…)这里,最终调用到storageProxy.read上面。这里只讨论ConsistencyLevel不为serial的情况,且指定partitionKey没有aggressive的读取过程,在CQL中查询多个partitionKey的话,Cassandra会按照单个key逐个异步向对应机器查询,然后同步等待并返回结果。
整体思路
整体读过程的思路如下:
按照响应时间的快慢从snitch中获取副本节点的位置,snitch是cassandra中负责节点位置的组件。
按照partitionKey发送请求到最近的副本,在下列情况中,同时发送摘要请求到:
2.1 如果打开了readrepair,发送到所有副本
2.2 最近的R-1个副本,R是ConsistencyLevel指定的个数
等待从R个副本的返回
如果摘要与读取数据的摘要一致就返回,不一致就从所有副本中读数据并开始ReadRepair
代码细节按照查询的key获取对应的所有副本节点
生成一个随机数,如果大于配置的readRepairChance就为此次查询开启一个全局的readrepair(readRepairDecision.GLOBAL),否则就不开启(readRepairDecision.NONE)
根据2的readRepairDecision来决定查询的副本,如果是NONE的话就只要ConsistencyLevel中指定的个数,如果是GLOBAL就对应该key的全部副本节点