概 述

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  是您正在启动的程序的路径,是 传递给程序的任何可选参数。
例如:
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