UDN-企业互联网技术人气社区

板块导航

浏览  : 1393
回复  : 0

[MongoDB] 线上环境部署MongoDB的官方建议

[复制链接]
巡山霉少女的头像 楼主
发表于 2016-1-14 21:33:01 | 显示全部楼层 |阅读模式

  1)软件包的选择

  确保使用最新的稳定版本。目前我们线上使用的版本是2.4.6。

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

  
  1. MongoDB shell version: 2.4.6

  2.   connecting to: 127.0.0.1:28018/test

  3.   Server has startup warnings:

  4.   Mon Jan 6 17:04:47.040 [initandlisten]

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

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

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

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

  9.   Mon Jan 6 17:04:47.040 [initandlisten]

  10.   >
复制代码


  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功能。

  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设置,并提示警告信息。

  可以使用

  
  1. numactl --interleave=all /usr/bin/local/mongod
复制代码


  关闭NUMA。

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

  
  1. # Handle NUMA access to CPUs (SERVER-3574)

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

  3.   NUMACTL_ARGS="--interleave=all"

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

  5.   then

  6.   NUMACTL="numactl $NUMACTL_ARGS"

  7.   else

  8.   NUMACTL=""

  9.   fi
复制代码


  使用echo 0 > /proc/sys/vm/zone_reclaim_mode 在proc中关闭NUMA。

  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文件系统

  
  1. Linux Distribution Filesystem Kernel Version

  2.   CentOS 5.5 ext4, xfs 2.6.18-194.el5

  3.   CentOS 5.6 ext4, xfs 2.6.18-238.el5

  4.   CentOS 5.8 ext4, xfs 2.6.18-308.8.2.el5

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

  6.   RHEL 5.6 ext4 2.6.18-238

  7.   RHEL 6.0 xfs 2.6.32-71

  8.   Ubuntu 10.04.4 LTS ext4, xfs 2.6.32-38-server

  9.   Amazon Linux AMI release 2012.03 ext4 3.2.12-3.2.4.amzn1.x86_64
复制代码


  2.建议配置

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

  
  1. /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可以监控磁盘和网络使用情况

  
  1. $ iostat -xmt 1

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

  3.   04/09/2014 06:00:34 PM

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

  5.   1.77 0.00 0.50 0.74 0.09 96.90

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

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

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

  9.   avgrq-sz The average size (in sectors) of the requests that were issued to the device.
复制代码


  当前设备相关的请求的平均大小(以扇区数量计算),数值越小代表随机请求越多

  
  1. %util Percentage of CPU time during which I/O requests were issued to the device (bandwidth

  2.   utilization for the device). Device saturation occurs when this value is close to

  3.   100%.
复制代码


  这个参数的值非常有用,表示当前设备(磁盘)有相关请求时的CPU占用率,这个值如果接近100%时表示磁盘已经到达饱和状态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部