本文主要内容来自MongoDB官方文档http://docs.mongodb.org/manual/administration/production-notes/。并结合了实际工作情况进行分享。
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
%util Percentage of CPU time during which I/O requests were issued to the device (bandwidth
100%.
相关推荐
源于线上环境部署mongodb时屏蔽了外网访问mongodb,所以使用不了mongochef这样方便的远程连接工具,便Mongodb提供的java api实现的的网页版管理。 未设置登录权限相关模块,低耦合性 方便嵌入到现有的项目。
源于线上环境部署mongodb时屏蔽了外网访问mongodb,所以使用不了mongochef这样方便的远程连接工具,便Mongodb提供的java api实现的的网页版管理。未设置登录权限相关模块,低耦合性 方便嵌入到现有的项目
### Linux常见线上环境搭建手册知识点解析 #### 一、线上环境组成 线上环境主要由以下几部分构成: 1. **1台nginx代理服务器**:负责处理客户端请求,并将其转发到后端的应用服务器。 2. **2台web服务器(tomcat...
源于线上环境部署mongodb时屏蔽了外网访问mongodb,所以使用不了mongochef这样方便的远程连接工具,便Mongodb提供的java api实现的的网页版管理 未设置登录权限相关模块,低交换性方便嵌入到现有的项目 关于 电子...
7. 部署:选择合适的服务器(如Heroku、DigitalOcean等),将应用部署到线上环境。 最后,项目压缩包`node-vue-master`包含了整个项目的所有源码和配置文件,开发者可以下载后直接运行,也可以作为学习参考,了解...
这个过程涵盖了后端服务的搭建、数据库设计、API接口开发以及线上环境的配置等多个关键环节。 首先,Node.js是基于Chrome V8引擎的JavaScript运行环境,它让开发者可以在服务器端使用JavaScript进行编程,从而实现...
- 可选择部署到云平台,如AWS、阿里云等,进行线上服务。 6. 项目结构规划: - 爬虫模块:包含爬虫脚本,负责数据抓取。 - 数据库模块:处理与MongoDB的交互,包括数据的存取操作。 - Flask应用模块:包含路由...
7. **部署文件**:如Dockerfile、云服务配置文件,用于部署到生产环境。 8. **测试**:单元测试和集成测试代码,确保代码质量。 9. **文档**:项目介绍、开发指南和技术架构说明等。 为了深入了解这个项目,我们...
9. **部署**:学习如何将应用部署到云平台,如Heroku、DigitalOcean或AWS,实现线上运行。 通过这个项目,开发者不仅可以掌握Node.js和MongoDB的基础知识,还能深入了解全栈开发流程,提升实际项目经验。同时,对...
- 部署上线:讲解如何将项目部署到云服务器,如Heroku或AWS,实现线上运行。 - 用户反馈与持续改进:学习如何收集用户反馈,进行版本迭代和功能优化。 这个“本demo基于vue实现了一个商城系统,也是一个入门...
7. **部署上线**:将项目部署到服务器,如Heroku或Vercel,确保线上环境运行正常。 全栈开发涉及多个技术栈的协同工作,掌握Express、MongoDB和Vue.js是现代Web开发的重要技能。通过这个项目,开发者可以深入了解...
7. **开发流程**:基于SpringBoot的线上教育系统开发可能涉及以下步骤:需求收集与分析、系统架构设计、数据库设计、前端界面开发、后端接口实现、单元测试、集成测试、部署上线及后期维护。 通过研究这个压缩包的...
项目部署可能选择Heroku、Docker或AWS等云服务,以实现线上运行。 ### 8. UI/UX 设计 Food Corner的用户体验(UX)和用户界面(UI)设计也很关键,包括色彩搭配、布局设计、交互反馈等方面,确保用户能够轻松浏览...
- 部署到Heroku、AWS或自己的服务器上,实现线上服务。 此外,为了提高服务的可用性和安全性,还可以考虑以下扩展: - **URL验证**:检查输入的长网址是否有效。 - **短码冲突处理**:当短码已存在时,采用备用...
使用Jenkins、GitLab CI/CD等工具实现自动化构建和部署,确保每次代码变更都能快速、稳定地更新到生产环境。 综上所述,基于SpringBoot的线上辅导班系统开发涉及多个层面的技术,包括微服务架构、数据库设计、API...
源码部署可能需要Linux服务器环境,配合Nginx、Apache等反向代理服务器,实现负载均衡和HTTPS加密传输。日志管理和监控工具(如ELK Stack或Prometheus)用于故障排查和性能监控。 五、教学应用场景 作为毕业设计或...
8. 部署:将项目部署到云平台,如Vercel或AWS,确保应用的线上运行。 总的来说,这个项目是学习和实践前后端分离、SSR、数据库管理和云服务的绝佳案例。通过它,开发者可以深入理解如何在现代Web环境中构建高性能、...
源码提供了完整的前后端代码实现,部署文档详细介绍了系统的部署步骤和环境配置要求,讲解内容涵盖了系统的功能模块、技术选型理由、设计思路以及使用方法。 适合人群:对微信小程序和Node.js有一定了解,并希望...
这句话暗示了压缩包中可能包含的详细信息,如项目结构、技术栈、数据库设计、部署指南等。使用说明通常会涵盖如何运行项目、配置环境变量、数据库连接设置以及可能存在的特定依赖库或工具。此外,它可能还涵盖了如何...
开发者可以使用Heroku将本地开发的easyNote应用一键部署到云端,实现线上服务。 在"easyNote-master"这个压缩包中,可能包含了以下文件和目录: - `package.json`:记录项目的依赖和配置信息。 - `server.js` 或...