网易首页 > 网易号 > 正文 申请入驻

如何将数亿Mysql数据无缝迁移到MongoDB?

0
分享至

一、问题

在好大夫在线内部,S3系统负责各业务方操作日志的集中存储、查询和管理。目前,该系统日均查询量数千万次,插入量数十万次。随着日志量的不断累积,主表已经达到数十亿,单表占用磁盘空间400G+。S3是业务早期就存在的系统,当时为了简单快速落地,使用了Mysql来存储,随着业务的不断增长,同时也要兼顾性能和可扩展性,到了必须要重新选型的时候了。

新项目命名为:LogStore。

二、目标

1、安全性

S3系统在设计之初,没有按业务系统考虑数据隔离,而是直接采用 key(系统 + 类名 + id) + 有限固定字段 + 序列化value 的方式进行存储,这种方式显然不便于后续集群拆分和管理。LogStore系统要在逻辑上进行数据区域划分,业务方在接入时要指定app进行必要的权限验证,以区分不同业务数据,进而再进行插入和查询操作。

2、通用性

S3主要提供一种3层结构,采用MySQL固定字段进行存储,这就不可避免的会造成字段空间的浪费。LogStore系统需要提供一种通用的日志存储格式,由业务方自行规定字段含义,并且保留一定程度的可查询维度。

3、高性能

S3系统的QPS在300+,单条数据最大1KB左右。LogStore系统要支持当前QPS 10倍以上的写入和读取速度。

4、可审计

要满足内部安全审计的要求,LogStore系统不提供对数据的更新,只允许数据的插入和查询。

5、易扩展

LogStore系统以及底层存储要满足可扩展特性,可以在线扩容,满足公司未来5年甚至更长时间的日志存储需求,并且要最大化节省磁盘空间。

三、方案选型

为了达成改造目标,本次调研了四种存储改造方案,各种方案对比如下

1、我们不合适—分库分表

分库分表主要分为应用层依赖类中间件和代理中间件,无论哪种均需要修改现有PHP和Java框架,同时对DBA管理数据也带来一定的操作困难。为了降低架构复杂度,架构团队否定了引入DB中间件的方案,还是要求运维简单、成本低的方案。

2、我们不合适—TiDB

TiDB也曾一度进入了我们重点调研对象,只是由于目前公司的DB生态主要还是在MGR、MongoDB、MySQL上,在可预见的需求中,也没有能充分发挥TiDB的场景,所以就暂时搁置了。

3、我们不合适—ElasticSearch

ELK-stack提供的套件确实让ES很有吸引力,公司用ES集群也有较长时间了。ES优势在于检索和数据分析领域,也正是因为其检索和分析的功能的强大,无论写入、查询和存储成本都比较高,在日志处理的这个场景下,性价比略低,所以也被pass了。

4、适合的选择—MongoDB

业务操作日志读多写少,很适合文档型数据库MongoDB的特点。同时,MongoDB在业界得到了广泛的使用,公司也有很多业务在使用,在MongoDB上积累了一定的运维经验,最终决定选择MongoDB作为新日志系统存储方案。

四、性能测试

为了验证MongoDB的性能能否达到要求,我们搭建了MongoDB集群,机器配置、架构图和测试结果如下:

1、机器配置

MongoDB集群3台机器配置如下:

CPU

内存

硬盘

OS

Mongo版本

8核

15G

MongoDB 内存分配单节点8G

100G

CentOS release 6.6 (Final)

3.2.17

2、架构图

3、测试场景

本次MongoDB测试采用YCSB(https://github.com/brianfrankcooper/YCSB)性能测试工具,ycsb的workloads目录下保存了6种不同的workload类型,代表了不同的压测负载类型,本次我们只用到了其中5种,具体场景和测试结果如下。

workloada

100%插入,用来加载测试数据

workloadb

读多写少,90%读,10%更新。

workloadc

读多写少,100%读。

workloadd

读多写少,90%读,10%插入。

workloadf

混合读写,50%读,25%插入、25%更新

(1) 插入平均文档大小为5K,数据量为100万,并发100,数据量总共5.265G 左右,执行的时间以及磁盘压力

结论:插入100w数据,总耗时219s,平均 insert 耗时21.8ms,吞吐量 4568/s

(2) 测试 90%读,10%更新,并发100 的场景

结论:总耗时236s,read 平均耗时23.6ms, update 平均耗时23.56ms,吞吐量达到 4225/s

(3) 测试 读多写少,100%读 ,并发100 场景

结论:总耗时123s,平均read 耗时12.3ms,吞吐量达到8090/s

(4) 测试读多写少,90%读,10%插入,并发100 的场景

结论:总耗时220s,read 平均耗时 21.9ms,insert 平均耗时21.9ms,吞吐量达到4541/s

(5) 测试 混合读写,50%读,25%插入、25%更新,并发100 的场景

结论:总耗时267s,read 平均耗时26.7ms,update 平均耗时26.7ms,insert 平均耗时26.6ms ,吞吐量 为3739/s

4、测试结果对比

可以看出mongodb适合读多写少的时候,性能最好,读写速率能满足生产需求。

五、无缝迁移实践

为了保障业务的无缝迁移,也为了最大化降低业务研发同学的投入成本,我们决定采用分阶段切换的方案。

第一步:系统应用层改造+LogStore系统搭建

首先,在S3系统中内置读开关和写开关,可将读写流量分别引入到LogStore系统中,而新应用的接入可以直接调用LogStore系统,此时结构示意图如下

第二步:增量数据同步

为了让S3系统和LogStore系统中新增数据达到一致,在底层数据库采用Maxwell订阅MySQL Binlog的方式同步到MongoDB中,示意图如下:

Maxwell(http://maxwells-daemon.io)实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Logstore系统消费Kafka中的数据写入到mongodb数据库中。

至此,对于业务方现有日志类型,新增数据在底层达到双写目的,S3系统和LogStore系统存储两份数据;如果业务方新增日志类型,则直接调用LogStore系统接口即可。接下来,我们将对已有日志类型老数据进行迁移。

第三步:存量数据迁移

此次迁移S3老数据采用php定时任务脚本(多个)查询数据,将数据投递到RabbitMQ队列中,LogStore系统从RabbitMQ队列拉取消息进行消费存储到MongoDB中,示意图如下

(1) 由于原mysql表中id为varchar类型并且非主键索引,只能利用ctime索引分批次进行查询,数据密集处进行chunk投递到mq队列中。

(2) 数据无法一天就迁移完,迁移过程中可能存在中断的情况。脚本采用定时任务每天执行20h, 在上线时间停止执行,同时将停止时间记录到Redis中。

(3) 由于需要迁移数据量较大,在mq和消费者能承受的情况下,尽可能多地增加脚本数量,缩短导数据的时间。

(4) 脚本执行期间,观察业务延时情况和MySQL监控情况,发现有影响立即进行调整,以保障不影响正常业务。

第四步:校验数据

老数据导入完成后,下面就要对老数据进行校验,校验从两个方面进行: 数据量和数据完整性。

数据量:基于S3系统老数据的id, 查询在MongoDB中是否存在,如果不存在则进行补偿重发。

数据完整性:对于S3和MongoDB中的数据按照相同规则进行md5校验,校验不通过则进行补偿重发。

第五步:数据双写

将应用层预制的写开关打开,将流量导入到LogStore中,此时mysql的流量并没有停掉,继续执行binlog同步。结构如下:

从图中可以看到,从S3调用点的写接口的流量都写入到MongoDB数据库backuplogs集合中,为什么不直接写入到logs表中呢?留个小悬念,在后文中有解释。

第六步:灰度切换S3读到LogStore系统

上文我们提到,对于S3系统应用层读写调用点均分别内置了切换开关,打开应用层读开关,所有的读操作全部走LogStore, 切换后示意图如下所示:

第七步:灰度切换写接口到LogStore系统

打开应用层写开关,所有写操作会通过mq异步写到MongoDB中,那如何证明应用层写调用点修改完全了呢?

上文中双写数据一份到logs表中,一份到backuplogs表中,通过Maxwell的Binlog同步的数据肯定是最全的,数据量上按理来说 count( logs) >= count(backuplogs), 如果两个集合一段时间内的数据增量相同,则证明写调用点修改完全,可以去掉双写,只保留LogStore这条线,反之需要检查修改再次验证。切换写完成后,示意图如下:

六、MongoDB与故障演练

故障演练能够检测服务是否真正高可用,及时发现系统薄弱的环节,提前准备好预案减少故障恢复时间。为了验证MongoDB是否真正高可用,我们在线下搭建了MongoDB集群:

同时,我们编写脚本模拟用户MongoDB数据插入和读取,基于好大夫在线自研故障演练平台,对机器进行故障注入,查看各种故障对用户的影响。故障演练内容CPU、内存、磁盘、网络和进程Kill等操作,详情如下图所示:

实验结果:

1、CPU、磁盘填充和磁盘负载对MongoDB集群影响较小。

2、内存满载可能会发生系统OOM,导致MongoDB进程被操作系统Kill,由于MongoDB存在数据副本和自动主从切换,对用户影响较小。

3、网络抖动、延迟和丢包会导致mongos连接服务器时间变长,客户端卡顿的现象发生,可通过网络监控的手段监测。

4、分别主动Kill掉MongoDB的主节点、从节点、仲裁节点、mongos、config节点,对整个集群影响较小。

整体而言,MongoDB存在副本和自动主从切换,客户端存在自动检测重连机制,单个机器发生故障时对整体集群可用性影响较小。同时,可增加对单机器的资源进行监控,达到阈值进行报警,减小故障发现和恢复时间。

七、总结

1、MongoDB的使用

  1. MongoDB数据写入可能各个分片不均匀,此时可以开启块均衡策略;由于均衡器会增加系统负载,最好选择在业务量较小的时候进行;

  2. 合理选择分片键和建立索引,会使你的查询速度更快,这个要具体场景具体分析。

2、迁移数据

  1. 必须保留唯一标识数据的字段,最好是主键id,方便校验数据;

  2. 一定要考虑多进程,脚本要自动化,缩短迁移时间和减小人工介入;

  3. 迁移过程中,要时刻关注数据库、中间件及应用相关指标,防止导出导入数据影响正常业务;

  4. 要在同样配置的环境下充分演练,提前制定数据比对测试用例,以防止数据丢失;

  5. 每一步线上操作(如切换读写),都要有对应的回滚计划,最大限度降低对业务的影响;

【作者简介】

孙文华:好大夫在线系统开发工程师,专注于监控系统、缓存系统和公共基础系统开发,对容器化和文件存储也有涉猎和研究。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
危机升级!中国经济保卫战打响!存款大流失?去了不该去的地方?

危机升级!中国经济保卫战打响!存款大流失?去了不该去的地方?

财说得明白
2024-07-01 18:10:08
卢沙野大使的话,为何会让蔡正元破防?失败的人生经历是主因

卢沙野大使的话,为何会让蔡正元破防?失败的人生经历是主因

蓝色海边
2024-07-02 04:38:51
长江武汉段近四年首次达到警戒水位

长江武汉段近四年首次达到警戒水位

财联社
2024-07-02 08:38:21
AI恐怖体操视频腿脚乱飞,LeCun:视频生成模型根本不懂物理

AI恐怖体操视频腿脚乱飞,LeCun:视频生成模型根本不懂物理

量子位
2024-07-01 14:59:02
事发上海虹桥站!知名博主爆料:短途被出租车拒载,直接锁车门加速走了?官方回应:处置

事发上海虹桥站!知名博主爆料:短途被出租车拒载,直接锁车门加速走了?官方回应:处置

上观新闻
2024-07-01 21:58:49
又暴雷!比恒大还多1.14万亿,15万投资者血本无归,进入破产清算

又暴雷!比恒大还多1.14万亿,15万投资者血本无归,进入破产清算

青橘罐头
2024-06-30 13:25:09
跟进张志杰事件:当地医院未明确死因 印羽协甩锅 张姐姐发声质疑

跟进张志杰事件:当地医院未明确死因 印羽协甩锅 张姐姐发声质疑

林小湜体育频道
2024-07-01 12:06:03
Chloe Faye,一张截图火爆全网,无数网友的心中女神

Chloe Faye,一张截图火爆全网,无数网友的心中女神

吃瓜党二号头目
2024-07-01 11:39:11
国外疯传!39岁C罗炸裂了:教科书式过人+颠球摆脱,对手上手拦截

国外疯传!39岁C罗炸裂了:教科书式过人+颠球摆脱,对手上手拦截

侧身凌空斩
2024-07-02 03:40:11
原来这些工作干了是可能会坐牢的!网友分享傻眼,找工作需谨慎啊

原来这些工作干了是可能会坐牢的!网友分享傻眼,找工作需谨慎啊

热闹的河马
2024-06-29 15:06:14
终于明白为什么买车不要发朋友圈了!网友真实分享,果然人心难测

终于明白为什么买车不要发朋友圈了!网友真实分享,果然人心难测

热闹的河马
2024-06-29 16:53:24
停播13年后,《曲苑杂坛》仍被热议:主持人汪文华到底得罪了谁?

停播13年后,《曲苑杂坛》仍被热议:主持人汪文华到底得罪了谁?

青眼财经
2024-06-30 14:53:05
克莱总结:勇士库汤追时代落幕没有对错 分手是尊重彼此更好选择

克莱总结:勇士库汤追时代落幕没有对错 分手是尊重彼此更好选择

醉卧浮生
2024-07-02 08:51:01
红星美凯龙财务负责人杨映武:厦门国资建发股份与红星美凯龙的协同效应正在显现

红星美凯龙财务负责人杨映武:厦门国资建发股份与红星美凯龙的协同效应正在显现

金融界
2024-07-01 14:45:36
组建三巨头!Woj:乔治四年2.12亿顶薪加盟76人!!

组建三巨头!Woj:乔治四年2.12亿顶薪加盟76人!!

直播吧
2024-07-01 15:38:10
中国女排够狠!完全不给蔡斌任何展示机会,宣布最新名单!

中国女排够狠!完全不给蔡斌任何展示机会,宣布最新名单!

娱妮啵啵啊
2024-07-01 23:00:02
Windhorst:我认为德罗赞也在詹姆斯的降薪列表中 还有另外一人

Windhorst:我认为德罗赞也在詹姆斯的降薪列表中 还有另外一人

直播吧
2024-07-02 07:49:12
点球大战3-0!门神3连扑 葡萄牙晋级8强 C罗错失绝杀+加时丢点

点球大战3-0!门神3连扑 葡萄牙晋级8强 C罗错失绝杀+加时丢点

狍子歪解体坛
2024-07-02 05:43:25
人气爆棚!贝林厄姆获多位女网红青睐 英国网红:愿为其做任何事

人气爆棚!贝林厄姆获多位女网红青睐 英国网红:愿为其做任何事

Emily说个球
2024-07-01 17:29:13
眼里只有钱?归化国脚无故缺席中超,年底或离队,球迷:忘恩负义

眼里只有钱?归化国脚无故缺席中超,年底或离队,球迷:忘恩负义

尘语者
2024-07-01 23:27:31
2024-07-02 09:10:45
ITPUB学院
ITPUB学院
分享技术干货,了解最新动态
797文章数 627关注度
往期回顾 全部

科技要闻

“5年0息”!特斯拉变相降价

头条要闻

勒庞:法国人民毫不含糊 第二轮投票将是决定性的

头条要闻

勒庞:法国人民毫不含糊 第二轮投票将是决定性的

体育要闻

葡萄牙的神!他拯救C罗拯救葡萄牙

娱乐要闻

今年内娱最大的闹剧,该收场了

财经要闻

酒鬼酒甜蜜素风波后再迎人事变动

汽车要闻

奥迪Q6 e-tron Sportback官图曝光

态度原创

亲子
房产
本地
手机
公开课

亲子要闻

小孩哥总是回头看后面的美女姐姐,看完后又害羞地转过头

房产要闻

官宣去库存!海南这一区域商办产品,已无限接近住宅!

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

手机要闻

最好的手机屏幕!曝iPhone 16 Pro首发三星M14 OLED面板

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版