1)软件包的选择

确保使用最新的稳定版本。目前我们线上使用的版本是2.4.6。MongoDB软件包下载页面http://www.mongodb.org/downloads

确保线上环境总是使用64位版本。32位版本只能用于测试和开发使用,因为32位版本最大只能存储2GB的数据。启动MongoDB的时候,MongoDB会自动检测是否是32位版本,如果是32位版本,则会有提示信息显示。

MongoDB shell version: 2.4.6

connecting to: 127.0.0.1:28018/test

Server has startup warnings:

Mon Jan  6 17:04:47.040 [initandlisten]

Mon Jan  6 17:04:47.040 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.

Mon Jan  6 17:04:47.040 [initandlisten] **       32 bit builds are limited to less than 2GB of data (or less with --journal).

Mon Jan  6 17:04:47.040 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.

Mon Jan  6 17:04:47.040 [initandlisten] **       See http://dochub.mongodb.org/core/32bit

Mon Jan  6 17:04:47.040 [initandlisten]

>

MongoDB不支持32位存储2GB以上的数据,官方给出的解释是MongoDB的存储引擎使用memory-mapped files即内存映射型文件来提高性能。并且让32位版本不存储2GB以上的数据,MongoDB团队可以减少代码数量,减少bug数量,并且从硬件上来说,越来越多的人使用64位硬件来部署线上服务。所以,确保部署到线上的软件包是64位的,而不是32位的,要不然就悲剧了。

2)操作系统的选择

MongoDB支持Windows,Linux,MacOS和Solaris。从下载页面http://www.mongodb.org/downloads 下载相应的版本即可,记得使用稳定版本。目前,我们线上使用的是CentOS6.4 x86_64。MongoDB需要使用glibc-2.12-1.2.el6以上版本的glibc。

3)并发性

在早期的版本中,一个MongoDB实例中的所有写操作都共同竞争使用一个readers-write 锁。在2.2版本以后,每个实例中的库都有一个readers-write 锁,可以允许这个库的并发读取,但是只能进行单次写入操作。详细操作可以参考http://docs.mongodb.org/manual/faq/concurrency/

4)日志功能

MongoDB使用提前写日志记录到磁盘上的日志方式来确保MongoDB可以快速的从系统奔溃或其他严重事故中恢复写操作。64位版本默认开启日志功能,32位没有开启。详细操作可以参考http://docs.mongodb.org/manual/core/journaling/

5)网络方面

总是在一个可受信任的环境中运行MongoDB,设置网络访问规则,不允许不明确的主机,系统或网络访问MongoDB服务器。正如其他依赖于网络访问的敏感系统一样,部署MongoDB的时候,也需要设定有哪些特定系统允许访问。如设定WEB服务器可以访问MongoDB服务器,监控服务器可以访问MongoDB服务器。默认情况下auth功能没有开启,MongoDB假定当前运行的环境是一个安全的环境。根据需要可以开启auth功能。

http://docs.mongodb.org/manual/tutorial/configure-linux-iptables-firewall/ 配置iptables。

6)连接池

为了避免单个MongoDB实例或Mongos实例负载的连接资源负载过高,确保所有客户端需要维护一个合理的连接池大小。

7)硬件相关考虑

1.分配给MongoDB服务器足够的CPU和内存

MongoDB和其他软件一样,分配越多的内存和越快的CPU都可以提升性能。从线上运行情况来看,    MongoDB确实很吃内存,它会尽量先吃光内存。

2.分配swap

需要给运行MongoDB的系统分配swap分区,避免在内存竞争激烈的情况下,OOM Killer杀掉MongoDB进程。

MongoDB通过映射内存文件到内存的方式确保操作系统不会存储MongoDB数据到swap分区。

3.RAID相关

大多数情况下,部署MongoDB都应该考虑使用RAID10。

4.尽量使用固态硬盘Solid State Disks

在条件允许的情况下,尽量使用SSD,因为SSD对大量随机读写有很高的性能。从线上使用的情况    来看,使用IOPS值越高的磁盘,MongoDB获取的性能越好。

5.不要使用远程文件系统(NFS)

不建议网络文件系统NFS用于MongoDB部署,这样容易产生性能问题。当数据文件和日志文件都存    储在NFS上时,MongoDB就会产生很多性能问题,将日志文件存储在本地或iscsi卷组上,可以获    得好一点的性能。如果非要使用NFS,则在/etc/fstab中需要加上bg,noclock,noatime。

6.将数据分开存储

为了获得更大的性能,可以将数据文件,系统日志文件和访问日志文件分别存储到不同的存储设   备上。但是这样会影响快照方式备份数据。

8)MongoDB和NUMA硬件

在一个NUMA(Non-Uniform Access Memory)的系统上运行MongoDB会产生许多运维相关问题,包括

间断性的慢查询和系统进程高负载使用。

在一个NUMA硬件上使用MongoDB时,需要关闭NUMA,然后设置interleave内存策略。在Linux上部    署MongoDB时,MongoDB 2.0以上版本在启动时会检测NUMA设置,并提示警告信息。

可以使用

numactl --interleave=all /usr/bin/local/mongod

关闭NUMA。

RPM包安装MongoDB后的启动脚本/etc/init.d/mongod已经对NUMA作了相应的处理

# Handle NUMA access to CPUs (SERVER-3574)

# This verifies the existence of numactl as well as testing that the command works

NUMACTL_ARGS="--interleave=all"

if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null

then

NUMACTL="numactl $NUMACTL_ARGS"

else

NUMACTL=""

fi

使用echo 0 > /proc/sys/vm/zone_reclaim_mode 在proc中关闭NUMA。详细信息可以参考

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

9)在Linux上部署MongoDB

1.内核和文件系统的选择

官方建议使用Linux内核版本2.6.36以后的版本。CentOS 6以上默认的内核是2.6.32.目前线上      没有作特殊调整,有实力的话可以自行编译内核。

MongoDB在使用数据库文件之前会预先分配数据库文件,通常会生成许多大文件。所以应该使      用EXT4或XFS文件系统。

通常情况下,如果要使用EXT4文件系统的话,需要使用内核2.6.23以上的内核版本。

如果使用XFS文件系统的话,需要使用内核2.6.25以上的的内核版本。

一些Linux发行版需要不同的内核版本来支持EXT4或XFS文件系统

Linux Distribution           Filesystem                  Kernel Version

CentOS 5.5                   ext4, xfs                   2.6.18-194.el5

CentOS 5.6                   ext4, xfs                   2.6.18-238.el5

CentOS 5.8                   ext4, xfs                   2.6.18-308.8.2.el5

CentOS 6.1                   ext4, xfs                   2.6.32-131.0.15.el6.x86_64

RHEL 5.6                     ext4                        2.6.18-238

RHEL 6.0                     xfs                         2.6.32-71

Ubuntu 10.04.4 LTS           ext4, xfs                   2.6.32-38-server

Amazon Linux AMI release 2012.03   ext4                  3.2.12-3.2.4.amzn1.x86_64

2.建议配置

关闭存储数据库文件的磁盘的atime。如设置

/dev/vdb /data ext4 defaults,noatime 0 0

设置ulimit -n和ulimit -u的值大于20000。如果ulimit的值设置过低的话,当MongoDB处于       频繁访问的状态下,将会产生错误,最终导致无法连接到MongoDB实例。

关闭transparent huge pages。MongoDB在使用正常虚拟内存页面(4096bytes)性能更好。

在BIOS中关闭NUMA.

使用NTP同步主机时间。

确保存储数据库文件的块设备的预读设置(readahaed settings)是否合理。对应随机访           问,设置一个较低的预读设置值。

10)性能监控

使用iostat和bwm-ng可以监控磁盘和网络使用情况

$ iostat -xmt 1

Linux 2.6.32-358.14.1.el6.x86_64 (zg-jidong-mongodb) 04/09/2014 _x86_64_(16 CPU)

04/09/2014 06:00:34 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

1.77    0.00    0.50    0.74    0.09   96.90

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util

vda               0.00     0.83    0.00    0.03     0.00     0.00   214.45     0.00   92.90   6.03   0.02

vdb               0.00    68.53    0.27   71.77     0.01     0.61    17.80     0.00    0.01   1.94  13.99

avgrq-sz  The average size (in sectors) of the requests that were issued to the device.
             当前设备相关的请求的平均大小(以扇区数量计算),数值越小代表随机请求越多
%util             Percentage of CPU time during which I/O requests were issued to the device (bandwidth
                    utilization for the device). Device saturation occurs when this  value  is  close  to
                    100%.
                    这个参数的值非常有用,表示当前设备(磁盘)有相关请求时的CPU占用率,这个值如果接近100%时表示磁盘已经到达饱和状态

mongodb安装建议的更多相关文章

  1. MongoDB学习:(一)MongoDB安装

    MongoDB学习:(一)MongoDB安装 MongoDB介绍:     直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...

  2. MongoDB安装Windows服务

    由于官方下载较慢.这里提供一个个人百度共享网盘地址: http://pan.baidu.com/s/1mhHW0nI mongodb-win32-x86_64-3.2.3 使用以下命令将MongoDB ...

  3. mongodb安装4.0(rpm)

    虚拟机客户端vmware player linux版本:CentOS Linux release 7.4.1708 (Core) CentOS安装类型:Basic Web Server 参照官网最新文 ...

  4. mongodb安装失败与解决方法(附安装教程)

    安装mongodb遇到的一些坑 浪费了大量的时间 在此记录一下   主要是电脑系统win10企业版自带的防火墙  当然还有其他的一些坑 一般的问题在第6步骤都可以解决,本教程的安装步骤不够详细的话  ...

  5. WSL(Windows Subsystem for Linux)的安装与使用及 mongodb安装

    有关WSL的介绍这里就不做解释了.另外,本文仅适用于win10 build 16215以及之后的版本,之前的版本可参考官方链接. (可使用“winver”命令查看windows版本号) 安装:1.  ...

  6. 【转】windows下mongodb安装与使用整理

    转自 :http://www.cnblogs.com/lecaf/archive/2013/08/23/mongodb.html 一.首先安装mongodb 1.下载地址:http://www.mon ...

  7. MongoDB 安装详细教程 + 常用命令 + 与 Python 的交互

    MongoDB 简介 MongoDB (名称来自 humongous/巨大无比的, 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨 ...

  8. Linux下mongodb安装及数据导入导出教程

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

  9. 4.0.3的mongodb 安装和java使用

    一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的github项目地址 https://github.com/247292980/spring- ...

随机推荐

  1. vue 在浏览器控制台怎么调试 谷歌插件vue Devtools

    vue 在浏览器控制台怎么调试 谷歌插件vue Devtools 问题: vuejs里面的变量,怎么用浏览器的console查看? 例如,想在chrome里用console.log查看变量$data, ...

  2. 调度器的实现、schedule、switch_context、switch_to

    根据<深入Linux内核架构>和Linux-3.10.1内核源码,记一些调度过程的主体工作. 调度器任务:CPU数目比要运行的进程数目少,需要程序之间共享CPU时间,创造并行执行的错觉.分 ...

  3. Docker Registry V2 Garbage Collection

    运行 docker run --rm -v /nfs1/docker/registry:/var/lib/registry registry:2.5.1 garbage-collect -d /roo ...

  4. h5 的localStorage和sessionStorage存到缓存里面的值是string类型

    localStorage永久存在,不手动清除永远存在:sessionStorage 一次会话的浏览器关闭就自动清除 h5 的localStorage和sessionStorage 存到缓存里面的值都是 ...

  5. 网页布局要注意的事项,以及CSS3需要特别注意的地方。

    overflow: hidden; white-space: nowrap; text-overflow: ellipsis;隐藏超出部分,出省略号 一定要先布局!布局!布局!要先设置好色块,将位置确 ...

  6. json转数组

    - (NSDictionary *)dataArrayFromJson { NSString *filePath = [[NSBundle mainBundle] pathForResource:@& ...

  7. Numpy中的广播原则(机制)

    为了了解这个原则,首先我们来看一组例子: # 数组直接对一个数进行加减乘除,产生的结果是数组中的每个元素都会加减乘除这个数. In [12]: import numpy as np In [13]: ...

  8. Kaggle比赛NCFM图像分类任务简介

    为了保护和监控海洋环境及生态平衡,大自然保护协会(The Nature Conservancy)邀请Kaggle社区的参赛者们开发能够出机器学习算法,自动分类和识别远洋捕捞船上的摄像头拍摄到的图片中鱼 ...

  9. Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制

    一.视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可.使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的 SQL 语句了 ...

  10. Gson如何解析key值是数字的json数据

    1.使用注解@SerializedName来解决这个问题 2.比如有如下json数据:(key值是数字"1112") { "1112": "抖音&qu ...