
# DDS 4.2及其以上版本切RocksDB存储引擎相关问题Q\&A
#### RocksDB和WiredTiger两者有什么区别？
表1RocksDB和WiredTiger的区别 
|    存储引擎     |                                                                                                            Rocksdb                                                                                                             |                                           WiredTiger                                           |
|---|---|---|
| **写机制的区别**  | Rocksdb存储引擎的数据结构为LSM-tree，写数据就像写日志，以追加写的方式进行。落盘数据除了一个键（key），值（value）之外，还有对应的版本号（version）。同一个键（key）在磁盘上有多个版本（version）的数据。业务层的插入、更新、删除操作，在Rocksdb侧都是写操作。这些多版本数据积压到一定阈值后，会触发后台自动归并，对多版本（version）的数据进行合并，这个行为就是RocksDB的Compaction。 | WiredTiger存储引擎的数据结构为B+ tree，落盘数据中一个键（key）对应一个版本号（version），对某一个键（key）进行插入、更新或删除操作都是直接操作对应的数据节点。 |
| **数据组织的区别** | RocksDB存储引擎下则没有集合（collection）维度，而是64M一个文件分布在磁盘上。                                                                                                                                                                               | WiredTiger存储引擎中一个集合（collection）的数据或者一个索引的数据对应一个磁盘文件，集合是多大，对应的文件就是多大。                           |
   
#### RocksDB优势在哪里？
[表2]从开源生态、存储空间、可定制化、内存高压场景、频繁更新删除场景、多表场景六个方面描述了RocksDB对比WiredTiger的优势。
 表2RocksDB与WiredTiger对比 
|     存储引擎     |                                       RocksDB                                        |                                     WiredTiger                                     |
|---|---|---|
| **开源生态**     | RocksDB相比WiredTiger有更好的开源生态(github stars)，一些知名数据库比如TIDB/CRDB/YUGADB都采用了RocksDB为存储引擎。 | 开源社区生态不如RocksDB。                                                                   |
| **可定制化**     | RocksDB性能调优参数较多，支持根据业务的读写能力要求做定制化的参数修改。                                              | WiredTiger性能调优参数较少。                                                                |
| **内存高压场景**   | RocksDB读写性能稳定，不会随着内存压力变化。                                                            | WiredTiger需要频繁地刷脏页，进行内存与磁盘数据置换，引起读写性能波动比较大。                                        |
| **频繁更新删除场景** | RocksDB在积攒了一定量的新写数据后，会自动异步触发后台compact线程对同一数据的多版本进行归并聚合，释放多余的磁盘空间，因此基本上不会出现磁盘碎片化问题。   | WiredTiger在删除数据进行数据多版本归并聚合后，会空余出磁盘空间碎片，并且不会将这部分磁盘空间返回给操作系统，而是留待后续写入使用，磁盘碎片化问题较为明显。 |
| **多表场景**     | RocksDB支持10K以上的表及索引数量。                                                               | WiredTiger在表及索引数量达到1K以上时，读写性能会受到影响。                                                |
   
#### 为什么华为云DDS 4.2及其以上版本存储引擎使用RocksDB？
基于[表2]的描述，对比WiredTiger，RocksDB有多个方面的优势。华为云DDS基于社区更友好的RocksDB存储引擎，通过自研演进版本，完成对MongoDB 4.2、4.4、5.0等多个版本的API兼容。
#### 华为云DDS 4.2及其以上版本将存储引擎切换为RocksDB会对业务产生影响吗？
- 功能方面：存储引擎是数据库的一个组件，负责管理数据在内存和磁盘中的存储方式。RocksDB和WiredTiger虽然是不同的存储引擎，数据库服务会封装存储引擎，极大兼容社区接口使用方式，开发者使用层面无使用差异感知，业务无差异影响。
- 性能方面：当前RocksDB存储引擎已经经过长期的社区演进，结合DDS团队对其定制化的开发，性能方面二者切换无明显差异，部分查询场景下RocksDB存储引擎表现更优，存储或计算资源使用方面或存在少量差异。
 
#### 使用RocksDB存储引擎在典型业务场景下有哪些表现差异与优化建议？
[表3]描述了RocksDB相较于WiredTiger在一些典型业务场景下的表现差异与优化建议。
 表3典型业务场景下RocksDB的表现差异与优化建议 
| 业务场景  | RocksDB的表现差异                                                  | 优化建议                                   | 示例                                                      |
|:---|:---|:---|:---|
| 多文档扫描 | RocksDB在文档扫描（docsExamined）多的业务场景下对CPU、IO等资源消耗相较于WiredTiger更多。 | 建议通过添加适当的索引进行优化，提高扫描效率，降低CPU、IO等资源的消耗。 | 例如，在coll表A字段没有添加索引的情况下以该字段为条件进行查询：db.coll.find({A: 1})。 |
   
#### 使用RocksDB存储引擎的华为云DDS在执行大量增删改操作时，发现监控中出现磁盘来回波动、CPU毛刺的现象，这是为什么？
- RocksDB存储引擎下，所有的写入均为追加写，不管是更新还是删除，都不会直接修改原数据，而是追加写在尾端，因此同key可能会在磁盘上存在不同版本的值。追加写过程中，同一条数据的多版本同时存在，磁盘容量会上升。
- 不同版本的值最终会在新写入的数据量到达一定量后触发后台归并，即RocksDB的Compaction动作。归并数据动作是异步操作，当一轮运行结束后会将本轮涉及到的多版本数据进行归并合一，归并后会生成新的单版本数据数据文件，删除旧的多版本数据文件，在生成新文件和删除老文件这段过渡期，新老文件会同时存在，即磁盘此时会短暂上涨，归并数据结束后，磁盘容量会即时下降。
- 归并数据操作本身会占用少量CPU资源，因此可能会出现轻微的CPU毛刺现象。
如果发现磁盘和CPU占用持续过高，您可以[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)申请，完成工单提交。
#### DDS 4.2及其以上版本是否支持定制化切换存储引擎？
暂无支持计划，如有变动请关注最新服务公告。
