例如,想象像 cassandra 或 bigtable 这样的数据库在 100 个服务器上处理 100 万个 qps,每个服务器处理 10k qps 唯一写入
ssd中每页为4kb
假设每台服务器有 100GB 的卷
每秒进行 10k 次写入,每次写入需要 4kb,这意味着在没有压缩的情况下,在填充整个数据库之前您有 25000000 (100GB / 4kb) 次写入
这意味着 41 分钟内您将填满整个磁盘
25000000 / 10000 / 3600 * 60 = 41min
如果进行压缩,吞吐量会下降,延迟会增加
SSD如何应对高写入?固件是否会即时进行压缩?或者数据库引擎是否必须处理压缩? 如果它的句柄在数据库中,如果数据需要持久性,则无法在内存中进行批处理和缓冲,因此您必须写入空白页,或从现有块中读取,连接新数据并覆盖同一块。
我还猜测某些数据结构更适合写放大?例如LSM在SSD中会比B树表现更好?
有我可以阅读更多相关内容的资源吗?
对于Bigtable来说,由于提交日志在磁盘上,因此保证了持久性。在这种情况下,磁盘是 Google 的分布式文件系统,而不是节点本身上的附加存储,因此丢失节点,并不意味着您丢失了数据。
如果节点出现故障,可以重播日志以重新创建内存中的内容。您可以在原始的Bigtable 论文中阅读有关 memtables、sstables 和日志的内容。