每台主机进程
为了获得最佳性能,用户应该在每个主机上运行一个mongod进程。通过使用虚拟化或容器技术来进行适当的大小调整和资源分配,可以在单个服务器上运行多个MongoDB进程,而不会争用资源。使用WiredTiger存储引擎,管理员将需要计算每个实例的适当缓存大小,方法是评估每个实例应该使用总RAM的哪个部分,并在每个实例之间分割默认的cache_size。
为了高可用性,同一副本集的多个成员不应该位于同一物理硬件上,或者共享任何单点故障,例如电源。在云中运行时,利用虚拟化提供者跨可用性区域部署的能力,确保来自每个副本集的成员在地理上分散,并且不共享相同的电源、管理程序或网络。
虚拟化与IaaS
客户可以在裸金属服务器、虚拟环境和云中部署MongoDB。尽管许多MongoDB用户利用基础设施即服务(IaaS)平台,如亚马逊Web服务的弹性计算云(AWS EC2)、谷歌计算引擎(Google Compute Engine)、微软Azure、Rackspace等,但使用裸金属通常性能最好,也最稳定。
Mongos和Config服务器进程的大小
对于分片系统,其他进程必须与mongod数据存储进程一起部署:mongos查询路由和config服务器。分片是分布在多个服务器上的数据的物理分区。有关分片的更多信息,请参阅关于使用分片的水平扩展的部分。使用称为mongos的查询路由进程将查询路由到适当的碎片。mongos用于确定将查询路由到哪里的元数据由config服务器维护。mongos和confi服务器进程都是轻量级的,但是每个进程都有一些不同的大小要求。
在分片内部,MongoDB进一步将文档分区为块。MongoDB在config数据库中维护关于块与片关系的元数据。在分片部署中维护三个或更多个config服务器,以确保元数据始终可用。碎片元数据访问很少见:每个mongos维护该数据的缓存,当块被分割或迁移到其他分片时,后台进程定期更新该缓存,通常在集群扩展和收缩的平衡操作期间。因此,config服务器的硬件应该关注可用性:应该使用冗余电源、冗余网络接口、冗余RAID控制器和冗余存储。config服务器可以部署为具有多达50个成员的副本。
通常,在MongoDB分片系统中使用多个mongos实例。MongoDB用户在每个应用服务器上部署mongos实例并不罕见。mongos服务器的最佳数量将由应用程序的特定工作负载决定:在某些情况下,mongos只是将查询路由到适当的分片,而在其他情况下,mongos必须将查询路由到多个分片并合并结果集。为了估计每个mongos的存储器需求,考虑以下几点:
• 由mongos缓存的分片元数据的总大小
• 每个应用程序连接的1MB
Mongos进程使用有限的RAM,并且更快速的CPU和网络会有更好的结果。
操作系统与文件系统
Linux配置
MongoDB只支持64位版本的操作系统。对于具有MMAPv1存储引擎的MongoDB,32位系统是可用的,但是只提供与旧开发环境的向后兼容性。MongoDB WiredTiger版本不能用于32位平台。
在生产中使用MongoDB应该在Linux内核的版本2.6.36或更高版本中。
尽量使用EXT4或XFS文件系统;避免使用EXT3,EXT3相当旧,对大多数数据库工作负载来说都不是最佳的。例如,MMAPv1为数据预先分配空间。在EXT3中,预分配实际上将0写入磁盘以分配空间,这很耗时。在EXT4和XFS中,预分配作为逻辑操作来执行,这更有效。
对于WiredTiger存储引擎,强烈建议使用XFS,以避免在与WiredTiger一起使用EXT4时所观察到的性能问题。
对于Linux上的MongoDB,使用以下推荐配置:
- 关闭带有数据库文件的存储卷的atime。
- 不要使用巨页虚拟内存页,MongoDB在普通虚拟内存页上表现更好。
- 在BIOS中禁用NUMA,或者在禁用NUMA的情况下调用mongod。
- 确保存储数据库文件的块设备的预读设置相对较小,因为大多数访问都是非顺序的。例如,将readahead设置为32(16KB)是一个很好的开始。
- 同步主机之间的时间——例如,使用NTP。这对于分片的MongoDB集群尤其重要。这也适用于运行MongoDB进程的VM客户机。
Linux提供控制以限制每个进程和每个用户的资源和open files的数量。默认设置可能不够MongoDB。通常,MongoDB应该是系统、VM或容器上的唯一进程,以确保与其他进程没有冲突。
虽然每个部署都有独特的要求,但是以下配置是mongod和mongos实例的良好开始。使用ulimit配置这些设置:
- -f (file size): unlimited
- -t (CPU time): unlimited
- -v (virtual memory): unlimited
- -n (open files): above 20,000
- -m (memory size): unlimited
- -u (processes/threads): above 20,000
有关使用ulimit设置MongoDB的资源限制的更多信息,请参阅Linux ulimit Settings上的MongoDB文档页面。