说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

不要总是依赖机器 MongoDB扩展彰显分片功夫

HTML文档下载 WORD文档下载 PDF文档下载
相信使用MongoDB的你一定着迷于它横向扩展带来的强大集群性能,然而你有注意到使用Auto-sharding机制带来的性能损耗吗。Jbrandstettercs在comSysto Blog上对使用Auto-sharding进行分片带来的性能损耗进行了详细的分析并提出了优化方案,CSDN进行编译整理。

Johannes Brandstettercs目前是omSysto GmbH开发运营总监,曾担任1&1 IT经理;致力于MongoDB、Hadoop、AWS上的项目研究。

纵观最领先的应用程序建模和基础设施最佳实现的设计,很容易的发现一个问题:如果需要性能的快速增长并适应从0到千万请求的自由缩放,只有一条路可走 —— 横向扩展(Scale Out)!

扩展通常是描述给系统添加更多资源的方法。需要从两个方面区别:

纵向扩展(Scale vertically/up)

纵向扩展意味着给系统中单个节点增加资源,代表性的添加有单计算机的CPU或者内存提升。

横向扩展(Scale horizontally/out)

横向扩展意味着增加系统中节点的数目,比如说给一个分布式软件应用程序中添加计算机。举个简单的例子,将Web服务器系统中的服务器从1个提升到3个。

使用MongoDB,你可以根据你的需求从两个方面去扩展:专注读操作或是写操作的提升。

10gen告诉了我们一些扩展选项:

“自带横向扩展能力,MongoDB允许用户快速的建立和提高他们的应用程序。通过自动分片,你可以轻松的将数据分配到不同的节点上。副本集提供高可靠性,跨数据中心实现节点故障自动转移和恢复。”

听起来不错,事实上呢?现在开始着手把2400万条数据导入由6个节点组成的MongoDB集群,这里使用的是自动分片:

从上图看结果并不是很好,呈现出很不均匀的写入性能。假专注于单个节点的性能,情况比上面看起来更加的糟糕:

分别点击查看大图

这里不仅要看到所有节点上不均匀的写入速度,还要看到节点间每秒写入操作的巨大差别。有一瞬间Node2达到 4000 insert/s的,而那个时刻node5只有 740 insert/s !

为什么会这样?我们使用mongoimport监视了整个导入过程发现:开始的一段时间内一切运行的很好,我们的集群也提供了一个很好的吞吐量;但是随着时间的推移,速度在逐渐的减缓。而通过mongostat,我们不难发现:有时候几秒内许多节点并没有分配到任何数据。

想了解原因,我们必须要看一下MongoDB的分片机制。这里不得不看一下3个基本组件:

1. MongoDB Sharding Router(mongos)

所有通往集群的连接都由mongos选择,分片对应用层来说是完全透明的 —— 通过Transparent Query Routing进行路由。

2. Mongo Config Server

决定元数据中某个部分该分配到哪个对应的节点上。

3. Mongo Shard Node

用来支撑数据的普通mongod进程。

那么要把数据储存到这样的集群中,你必须去做元数据查询来核对当前的数据该写到哪个节点上。然而即使每次写入前去决定目标节点会产生一定的开销,这里的性能损失也不该来的如此之大。

但是现实就是这么残酷!这里要提起的就是Mongo Config Server,也就是必须要告诉MongoDB哪个范围的数据需要被用来分片。这就是传说中的“shard key”!同样如果你在shard key上做了个错误的决定,将会引起一系列的麻烦。当然为了简洁明了,这里选择一个我们认为很适合我们数据类型的shard key。

那么MongoDB现在做的就是在内部把数据放入所谓的“chunk” —— 很像固定大小的data bucket。这样一来每个chunk中都包含了一定范围的数据并且只是一定容量的数据(默认64MB)。当我们把数据导入数据库,这些chunk将会被注入数据,一旦数据装满就会被MongoDB分割。这样一来必定会发生下面两种情况:

  • 新的元数据必须被写入配置好的服务器
  • Balancer必须考虑某个chunk是否要转到另一个节点上

现在我们就有必要关注一下第二点了!因为我们并没有告诉MongoDB任何shard key相关或者是怎么分布的,MongoDB在分片前则必须进行最好的预估然后尝试将数据平均的分配到分片中。它通过在任何给定时间内保持所有节点上chunk数量相同这一策略来保障数据的平均分配。在MongoDB 2.2中,新迁移阈值被引进并成功的将平衡集群带来的影响降到最低。然而Mongo同样不知道shard key的范围和分布,那么就很可能发生热点区域 —— 很大一部分的数据被写入了同一个分片,因此也只在同一个节点上。

既然我们知道了问题的所在,我们是否能够做点什么?

数据预分割

想做数据预分割必须对你将要导入的数据有充分的认识,所以取代让MongoDB完成chunk的选择你需要亲自动手。取决于你shard key的选择,你既可以使用一个脚本生成相关的命令(一个不错的用例)也可以使用MongoDB文档提供的方法。无论如何你都将完成对MongoDB chunk分配位置的告知:

  1. db.runCommand( { split : "mydb.mycollection" , middle : { shardkey : value } } ); 

当然你还可以强制MongoDB给chunk分配相应的节点。同样这取决于你的用例及应用程序对数据的读取方式。这里需要注意的是保留数据的局部性。

增加chunk大小

文档中有具体的chunk大小说明:

1. 小的chunk以频繁迁移为代价获取数据更均匀的分布,这样会给Query Routing Layer增加更多的开销。

2. 大的chunk会显著的减少迁移,不管是从网络设计还是从内部Query Routing Layer开销上都会带来收益。当然这些收益是以潜在的数据分布不均为代价。

而为了能让MongoDB能运行的足够快,这里把chunk的大小提升为1GB。当然这是建立在对自己数据的了解上,所以务必让chunk的大小来的更有价值。

关闭Balancer

既然我们已经给chunk指定了具体节点,并且不希望在这过程中有新chunk的建立;我们可以使用以下的命令来关闭Balancer:

1.

  1. use config 

2.

  1. db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true ); 

选择正确的shard key

Shard key是节点分布的核心。详情点击这里获得shard key相关的建议。在MongoDB 2.4中还支持MongoDB自主选择哈希shard key的选项。

通过这些努力,导入情况如下:

上图为集群中一个节点上的速率。当然还是有一些缝隙,因为数据不是绝对均与的进入。但总的来这是一个很大的提升,整个集群上的导入速度达到每秒4608次插入;现在导入速度只受到节点间网络接口的限制。

总结

天下没有免费的午餐!想获得卓越的性能,就必须亲力亲为。

原文链接:Scaling MongoDB – Know your Sharding Kung Fu (编译/仲浩 王旭东/审校)

欢迎关注@CSDN云计算微博,了解更多云信息。

夜行、睡眠与健康:CES 2015十款酷炫的可穿戴产品 Java 9中新的货币API 唯“简”不破,Apple Watch App的设计之道 Google Glass从X labs“毕业”,更换项目负责人 不进化,则消亡——互联网时代企业管理的十项实践 RedMonk 2015年1月编程语言排行榜:进击的Swift! 微信开放JS SDK,这场web巨变意味着什么? 盘点一些iOS开发技巧:Swift和Objective-C 2014年,那些“颜值”爆表的UI动画 《近匠》爱加密:谁说iOS应用不需要保护? SwiftColorArt:开源易用的Swift图片类库 人气爆棚 干货满满 中国电信天翼开放平台开放日圆满落幕 必须Mark!43个优秀的Swift开源项目推荐 治拖延、疗懒癌!安利12款提高工作效率工具 把ES6带进Node社区 Io.js 1.0.0正式发布 Java 2014:10个最热门、最具争议性的话题 回顾:2014年最流行前端开发框架对比评测 实例讲解SQL注入攻击 调试大规模服务器集群的五大策略 .NET编译平台Rosly将迁移到Github Wasai虚拟现实头盔与体验馆发布:虚拟现实的线下经济 订票系统不再瘫痪 阿里云确认与12306合作 Apple前工程师Warren Moore:Swift中Metal使用初体验 手把手教学:详解Swift中的iOS设计模式 见微知著,那些触动人心的应用细节设计(一) 设计优秀API七大要诀 需求 细节 BI项目成功的五大要素 BI项目成功的五大要诀 最受程序员欢迎的公司榜单发布:2015 IT人才招聘趋势分析 Swift中的指针操作及使用 Android性能优化典范 急,在线等,英文作业等着交,就剩160分了全给了!(只能放100分,气死我了) 请问大虾:在那里可下载installshield Professional 7及其东方语言包 怎么样把exe的C#项目文件转换成dll的呀?? 今天Broland来我们公司查盗版软件了,散糞 一个女孩问"你帅吗?" , 你想如何说? 向大家请教一个简单的问题,见笑了 卖书! 请高手来看这里的错误!! 怎么判断窗口移出屏幕了? 我树型的事件脚本不执行?还有几个其它问题。请大家帮帮忙! 我们部门原创的顺口溜 如何判断处理事件和委托 在线等待:寻Delphi7中调用Excel表格打印的源程序 大家好,在线调查 原来asp中的recordset 在.net中还能用吗 “参数不足,期待是1”是什么意思? 如何读取一个文本文件的最后一行 将一表中的所有A列和B列的值(varchar型)合并后,添加到C列中。这个SQL语句怎么写? 请教用公式urlopen如何在“另一窗口“打开一页面。 win2000下如何给程序指定program ID 急,急,在VC中如何.sql文件(ORACLE) 我的DW不能启动了,问题解决马上给分100! 高手请进,在线等待! 下了一个手机游戏(JAR、JAD),想在计算机上模拟运行一下,该怎么做? 使用 应用程序组装工具 创建.ear,创建.war 在WAS中安装出现错误 !!! 立即给分 怎样改变由 javaw 打开的*.jar文件的图标? 纯粹好奇~水园、昨天晚上发生了什么? 为什么修改httpd.conf后,APACHE服务不能启动? 想买两本书,请看过该书的朋友评价一下,特别是书里的代码是C#的还是VB.NET的? win2000注册表问题 什么时候需要定义过程??? 兄弟们,替我出口气 800*600分辨率下,toolbar显示不完整,请问该如何解决?(100分) 我想在数据窗口中显示年龄信息,但是出错了!! 各位大侠,兄弟很急得问题,80分奉送 [ 新手 ] 请问几个关于时间的SQL语句 用ROUND函数,需要包含哪个头文件? 高手请进,在线等待!!! 怎么样用HTML代码实现在一个.htm文件中加载另一个.htm文件 ??? 哪位大哥有能解析ANS.1语言的东西? 比较大小的简单问题? 用Ras拨号过程中,如何取消拨号? 大家看看合适否? 怎样以逗号为标记分段读取内容? 求救:本地计算机无法启动 oracleserviceoradb 服务! java和.net你们好吗?保重VC。 如何把XML文件导到oracle数据库中? 变量初值问题,高手请进 求通过手机号码判断出手机入网地址(如上海,江苏等)的java接口 如何把htm文件移植到VB.NET中. 妈的找了几天广告交换的网站,怎么全是色情的,正常的网站就没有吗?你们的网站放不放这些东西 。 人的一生会打死多少只蚊子如题! 帮忙翻译“同时,请帮忙预订北京酒店三个标准间” 已知点P(a+1,3-x)点Q(2a,b+3)关于y轴对称,求代数式(a²+a)-(a²-b)的值.求过程. 已知a-3b=2a+b-15=1,则代数式a2 -4ab+b2 +3的值为__________ 早读课,老师让写一句激励人的话,写那句比较好? 嫦娥三号能不能遇到阿姆斯特朗当年插的美国国旗啊?一直想知道这是不是个阴谋 什么样的孩子让人头疼 思路清晰过程完整再给150分 Shall we go and visit the History Museum next Sunday?______A.Here you areB.Sorry,I can'tC.Yes ,pleaseD.Let me try 一道选择题26.7I don't care for fish,and Jack doesn't ______.A.tooB.alsoC.neitherD.eithet 给出三个整式a²,b²,2ab.任意选两个进行加法或减法运算,使所得的多项式能够因式分解,写出式子,和因式分解的过程. 联合国计划成立预警机构 防范小行星撞普京力压奥巴马获评福布斯年度最具影响美国加州一著名辣椒酱厂被指味道难闻遭美国最新汇率报告未将中国列为“汇率操日本解密文件称日本曾希望拥有核武器 奥巴马医改网站安全漏洞细节曝光 内测美国曾要求日本修宪 欲促日帮忙越战中方称人民币不存在明显低估 外汇市场中方严重关切美监听活动报道 要求美方46名中国与印度非法采金者在加纳被捕浙江实现县县电气化 镇村电气化比出名要趁早,“拍照吧少年”第2季手机山楂杯子蛋糕马鞍山昨晚遭遇世纪大堵车,场面太壮观苏米特拉-杜塔成为主题演讲嘉宾所有的爱情都是偏见,DoSnap#5给自己做理财规划,一点都不难黄金历史上从来都是很差的投资品简单说几个摄影笔记的功能,也许作为新炒作老庄股技巧 弱市获得利润的利“天河二号”成为最快超级电脑,真能彰《手机摄影拍摄与操作》开课通知!神魔争天草创婆罗仙禁变身永恒真灵虚空守护圣王第二门勇闯九置山嚣张狂战尸路漫漫暗黑与圣域之巅天佑太极青庐旅游大理古城天主教堂旅游祖山旅游西天目山旅游二滩水电站旅游莲花山圣水寺旅游绥中电厂海滨旅游武禹襄故居旅游基督教堂沙面堂旅游永宁古城旅游柳沟村旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘