58同城从MongoDB到MySQL迁移之路

Slides:



Advertisements
Similar presentations
护理部教学管理 南医大二附院 张淑芬. 护理部主要工作:  培训  质量  教学科研 临床教学的秘诀 What – 需要的、喜欢的 Who – 教师的角色 – 学生的程度、学习方式 How – 教学方法.
Advertisements

何仕仁 主任. 國立彰化高中數理資優班 柯承翰、柯宗賢、曾品祥 國立彰化高中數理實驗班 柯宗逸、辛百弘 國立彰化女中數理資優班 姚彤錦 國立彰化女中語文資優班 陳思穎 國立彰化女中數理實驗班 姚曉蓉.
我的心靈有氧體操 閱讀 ~ 分享人:陳秋媛 日期: 99/10/22 銘傳國中九十九學年度上學期閱讀研習.
口試準備及口語表達技巧 民國 98 年 2 月 26 日 12:00pm 國立三重高中 陸芳瑜老師 1.
新闻写作基础知识 一. 新闻导语 二.新闻主体 三.新闻结构 四.角度选择.
中三選科— 文科.
分布式系统 Distributed Systems 第 13 讲 NoSQL Lecture 13 NoSQL
Amazon 云计算 AWS (三) 云计算 (第三版) 第 3 章 CLOUD COMPUTING Third Edition
對於學習不力學生的學習輔導經驗分享 張其清 新北市立新北高工 主任輔導教師.
第三章及第四章資產負債表的重點整理 取材自1.課本 2.鄭丁旺中會第九版 3.營業員題庫重點.
新聞標題原理與製作 國立台北大學 中文系 老師:簡陳中
国家自然科学基金项目申请 经验交流与心得体会
高考主题讲座 高考语文 董 腾.
如何幫助兒童情緒管理- 一般兒童及情緒障礙兒童
簡報大綱 臺北健全房市策略簡介 臺北房市交易量大哉問 臺北房市成交價大彙集 臺北市交易違規大現形 預售屋契約預審制推行
Mico的架构之旅 魏佳 Co-Founder & Mico Inc..
厦门大学数据库实验室 刘颖杰 2014年11月15日 实习总结报告 厦门大学数据库实验室 刘颖杰 2014年11月15日.
双十一数据库核心技术 淘宝网 李圣陶(刘昆).
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
大家好!.
网上疯传的一条微博: 早上。买两根地沟油油条。切个苏丹红咸蛋。冲杯三聚氢氨奶。吃完开锦湖轮胎的车去上班。
心理健康教育 高职校学生心里健康教育.
MongoDB技术交流 主讲:刘天斯.
穆公(朱金清 微博:淘穆公 阿里HBase业务设计实践 穆公(朱金清 微博:淘穆公
2013华东数据库技术大会 人人网的SNS数据库架构与设计艺术 周彦伟
OceanBase 0.4:从API到SQL 日照
(讲座幻灯课件请在网上下载,让我们一起思考!)
2013华东数据库技术大会 MySQL5.6版InnoDB引擎深入剖析 演讲嘉宾:何登成
12年國教前哨站 談適性輔導及免試入學 12年國教前哨站 談適性輔導及免試入學 主講人:龍門國中王意蘭 校長 輔導主任 潘姿伶.
常优
11.3 国产大数据库技术 阿里巴巴OceanBase 云创存储数据立方(DataCube)
(讲座幻灯课件请在网上下载,让我们一起思考!)
加强学生党性修养 人文科学系第一学生党支部 朱青玲 绍兴文理学院元培学院学生入党积极分子党课
Profibus Training Course
MySQL主从同步
(讲座幻灯课件请在网上下载,让我们一起思考!)
第8章 机床操作 主讲:臧红彬 博士.
欢迎再次走进 思想政治的课堂.
从2008年度时尚先生看我们的时代精神方向.
學習行為觀察與評估 講 師:陳怡華.
第七單元 大眾運輸好方便 凡事小心才安全.
罗湖区第二届智慧杯中学政治学科小课题研究
第2章 数据定义功能 创建表 在关系型数据模型中,表(Table)是最基本的数据结构。
任务2: 通报的写作.
离职流程精细化标准推进材料 人事行政处.
Chapter 13 輸入/輸出系統 (I/O Systems)
服務聯網地政雲.
新聞報導 一、什麼是新聞? 1、狗咬人不是新聞,人咬狗才是新聞 2、大眾關切的事 3、讀者有興趣知道的事 4、接近性.
NoSQL分布式数据库.
Alibaba 数据库高可用架构 Alibaba
第 13 章 DNS 著作權所有 © 旗標出版股份有限公司.
面向高能所信息化系统的高可用数据库服务 王丽 计算中心 中科院高能所 第十八届全国科学计算与信息化会议.
淘宝核心系统数据库组 余锋 利用新硬件提升数据库性能 淘宝核心系统数据库组 余锋
Microsoft SQL Server 2000 李金双.
HBase简介与实践分享 剑英.
Proware Technology Corp.
Spring & mongodb java实战mongodb 曹巍 2013年9月22日.
使用ADO.NET访问数据 数据库连接 C#程序设计课程组.
An Introduction to Cloud RDBMS
Redis 客户端和工具集 潘海龙 平安健康互联网
食記書寫教學 授課教師: 何素月 師 授課TA: 四語四甲 楊育瑄.
MySQL开发规范 DB组-张浩.
指導老師:葉淳媛老師 組 員:施金翰 廖仁輝 李柏蔚 黃威耀 邱哲偉 張育彬 報告日期:100年12月6日
性能的秘诀 chrome插件支持推送.
第八單元 清晨摸黑騎鐵馬 反光配件要加碼.
國立清華大學台灣研究 教師在職進修碩士學位班 陳韻如 繪圖者:趙祐瑜.
新地義工Team力量 新地致富兒童成長嚮導計劃
教育部特殊教育通報網 學生異動、接收操作說明.
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
社会的角度: 自然的角度 艺术的角度 出卖肉体的妓女 ——是“美”还是“丑”? 风烛残年、浑身皱纹等 ——是“美”还是“丑”? 《欧米哀尔》,青铜, 罗丹 1885年,又名《老娼妓》 社会的角度: 出卖肉体的妓女 ——是“美”还是“丑”? 自然的角度 风烛残年、浑身皱纹等.
Presentation transcript:

58同城从MongoDB到MySQL迁移之路 孙玄 2015年11月04日

目录 MongoDB在58同城的架构设计与实践 针对业务场景我们在MongoDB中如何设计库和表 数据量增大和业务并发,我们遇到典型问题及其解决方案 我们为什么要迁移MongoDB? MongoDB到MySQL的无缝迁移架构设计及实践 迁移后MySQL架构相比于MongoDB架构线上情况对比

MongoDB在58同城的架构设计与实践 使用业务线 58帮帮 58交友 58招聘 58信息质量 58测试 …

MongoDB在58同城的架构设计与实践 Why? What? Scalable & High Availability Master-Slave Replic Set High-performace MMAP Persistent Cache 数据一致性 Rich Querying Full Index Support Auto-Sharding What? 事务性要求低 高访问量 垂直业务扩展

MongoDB在58同城的架构设计与实践 How? free schema Auto-sharding 内嵌文档 自动生成_id … ALL Schema 如何应对? 减少字段名 数据存储压缩 Auto-sharding 库级sharding Collection sharding 手动sharding(切分大文档) 内嵌文档 自然、高效 更多重复数据、反规范化 RDBMS表拆分 类RDBMS处理 字段名尽可能短小,上层做映射 自动生成_id 默认有(12个字节) 存储空间大 业务层客户端生成 减少MongoDB服务端开销 …

58同城MongoDB使用实践 MongoDB部署 Replica Set + Sharding Shard Server (Replica Set)(n) Config Server(n) Route Server(n) Arbiter Server (n) 增加Shard Server RS内部增减 读写分离 故障转移 库级sharding(move primary) 表级手动sharding auto-sharding(指定时间段凌晨)

针对业务场景我们在MongoDB中如何设计库和表 Auto-Sharding is not that Reliable Why? Sharding key 单一key分片不均衡 复合key性能消耗 Count值计算不准确 Chunk移动过程,计算可能偏大 Balancer的稳定性&智能性 Sharding发生的时间不确定性 指定Sharding迁移时间

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计库? 线上环境禁用Auto-Sharding 开启数据级别分片 db.runCommand({“enablesharding”: “im”}); 特定库指定到某一固定分片上 db.runCommand({movePrimary:“im”, to: “sharding1”}); 保证数据无迁移稳定 避免Auto-Sharding带来的问题 完全可控 效果好

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计库? 库设计 对业务增长情况要要求 目前是什么量级 半年~一年是什么量级 库分片 Sharding分片数量 容量规划的关键原则 Memory > Index + Hot Data 索引+热数据要全部加载到内存(MMAP) MongoDB的高性能

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计库? 如何设计频繁更新删除记录的collection MongoDB的数据库是按文件来存储的 例如:db1下的所有collection都放在一组文件内db1.0,db1.1,db1.2,db1.3… 将频繁更新删除的表放在一个独立的数据库下,将会减少碎片,并提高性能 单库单表绝对不是最好的选择 原因有三: 表越多,映射文件越多,从MongoDB的内存管理方式来看,浪费越多 同理,表越多,回写和读取的时候,无法合并IO资源,大量的随机IO对传统硬盘是致命的 单表数据量大,索引占用高,更新和读取速度慢 Local库 Local库主要存放oplog,oplog同样是要消耗内存的 选择一个合适的oplog值,很重要 高插入高更新,并带有延时从库的副本集需要一个较大的oplog值(比如20G) 如果没有延时从库,则可以适当放小oplog值

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表? RDBMS与MongoDB 数据库、表/集合、行/文档 三范式与嵌套 举例“人”描述 RDBMS(People 、Address) MongoDB(People)

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表? 一对一 IM用户信息表 用户uid、用户登录名、用户昵称、用户签名 类RDBMS设计 一张用户信息表 {uid:XX, loginname:XX, nickname:XX, sign:XX} uid实际上为_id 主键

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表? 一对多 用户在线消息表 一个人可以收很多条消息 典型的一对多 如何设计 类RDBMS {uid,msg,msg_content} 123, 1, 你好 123,2,在吗 MongoDB嵌套 {uid:XX, msg:{[{msgid:1,msg_content:你好},{msgid:2, msg_content:在吗}]}} 嵌套更自然、更新不方便、单条16MB的限制 RDBMS遵循范式、查询条件更灵活、扩展性高

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表? 多对多 Team表&User表 一个Team中有多个User 一个User也可能属于多个Team 典型的多对多关系 如何设计 类RDBMS(三张表) Team表 {teamid, teamname, ……} User表 {userid,username,……} Relation表 {refid, userid, teamid}

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表? 多对多 Team表&User表 一个Team中有多个User 一个User也可能属于多个Team 典型的多对多关系 如何设计 MongoDB嵌套(2个集合) Team表 {teamid,teamname, teammates:{[userid, userid, ……]} User表 {useid,usename, teams:{[teamid, teamid,……]}} {useid,usename} 每次通过Team表中的teammates反查询得到teamid Teammates需要建立索引

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表?  单表数据量大如何Sharding? Collection Sharding 手动Sharding 如何手动Sharding 单表千万量级 单ID查询key水平拆分表 用户信息表 {uid, loginname, sign, ……} 按照uid水平拆分 uid%64 按照uid的查询 可控、可靠 避免了Auto-Sharding带来的不稳定因素

针对业务场景我们在MongoDB中如何设计库和表 我们如何设计表?  单表数据量大如何Sharding? 混合ID查询 商品表 {uid, infoid, info,……} infoid包含uid的信息(infoid最后8个bit,uid的最后8个bit) infoid水平拆分 infoid%64 按照uid的查询 按照infoid的查询

数据量增大和业务并发,遇到的问题及其解决方案 大量删除数据问题及其解决方案 背景 IM离线消息集合结构 字段: msgid, fromuid, touid, msgcontent, timestamp, flag 其中touid为索引 其中flag表示离线消息是否已读取,0未读,1读取 删除已经读取的离线消息 db.collection.remove({“flag” : 1}}; 命令非常简单 看似很容易就搞定了 5kw的数据条数 200G的存储空间

数据量增大和业务并发,遇到的问题及其解决方案 大量删除数据问题及其解决方案 遇到问题 晚上10点后部署删除 早上7点还没删除完毕 断续有报警 从库延迟大 QPS/TPS很低 业务无法响应 分析原因 db.collection.remove({“flag” : 1}}; flag不是索引字段 全部扫描 删除速度很慢 冷数据和热数据swap,造成内存中全是冷数据,服务能力急剧下降

数据量增大和业务并发,遇到的问题及其解决方案 大量删除数据问题及其解决方案 如何解决 紧急方案 找到正在执行的op kill opid 长期删除 业务层优化 逻辑删除--》物理删除 离线删除优化 每晚定时从库导出要删除的数据 通过脚本按照objectid的方式进行删除 删除速度可以控制 避免对线上服务影响

MongoDB遇到问题及其解决方案 大量数据空洞问题及其解决方案 遇到问题 大量删除数据,MongoDB存在大量的数据空洞 这些空洞数据也同时会加载到内存 导致内存有效负荷低 数据不断在swap MongoDB数据库性能并没有明显提升 怎么办?

MongoDB遇到问题及其解决方案 db.yourCollection.runCommand(“compact”); 大量数据空洞问题及其解决方案 解决方案 MongoDB数据空间的分配是以DB为单位 不是以Collection为单位的 问题的关键是大量碎片无法利用 碎片整理、空洞合并收缩 怎么做? 方案一 Online Compress Compact命令 db.yourCollection.runCommand(“compact”); Collection级别压缩 去除Collectoin所在文件碎片 影响服务 压缩效果差,不推荐使用

MongoDB遇到问题及其解决方案 大量数据空洞问题及其解决方案 方案二 收缩数据库 把已有的空洞数据,remove掉,重新生成一份无空洞数据 先预热从库 把预热的从库提升为主库 把之前主库的数据全部删除 重新同步 同步完成后,预热此库 把此库提升为主库 完全无碎片 收缩率100% 持续时间长、投入维护成本高 收缩过程单点存在一定风险 Replic Set

MongoDB遇到问题及其解决方案 大量数据空洞问题及其解决方案 收缩数据库 效果对比如下: 收缩前85G存储文件,收缩后34G存储文件,节省了51G存储空间,大大提升了性能

我们为什么要迁移MongoDB? 并发/存储量变大,MongoDB服务开始不稳定 高峰期 怎么办? Mongod CPU占用高 机器负载高 系统态 机器负载高 多次出现,对业务影响大 短期内没有很好的应对措施 Mongod进程本身 Mongos节点高并发挂掉 怎么办? 转型?! Mongob+SSD(成本高) MySQL+Cache(稳定、可靠) 业务应用场景可以满足

MongoDB到MySQL的无缝迁移架构设计及实践 数据类型 时效性数据 过期作废(1个月) 迁移简单 核心数据 永久有效 迁移复杂

MongoDB到MySQL的无缝迁移架构设计及实践 时效性数据迁移方案 时效性数据 过期作废(1个月) Write Read Mongo MySQL

MongoDB到MySQL的无缝迁移架构设计及实践 核心数据迁移方案 核心数据 永久有效 Write Read MySQL Mongo 消息队列 Mongo-S

迁移后MySQL架构相比于MongoDB架构线上情况对比 迁移后效果对比