Database internals - Storage eng
Cassandra使用类似于LSM树(Log-Structured Merge Tree),不像传统的关系型数据库使用B-Tree树。Cassandra避免在写之前还要读。在写之前读,尤其是在大型分布式系统,会造成读性能的很大延迟和其他问题。例如,两个client在同一时间读;其中一个重写了行,进行了A更新。而另外一个客户端重写了行进行了B更新,移除了A更新。这种竞态条件会导致不明确的查询结果-谁的更新是对的?
为了避免Cassandra中的大部分写使用read-before-write,存储引擎在内存中将inserts和update分组,并且不时的,以追加的方式将数据顺序的写到磁盘中。一旦写入到了磁盘,数据不可更改(immutable),不能被覆写。读数据时需要组合immutable的顺序写入的数据,去返回正确的查询结果。可以使用Lightweight transactions (LWT) 在写入之前检查数据的状态。但不建议使用这个功能。
一个log-structured的引擎避免overwrites、使用顺序I/O来更新数据对于写入 solid-state disks (SSD) 和 hard disks (HDD)是非常有效的。
HDD机械硬盘:随机写比顺序写涉及到更多的磁盘询道(seek operation)操作。seek的代价非常大。
SSDs固态硬盘:因为Cassandra顺序写文件,因此避免了写入放大( write amplification)和磁盘故障。但对于其他数据库,SSDs的写入放大是一个问题。
注:
1.固态硬盘VS机械硬盘
固态硬盘和机械硬盘的区别在于传统的机械硬盘使用磁介质来保存数据,数据读写的时候需要转动磁盘,因此顺序写比随机写的效率更高。而SSD使用闪存作为存储介质,不像机械硬盘那样有活动的机械部件。因此SSD的随机写和顺序写区别不大。
2.写入放大
写入放大是一个在闪存和SSD中会发生的,不会发生在机械硬盘上,所谓写入放大就是写入的物理数据量是写入数据量的多倍。这个现象会发生的原因就是闪存在重新写入数据前必须先擦除