eBay:使用MongoDB创建关键业务的多数据中心应用

作为全球前十的零售品牌,eBay的活跃用户有一亿七千多万,并拥有跨越全世界190个市场的10亿购物清单,这样的规模下,eBay绝对不允许出现宕机的情况。这也就是为什么公司会把依赖于MongoDB提供企业级平台标准以及面向用户的应用。

在今年的MongoDB World conference大会上,eBay的首席NoSQL DBA,Feng Qu,为大家展示了他以及他的团队开发的用来支持企业级MongoDB部署的一整套架构—弹性应用的实用设计模式。

Qu先生首先探讨了“可用性”这个概念在最近几年的变化。在过去,网址进行周期性的定时停服维护是正常的,但是,最近几年,随着如今服务的全球化,用户以及企业都不再接受这样的停服操作。除此之外,大部分组织机构把他们的服务部署在商业硬件平台而不是之前的Sun Solaris / Sparc 。商业硬件相对更加便宜,但是出现问题的频率也相对较高。这些因素都实质上影响着软件团队对可用性的看法。这也eBay要创建“弹性设计模式”的初衷,就是要创建最佳的数据库系统可以最大化平均失效时间(MTTF)同时最小化平均恢复时间(MTTR)。

开发人员创建应用的时候可以选择五种企业认可的数据库标准。除了MongoDB,还可以选择oracle和MySQL这样的关系型数据库以及另外两种nosql数据库系统。Qu先生的团队会为他们的选择提一些意见,保证所选的数据库系统可以支撑数据读取模式、用户压力等等。

eBay目前运行着3000多非关系型数据库实例,支撑着大量应用以及应用之间PB级别的数据传输。在过去,oracle是记录系统,非关系型数据库只维护一些临时数据,现在非关系型数据库的场景已经成熟,不仅拥有一致性、具体到点的备份以及及时恢复性,MongoDB在eBay中的有些场景中也可作为记录系统。

尽管eBay的非关系型数据库提供内置的故障弹性,他们也可以选择不同的设计权衡来影响应用的表现。DBA在选择时主要是考虑以下几个方面:可用性、一致性、持久性、可恢复性、伸缩性以及性能。例如,使用点对点的无主设计的nosql数据库在一个节点故障后必须启动数据修复和重新平衡的过程,这些过程的代价很大。重新平衡的进程会严重影响系统的吞吐量和延迟,客户端等待恢复的时候会造成连接堵塞,进而导致应用出现故障。为了避免这种情况,eBay在无主数据库的上层增加了一个应用层面的分片,这个方法最初是为oracle设计的。DBA使用这种方式可以把一个大的集群分解成一系列的子集群,把重建的负荷放在个别节点上,只影响个别查询操作。正是为了应对不同类型的数据库行为,eBay才建立的弹性设计模式。

Qu先生为我们展示了下图的MongoDB弹性设计模式

在这种设计模式下,MongoDB复制集的7个节点分布在eBay在美国的三个不同的数据中心。这种模式可以在主节点遇到故障时,数据库集群可以保持可用性。可以为MongoDB的复制集成员分配优先级,这个优先级可以决定主节点遇到故障后哪个次节点可以被推举为新的主节点。例如,可以设定在主节点故障后,位于DC1的节点可以优先被选举为主节点。只有DC1中多有的节点都出现故障,DC2中的成员才可以被选举为主节点,当然新的节点选举的依据是,从原来节点中同步到最新的数据的节点才是主节点。这种模式的一个延伸做法是使用MongoDB的“大多数写入关注”来保证跨数据中心的写入持久性。

MongoDB的标准设计模式是eBay的“高密集、高可用读取模式”的基础,此模式用于支撑eBay的产品目录模块。为了应对产品目录模块的压力,需要把MongoDB的复制集成员扩展到50个,为读取扩展性以及弹性提供了分布式数据架构。

eBay开发了“高性能读写模式”以支撑高密度的写入压力,这种模式是把MongoDB集群的分片服务器分布在美国不同数据中心。

同样,开发人员可以对这种模式具体的读写关注进行设置,调整系统持久性以及弹性以满足不同应用的需求。

Qu先生指出,随着MongoDB的功能的增强,MongoDB可以用来满足更多的应用需求:

l  MongoDB3.4中引入的zone sharding功能可以使eBay支撑那些对分布式以及持续写入可用性要求较高的应用。

l  即将在MongoDB3.6中发布的可重写操作,可以减少应用端的异常处理代码

如果想深入了解eBay的设计模式,可以参考Feng Qu在MongoDB大会上的分享。

易趣:使用MongoDB创建关键业务的多数据中心应用的更多相关文章

  1. 关于mongodb创建索引的一些经验总结(转)

    查看语句执行计划: explain() 在mongodb3+版本后输出格式发生改变: 详情参见:https://docs.mongodb.com/v3.0/reference/method/curso ...

  2. 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障

    蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 云原生场景,相比于传统的IDC场景,业务更加复杂 ...

  3. 上mongodb创建一些吸取的经验教训指数

    想来接触mongodb它已经快一年了,对于其指数已经积累了很多的经验,知识,以这个夜黑风高的优势,放mongodb总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1 ...

  4. MongoDb 创建、更新以及删除文档常用命令

    mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...

  5. Mongodb创建数据库

    基本语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 coderschool ...

  6. 为MongoDB创建一个Windows服务

    一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件 ...

  7. MongoDB 创建数据库

    语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 runoob: > ...

  8. mongodb创建副本集命令

    mongodb创建副本集命令 ./mongod --replSet spock --dbpath ../data --smallfiles > config ={... "_id&qu ...

  9. linux环境给mongodb创建索引

    首先我们来了解索引,如果有基础的可以直接看最后面的操作. 可参照 DoNotStop 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/u013725455/artic ...

随机推荐

  1. GO开发[一]:golang开发初探

    一.Golang的安装 1.https://dl.gocn.io/ (国内下载地址) 2.https://golang.org/dl/ (国外下载地址) 3.现在studygolang中文网也可以了h ...

  2. OS.path部分函数的介绍

    OS.path模块中的部分函数的介绍 os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix( ...

  3. 找出生成json中的error_code,并加以处理

    需求: 前段时间调用了百度AI的分词接口,因为不完全支持并发,一些调用产生了错误,混在json内部. 现在需要将未调用成功的内容重新调用一遍. 思考过程: 方法一: 开始想到的是调用的过程当中,如果报 ...

  4. 远程SCP报错,报22号口错误

    格式: scp root@ip地址/远程服务器文件地址 本地服务器地址 查看了半天发现无法联通,最终22端口不通 后来经过同事提示,忽然想到要经过跳板进行转发才能够登录. 想到自己配置了ssh文件 直 ...

  5. Eclipse导入Hadoop源码项目及编写Hadoop程序

    一 Eclipse导入Hadoop源码项目 基本步骤: 1)在Eclipse新建一个java项目[hadoop-1.2.1] 2)将Hadoop压缩包解压目录src下的core,hdfs,mapred ...

  6. CSS基础之盒子模型及浮动布局

    盒模型 谈到盒模型,有经验的小伙伴一定滚瓜烂熟,无非就是 内容(content).填充(padding).边框(border).边界(margin): 这些属性我们可以把它转移到我们日常生活中的盒子( ...

  7. 学习笔记-echarts x,y轴样式

    //改变坐标轴文本的样式axisLabel:{ textStyle:{ color:'#fff' }},//改变坐标轴和文本的样式axisLine:{ lineStyle:{ color:'#fff' ...

  8. HDU1061-Rightmost Digit-规律题,快速幂

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. stl总结精简版

    STL 精简版 vetor #include<vector> #include<cstdio> #include<algorithm> #include<io ...

  10. three.js 入门案例

    最近公司需要用tree.js实现一个3D图的显示,就看了官方文档,正好有时间,就记录下来. 由于我们公司的前端框架用的是angular,所以我就把我的treejs封装在一个directives里面.后 ...