概 述
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
主要特点
MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。 Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。 Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。 Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。 Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。 MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。 MongoDB安装简单。
适用领域
MongoDB可以为Web应用提供可扩展的高性能数据存储解决方案。MongoDB主要适用领域有网站数据、分布式场景、数据缓存和JSON文件格式存储。适用大数据量、高并发、若事务的互联网应用,其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好地满足Web2.0和移动互联网应用数据存储的要求。
一、mongodb 配置文件解说(以4.0为标准说明,使用centos7版本)
/etc/mongod.conf
systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # Where and how to store data. # 数据库文件位置 storage: dbPath: /var/lib/mongo # 这使 日记功能成为可能。日记功能可确保单实例写入持久性。mongod默认情况下,64位版本的启用日记功能。因此,该设置可能是多余的。 journal: enabled: true # engine: # 后面的版本中可能会不再使用mmapv1方式 (在MongoDB 4.0中不推荐使用) # mmapv1: # wiredTiger: # how the process runs processManagement: # 是否以守护进程方式运行 fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo # network interfaces net: port: 27017 bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting. # 以下是复制和分片配置 # 为副本集启用身份验证,请添加以下keyFile选项: # security: # keyFile : / srv / mongodb / keyfile #operationProfiling: # 要将配置服务器部署为副本集,配置服务器必须运行WiredTiger存储引擎。Initiate副本集和添加成员。 # 如果作为副本集运行,initiate则分片副本集和添加成员。 # configDB : csRS / 10.8.0.12:27001 # clusterRole : shardsvr # replication: # 复制配置 # replSetName : set0 #sharding: ## Enterprise-Only Options #auditLog: #snmp:
详情请参考:
https://docs.mongodb.com/manual/administration/configuration/
mongodb 优化推荐
1、内核参数优化 vm.swappiness 如果您的主机运行内核版本3.5或更高版本,或 RHEL / CentOS内核2.6.32-303 或更高版本,则将此值设置为0可以禁用交换。将此设置为1。 设置0告诉内核只交换以避免内存不足的问题。 设置100告诉它积极地交换到磁盘。 2、关闭atime包含数据库文件的存储卷。 3、 根据ulimit引用中的建议,设置文件描述符限制-n和用户进程限制(ulimit)-u,大于20,000 。在大量使用时,低ulimit将影响MongoDB,并且可能产生错误并导致与MongoDB进程的连接失败和服务丢失。 cat /etc/security/limits.conf open files (-n) 65535 max user processes (-u) 65535 4、透明大页面(THP)是一种Linux内存管理系统,通过使用更大的内存页面,可以减少具有大量内存的计算机上的Translation Lookaside Buffer(TLB)查找的开销。 但是,数据库工作负载通常在THP上表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP以确保使用MongoDB获得最佳性能。 创建一个文件 /etc/init.d/disable-transparent-hugepages: #!/bin/bash ### BEGIN INIT INFO # Provides: disable-transparent-hugepages # Required-Start: $local_fs # Required-Stop: # X-Start-Before: mongod mongodb-mms-automation-agent # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Disable Linux transparent huge pages # Description: Disable Linux transparent huge pages, to improve # database performance. ### END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'never' > ${thp_path}/enabled echo 'never' > ${thp_path}/defrag re='^[0-1]+$' if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]] then # RHEL 7 echo 0 > ${thp_path}/khugepaged/defrag echo never > /sys/kernel/mm/transparent_hugepage/enabled else # RHEL 6 echo 'no' > ${thp_path}/khugepaged/defrag fi unset re unset thp_path ;; esac 5、在BIOS中禁用NUMA。如果无法做到这一点,请参阅 NUMA硬件上的MongoDB。 如果你运行在numa机器上,建议禁用numa行为,以避免性能问题。 numactl --interleave = all <path> <options> 这<path>是您正在启动的程序的路径,是<options> 传递给程序的任何可选参数。 例如: numactl --interleave all mongod -f /etc/mongod.conf 在Linux上运行MongoDB时,应使用以下命令之一在 设置中禁用区域回收sysctl: echo 0 | sudo tee / proc / sys / vm / zone_reclaim_mode or sudo sysctl -w vm.zone_reclaim_mode = 0 要完全禁用NUMA行为,您必须执行这两个操作。 6、如果您没有使用默认的MongoDB目录路径或端口,请为MongoDB配置SELinux 。(如果关闭selinux 请忽略)
请参考:
https://docs.mongodb.com/manual/administration/production-notes/#prod-notes-linux-file-system
MongoDB 在 bin 目录下提供了一系列有用的工具,这些工具提供了 MongoDB 在运维管理上 的方便。
工具 | 描述 |
---|---|
mongosniff | mongodb监测工具,作用类似于 tcpdump |
mongodump | MongoDB数据备份工具 |
mongoimport | Mongodb数据导入工具 |
mongoexport | Mongodb数据导出工具 |
bsondump | 将 bson 格式的文件转储为 json 格式的数据 |
mongoperf | |
mongorestore | MongoDB数据恢复工具 |
mongod.exe | MongoDB服务启动工具 |
mongostat | mongodb自带的状态检测工具 |
mongofiles | GridFS 管理工具,可实现二制文件的存取 |
mongooplog | |
mongotop | 跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据 |
mongos | 分片路由,如果使用了 sharding 功能,则应用程序连接的是 mongos 而不是 mongod |
mongo | 客户端命令行工具,其实也是一个 js 解释器,支持 js 语法 |
参考:
http://www.mongodb.org.cn/manual/
二、mongodb 的 logrotate日志切割回滚
mongo logRotate 命令方法
mongo 命令进入mongo 命令行模式(默认端口为:27017)
> use admin
switched to db admin
> db.runCommand({logRotate:1})
{ "ok" : 1 }
>
bye
cat /etc/logrotate.d/mongodb /var/log/mongodb/mongod.log { daily rotate 7 compress dateext missingok notifempty sharedscripts copytruncate postrotate /usr/bin/kill -SIGUSR1 `cat /var/lib/mongo/mongod.lock 2 > /dev/null` 2 > /dev/null || true endscript }
logrotate -vf /etc/logrotate.conf
ls /var/log/mongodb
mongod.log mongod.log.2019-04-16T23-44-00 mongod.log-20190417.gz