随着近年来公有云技术及云基础设施的发展,越来越多的企业转为使用公有云来托管自己的服务。云数据库因为数据可靠性、资源弹性、运维便捷行,云上数据库服务也正成为企业数据管理的较好的选择。
本文以叮咚买菜自建MongoDB数据库整体迁移上腾讯云MongoDB为背景,分享叮咚买菜上云过程中的遇到的疑难问题及对应的性能优化解决方法等,主要包括以下分享内容:
-
云上MongoDB版本选型
-
安全上云及切换方案
-
叮咚买菜业务侧性能优化
-
上云遇到的疑难问题及解决方法
-
自建上云收益
1.叮咚买菜自建MongoDB上云背景
叮咚买菜业务以生鲜即时配送为核心,兼备新零售电商和生鲜供应链的特点,对高并发和数据一致性有硬性要求。在快速扩张的过程中,很多服务技术选型以MongoDB作为其主要数据存储。相比其他非即时业务场景,叮咚买菜对数据库访问时延、稳定性、数据一致性、数据安全性也有更苛刻的要求。
借助腾讯云MongoDB产品完善的自动化运维、数据安全备份回档、云弹性等能力,可以快速补齐叮咚买菜的核心MongoDB数据库基础技术能力,确保数据团队可以游刃有余的支撑业务开发。
叮咚数据团队基于自建成本、物理资源不足等原因,经过综合评估,决定把MongoDB数据迁移到腾讯云MongoDB上。
2.云上版本推荐及切换方案
业务正式开始迁移前,结合叮咚DBA和业务同学了解具体场景、MongoDB集群部署方式、业务MongoDB用法、内核版本、客户端版本、客户端driver类型等。提前了解到用户第一手信息:
-
自建MongoDB版本较低
-
客户端driver主要包括java和PHP
-
集群部署都带tag
-
集群存在较频繁的抖动问题
2.1. 腾讯云MongoDB内核版本推荐
叮咚自建MongoDB因历史原因一致保持在官方MongoDB-3.2版本,在一些场景存在性能瓶颈,例如用户主从读写分离时候会遇到读超时等问题。考虑到用户对性能要求较高,同时结合以下技术点,最终推荐用户使用腾讯云MongoDB-4.0版本,主要原因如下:
-
非阻塞从节点读(叮咚买菜遇到的低版本主要问题)
MongoDB-4.x开始,引入了非阻塞的从节点读(Non-Blocking Secondary Reads),彻底解决了3.x版本从节点批量重放oplog时候加全局ParallelBatchWriterMode类型MODE_X锁引起的读从节点读阻塞问题。
-
存储引擎优化(低版本的主要问题)
相比3.2版本,4.0对存储引擎做了很多优化,例如cache脏数据淘汰、锁粒度、更全的引擎参数调整支持等,极大的解决了低版本后台加索引、大流量读写等引起的客户端访问阻塞问题。
-
更好的写性能
相比3.2版本,除了上面提到的非阻塞从节点读引起的读性能提升外,在写性能方面4.0也更有优势。
-
更多有用新功能
经过几个大版本迭代,4.0版本相比3.2新增了非常多有用功能,例如Retryable Writes(可重试写)、Change Streams(变更流操作)、Tunable Consistency(更强的可调一致性)、Schema Validation(模式检查)、安全功能增强、事务支持、更丰富的操作类型等。
-
分片模式集群扩容balance效率更高
4.0版本相比3.2版本,增加分片扩容后的数据迁移采用更好的并发迁移策略,扩容数据迁移速率更高。
-
为何不选择更高的MongoDB版本
MongoDB版本越高功能越多,例如更高版本支持分布式事务、多字段hash片建支持等。由于叮咚主要是副本集集群,并且对这些新功能需求不强烈,同时综合集群稳定性考虑,最终选择4.0版本。
-
客户端driver版本兼容性,减少用户客户端改造成本
由于内核版本较低,如果升级到高版本,首先需要考虑对应客户端driver版本是否兼容低版本driver。如果客户端版本和内核不兼容,则需要进行driver升级甚至代码改造,因此客户端driver兼容性也是MongoDB内核版本选择的一个关键指标。叮咚技术团队经过验证,确认客户端版本完全兼容4.0内核,代码无需任何改造。
常用客户端driver与MongoDB内核版本兼容性详见:
Driver类型 |
官方兼容性说明 |
Java |
|
golang |
|
php |
|
其他 |
2.2. 安全上云迁移方案
叮咚自建MongoDB集群包含部分重要数据,务必保证迁移的数据一致性。常用通用迁移方案如下:
-
通用迁移方案