知识卡片
文件级复制迁移相比逐条写入迁移的效率优势:LevelDB vs MongoDB的选型启示
内容
Bada在数据迁移和扩容速度上明显优于同为文档/KV存储的MongoDB,根本原因不在于运维手段的差异,而在于底层存储引擎的数据组织方式不同:MongoDB扩容时需要把数据一条一条地写入新节点,迁移速度受限于逐条写入的吞吐;Bada底层基于LevelDB做定制开发,分片的数据在磁盘上就是完整的文件,迁移一个分片时可以直接对底层数据文件做拷贝(甚至简单到用scp就能完成),迁移速度只取决于网络带宽这一个变量,而不是逐条写入的处理速度。这个差异也解释了为什么Bada选型时倾向于把分片数量预先设置得足够大(默认1000以上)——分片粒度越细,每次迁移需要搬运的单个文件就越小,扩容时可选择迁移的最小单元也就越灵活。这个对比给出的启示是:评估一个存储系统的”扩容/迁移是否轻量”,不能只看它有没有自动化的运维工具,更要往下追问它的存储引擎本身是不是把数据组织成了可以整体搬迁的物理单元(如独立文件)——如果底层数据结构决定了搬迁必须靠逐条读写才能完成,运维层面无论怎么优化,迁移速度都会被这个底层限制卡住上限;反之如果数据天然就是文件粒度的,迁移就能从”应用层操作”降级成”文件系统层操作”,速度提升是数量级的。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.5 360分布式存储系统Bada的架构设计和应用"节,"2.5.7 FAQ"及"2.5.8 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter2_5_8.xhtml、Chapter2_5_9.xhtml)
- 结论依据:原文说明"MongoDB的扩容非常不方便,扩容需要很长的时间,因为MongoDB扩容的过程是将一条一条的数据写入……当需要扩容的时候,只要将某一个分片下面的数据文件拷贝过去即可",以及"迁移是直接对LevelDB的文件进行复制,这个时候性能取决于网络的开销。这也是我们比mongo扩容快的地方",共同支撑本卡片结论。
- 原始内容:我们开发的时候考虑过这些问题,因此Bada使用的是LevelDB,当需要扩容的时候,只要将某一个分片下面的数据文件拷贝过去即可……迁移是直接对LevelDB的文件进行复制,这个时候性能取决于网络的开销。这也是我们比mongo扩容快的地方,mongo在扩容的时候需要一条一条地写数据。