易趣:使用MongoDB创建关键业务的多数据中心应用
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创建关键业务的多数据中心应用的更多相关文章
- 关于mongodb创建索引的一些经验总结(转)
查看语句执行计划: explain() 在mongodb3+版本后输出格式发生改变: 详情参见:https://docs.mongodb.com/v3.0/reference/method/curso ...
- 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障
蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 云原生场景,相比于传统的IDC场景,业务更加复杂 ...
- 上mongodb创建一些吸取的经验教训指数
想来接触mongodb它已经快一年了,对于其指数已经积累了很多的经验,知识,以这个夜黑风高的优势,放mongodb总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1 ...
- MongoDb 创建、更新以及删除文档常用命令
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...
- Mongodb创建数据库
基本语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 coderschool ...
- 为MongoDB创建一个Windows服务
一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件 ...
- MongoDB 创建数据库
语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 runoob: > ...
- mongodb创建副本集命令
mongodb创建副本集命令 ./mongod --replSet spock --dbpath ../data --smallfiles > config ={... "_id&qu ...
- linux环境给mongodb创建索引
首先我们来了解索引,如果有基础的可以直接看最后面的操作. 可参照 DoNotStop 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/u013725455/artic ...
随机推荐
- Centos7(Linux)网络配置,自动获取ip地址
Centos7.0 Vmware 网络桥接配置,利用DHCP自动获取ip地址 首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd / ...
- MYSQL数据库表按月备份,滚动,保留6次备份
要求: 每月1日0点:在不影响业务的情况下,备份整月的数据,保留6次备份. 思路: 基于MYSQL事件功能,每月按时完成操作 RENAME语句具有原子性,新旧表无缝切换 RENAME语句仅修改表定义, ...
- 常用的linux系统监控命令
记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆越来越不行了 找到最耗CPU的java线程 ps命令 命令:ps -mp pid -o THREAD,tid,time 或者 ps - ...
- Django-基础之web框架
http协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- random seed()函数
用seed()生成随机数字,生成的法则与seed内部的数字相关,如果数字相同,则生成的随机数是相同的. 刷题宝上面的题目: >>> import random >>> ...
- 论python3下“多态”与“继承”中坑
1.背景: 近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考... 以廖老师的python3教程中的animal 和dog的继承一节的代码做例子 ...
- 共60课:Python基础教程
简介: 你会看到一堆下载链接.我们就选"Python 2.7.5 Windows Installer",如果是64位系统的同学选下面那个"Python 2.7.5 Win ...
- python函数定义
刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函 ...
- 【JavaScript运算符与表达式】
一.表达式 1.原始表达式:2.14,"test",true/false,null--复合表达式:10*20-- 2.数组.对象的初始化表达式:new Array(1,2),[1, ...
- 学习笔记-使用cmd命令行创建nodejs项目
使用cmd命令行创建nodejs项目 1)在DOS下cd 进入到你想要创建项目的路径. 2)mkdir sing (创建一个sing文件夹) 3)cd sing 4) npm init (初始化工程 ...