概 述
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
转载于:https://blog.51cto.com/silencezone/2378907