要能使用好存储需要清楚底层存储的原理, 比如清楚了Mysql的B+树索引原理, 在使用过程中就不会出现低级问题。本文简单介绍Cassandra读写特点。
NWR
NWR是Cassandra有别于其他分布式存储一个典型特点(继承自Dynamo),分布式系统多使用多副本机制保证可用性, 一般会有一个主副本,其他为备副本, 写操作都在主副本上执行,在通过一致性协议(Paxos, Raft等)同步到备副本(分布式文件系统例外, 数据流是备副本同步到主副本, 信息流还是主副本到备副本),读操作可以作用在主副本, 也可以作用在备副本(需要处理一致性问题), Cassandra副本却不区分主副本和备副本, 都可以接受写操作/读操作, 只需要保证W+R > N, 其中W为写副本数, R为读副本数, N副本总数, 就能保证读取到最新数据。
Cassandra在写的过程中, 由协调节点像有所有副本写入数据, 当各节点返回结果满足写数据一致性设置后(one, two,Three, Qurum, Local Qurum, etc)则返回给前端用户写成功。
读过程仅发送满足读一致性的节点数量, 如果发现数据不一致则异步执行数据同步, 并返回最新客户给用户。
客户端可以通过设定token aware的方式提高读取和写入性能。
个人观点: 理论上这种分布式方式在读操作上RT性能应该不如主备方式, 因为要读取多节点,优势是因为所有节点都为对等节点, 可降低单节点访问压力, 但是主备方式的异构系统也可以避免单节点访问压力的问题。写上的区别不大。
Compaction
Cassandra单机存储也采用的是LSM方式, 采用通用的布隆过滤器(内存)方式提高查询性能, Compaction的设定集大影响cassandra性能,在SSTable 的Compaction策略上分为:
按大小Compaction, 按Level compaction, 按date/time compaction。
按大小Compaction: 劣势: 采用copy方式, 存储需要双倍空间, 在更新比较多的情况下下, 单一数据可能存在多个SSTable中, 影响写性能,优势是compaction占用io不多。
按Level compaction90% key在单一SSTable中, 劣势是compaction一直在发生, 占用io较多, 适合更新多的情况。
按date/time compaction适合按时间查询数据, 还可设定数据保留时间。
索引
Cassandra的一级索引采用partion key 和cluster key的方式, 和正常索引效率相同, 二级索引的机制不是采用数据分布机制实现, 是所有索引数据同被索引数据一起保存, 这样在查询二级索引需要查询所有节点, 因此容易引起性能问题。