Cassandra数据读取机制

数据读取流程

Cassandra会根据需要读取的ColumnFamily查询该ColumnFamily下的Memtable以及所有的SSTable,合并查询结果,将最新的结果返回给客户端。Cassandra从SSTable中读取数据时,先要读取Bloom Filer文件判断该Key是否在被SSTable中,如果在,再从Index文件中定位到数据的位置,最后从Data文件中读取需要查询的信息。

弱读取的执行流程如下:

  1. 从集群中找出一台最适合读取的服务器。
  2. 从这个服务器读取数据,如果是本机则对本机的数据进行异步读取。如果不是本机,向该服务器请求需要的数据,并根据一定的概率进行计算是否进行读取修复操作。
  3. 等待结果返回。
  4. 将返回的结果返回给客户端。

在强读取下执行流程如下:

  1. 找最适合的一个服务器。
  2. 发送读取请求。
  3. 根据一致性的级别从集群中找出其他需要读取的服务器。
  4. 向其他需要读取的服务器,对比数据是否一致。
  5. 如果一致就返回结果,不一致就进行QUORUM级别的读取修复。
  6. 将最终的 结果返回。

集群数据读取策略

在集群中提供5中一致性读取策略保证高可用性:

  1. ONE:有一个成功就返回,不要求最新。
  2. QUORUM:成功数目不少于ReplicationFactor/2+1。
  3. LOCAL_QUORUM:与2不同的是要有一个服务器是和接收读取操作的服务器处于同一数据中心才算成功。
  4. EACH_QUORUM:和3刚好相反。
  5. ALL:服务器数量为ReplicationFactor时才算成功,这样就是高一致性,低可用性。

读修复

有一定的概率去执行修复。Cassandra向集群中的每一个包含该数据并且存活的服务器发送该读取数据的摘要信息的读取请求,然后进行对比找出最新的数据,并且更新数据国企的服务器,从而保证数据的一致性。

数据缓存

Cassandra提供RowCache和KeyCache。RowCache缓存的是数据,而KeyCache缓存的是在SSTable文件中的位置。

二级索引

Cassandra在使用二级索引查询的时候,不是直接去寻找存储数据的ColumnFamily,而是先通过存储索引的ColumnFamily定位到存储数据的位置,再去存储数据的ColumnFamily中寻找实际的值。

你可能感兴趣的:(cassandra)