M​o​n​g​…

 

MongoDB

加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务。

但我们感觉如果先添加一项对

NoSQL

存储的支持,而不是先升级已支持的关系型数据库,

可能对用户不太好,毕竟目前的用户都使用关系型数据库。

 

所以我们决定将引入

MongoDB

这项工作放到升级

MySQL

PostgreSQL

之后来做。

到目前

为止,

MySQL 5.5

Beta

版已在进行中,

PostgreSQL

9.1 Beta

版也将进入流程,

因此我

们打算在

2012

年第一季度中应用这两个版本。

 

 

 

 

 

由于我们对

MongoDB

的关注,我们选择性地为几名使用

MongoDB

的用户提供了技术

支持。在这个过程中,我们了解到了很多可能出现问题的地方。所以想借此文与大家分享

Engine Yard

眼中的

MongoDB

最佳实践。

 

 

 

 

 

如果你的

MongoDB

是定制化安装的,

我们强烈建议你将自己的设置与本文讲到的内容

进行对比,并进行必要的设置修改。

 

通常意义上的

NoSQL

最佳实践

 

 

 

 

 

已有很多文章对

NoSQL

选型方面进行过讨论。在选择一个数据库产品时,通常可能需

要考虑以下因素:

读写吞吐量、

持久化、

一致性以及延迟等。

Nathan Hurst

的文章

V

isual

Guide to NoSQL Systems

》中对这些方面都做了详尽的介绍。

 

 

 

 

 

数据库的选择

是个大问题,

本文不打算就这方面深入介绍,

但希望读者能够自己去了解

这方面的知识。一旦开发者了解得足够多,最后的结论永远都只有一

 

个:没有任何一个数

据库能够满足所有的应用场景。本文内容是基于选择

MongoDB

作为数据库存储上来说的。

Engine Yard

在这方面提出了如下四点建议。

 

 

 

 

 

全面测试。

测试一定要使用切合实际场景的数据,

并且需要尽量模拟业务场景的数据操

作情况。

否则,

开发者会发现在上线后的实际场景下,

可能导致一些性能瓶颈甚至发现整体

架构上的设计缺陷。

因此,

尽可能使用实际场景的操作使用来进行测试,

然后收集足够的测

试数据。

 

 

 

 

 

千万别以为在关系型数据库上的使用方法可以被直接移植

MongoDB

并不支持一些关

系型数据库的功能,所以开发者最好先搞清楚

MongoDB

支持

 

哪些功能。为了获得更好的

性能,

开发者最好多看

10gen

官方建议的文档设计和操作方法。

另外,

在使用

MongoDB

前,

建议开发者做好对整个架构进行重

 

构以适用新的存储模型的准备。为了更好地理解数据迁

 
 
 
 

 

 

 

 

 

移的代价,建议阅读《

The cost ofMigration

》一文。

 

 

 

 

 

明确数据需要的一致性和可靠性。

MongoDB

来说,

可靠性不再过度地依赖将数据写

入到磁盘的操作,

更多的是通过将数据同步到其他节点的方式解决可靠性问题。

绝不建议开

发者在真实环境中使用没有备份的节点单独工作。

这一点很重要,

所以建议开发者了解其中

的原因。

 

 

 

 

 

明确你对

EBS

的期望。

如果你是

Engine Y

ard

云平台的用户(

A

WS EC2

,那么应该知

道,

EBS

的性能不太稳定。所以在测试时,你最好收集足够多的

EBS

设备吞吐数据以做考

量。

Engine Yard

本身并没有对用户在

EBS

性能上做限制。

 

MongoDB

最佳实践

 

 

 

 

 

以下是我们将

MongoDB

引入到服务支持列表过程中所遵循的原则。

 

 

 

 

 

总是使用

Replica Sets

Replica Sets

通过自动

failover

机制提供

MongoDB

的高可用性。

在应用中,如

primary

机器出现故障,那么某一台

secondary

机器就会通

 

过选举成为新的

primary

整个集群仍然能够提供正常服务。

我们的服务不会支持无同步机制的

MongoDB

置方案。如果在开发者自己的环境中同步机

 

制的代价过高,我们建议其使用一些云存储服

务。

Engine Yard

目前已经与

MongoHQ

MongoLab

都建立了合作关系。

开发者可以在合作

者页面找到更多这方面的信息。

 

 

 

 

 

保持版本更新。

保持版本更新很重要,

10gen

在每个版本中都会修复一些问题,使

MongoDB

的运行更出色。

比如在

2.0.x

版本

 

中,

MongoDB

的存储性能和并发性能就有极大

提高,同时还包括索引优化、

Bug

修复以及

compaction

命令等一系列改进,以便开发者更

方便地扩

 

展其集群。如果你还在使用

1.6.3

版本,那就快升级吧。

 

 

 

 

 

不要在

32

位系统上使用

MongoDB

32

位机器上,

MongoDB

只能存储约

2.5GB

的数

据。因为

MongoDB

在内部实现上是通过内存映

 

射的方式来提高性能的,所以在

32

位机器

上其内存地址本身就限制了数据容量。

Engine Y

ard

云服务中使用

MongoDB

请使用

Large

instance

来部署

MongoDB

。在实际产品中,我们也只支持

64

位的

MongoDB

 

 

 

 

 

默认开启

journaling

日志。

MongoDB

支持在写操作前记录

journaling

日志来提高节点

的可用性。强烈建议在部署时开启

 

journaling

日志。注意数据文件的存放位置。在使用时,

请确认你的数据文件处于一个持久化存储中(比如

/data/mongodb

目录)

。也可以

 

使用非持

久化的设备进行数据文件存储,

不过你最好小心再小心,

因为这可能会对你的集群架构造成

影响。推荐使用

EBS

进行

MongoDB

的数据文件存储。热

 

数据最好能放在内存中。能够保

 

 

 

 

 


持热数据

(以及索引数据)

一直放在内存中,

这一点非常重要,

它将对整个集群的性能造成

影响。如果通过监控发现

page fault

的数量增加,那么很可能就是热数据量超出了可用内存

大小。

当热数据量超出了可用内存量时,

通常有两种解决方法:

增加内存和数据分片。

建议

先增加

 

内存,再考虑通过数据分片的方式解决。

 

 

 

 

 

压力过大升级配置。

如果机器负载达到

65%

,那么应该考虑升级机器配置。在日常使用

中,最好保持负载低于

65%

。同时这也对数据恢复和纵向扩展有影

 

响。当需要升级配置时,

A

WS

建议按下面的顺序来做:

Large

Extra

Large

High

Memory

4XL

。而在更高配置的机

器上,网络延迟也会更小。

 

 

 

 

 

分片需谨慎。

分片策略会受数据访问特点的影响,

所以在进行数据分片前,

最好先理清

楚数据的访问特点,并想明白是否确实需要分片。分片字段对性能的影

 

响非常大,所以选

择一个好的分片字段是非常重要的。

Config

节点对整个集群的健康运行是至关重要的,

所以

一旦你选择使用分片机制,就一定要保证有

3

 

Config

节点。永远不要删除

Config

节点的

数据,

要确保频繁地对这些数据进行日常备份。

如果可能,

通过域名来指定节点的地址,

如在

/etc

/hosts

文件中指定相应的本地域名,这能让你在集群配置上更灵活。

Config

节点的

压力很小,但还需运行在

64

位机器上。千万不要把

3

 

Config

节点都放在同一台机器上!

 

另外,如果你要部署一个分片集群,那么可以向

Engine Y

ard

专家服务预约咨询服务。

 

 

 

 

 

使用

Mongo

MMS

图形化监控服务。

如果你还没有完善的

MongoDB

监控,可以尝试

Mongo MMS

Mongo MMS

10gen

官方发布的一个监控服务,

可以将集群的各项健康指标

以图形化的方式汇总展示。

你可能感兴趣的:(M​o​n​g​…)