简介
MongoDB是一种面向文档的数据库管理系统,MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。
特点
- 高可用性
- 水平可伸缩性
- 丰富的查询语言
- 支持多个存储引擎
安装
系统环境
ip | 系统 | 软件 | 安装方式 |
---|---|---|---|
192.168.253.101 | CentOS7.4 | MongoDB3.6 | 二进制安装 |
1.关闭防火墙selinux
systemctl stop firewalld
setenforce 0
2.创建mongo用户
useradd mongo
echo "mongo" | passwd mongo --stdin
3.关闭hugepage大页内存
Transparent Huge Pages(THP)是一种Linux内存管理系统,通过使用更大的内存页面,可以减少具有大量内存的计算机上的Translation Lookaside Buffer(TLB)查找的开销。
但是,数据库工作负载通常在THP上表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP以确保使用MongoDB获得最佳性能。
cat /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
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi
unset re
unset thp_path
;;
esac
关闭大页内存
chmod 755 /etc/init.d/disable-transparent-hugepages # 设置脚本权限
chkconfig --add disable-transparent-hugepages # 设置开机启动
/etc/init.d/disable-transparent-hugepages start # 关闭内存大页
验证
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
都出现
always madvise [never]
表示成功关闭
4.安装MongoDB3.6
mkdir -p /mongodb/bin
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data
tar xf mongodb-linux-x86_64-rhel70-3.6.11.tgz
cp mongodb-linux-x86_64-rhel70-3.6.11/bin/* /mongodb/bin/
5.创建配置文件
cat /mongodb/conf/mongodb.conf
processManagement:
fork: true # 在后台运行
net:
bindIp: 192.168.253.101 # 监听的IP地址
port: 27017 # 监听的端口地址
storage:
dbPath: "/mongodb/data" # 数据存放路径
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" # 日志位置
logAppend: true # 追加形式写日志
storage:
journal:
enabled: true
修改权限
chown -R mongo:mongo /mongodb/
6. 启动MongoDB
su mongo
/mongodb/bin/mongod -f /mongodb/conf/mongodb.conf
命令行启动方式
/mongodb/bin/mongod --dbpath=/mongodb/data/ --logpath=/mongodb/log/mongodb.log --logappend --fork --bind_ip=192.168.253.101
登陆
/mongodb/bin/mongo 192.168.253.101
关闭
mongod -f mongodb.conf --shutdown
7.设置root用户
/mongodb/bin/mongo 192.168.253.101
> use admin
switched to db admin
> db.createUser(
... {
... user: "mongo",
... pwd: "mongo",
... roles: [ { role: "root", db: "admin" } ]
... })
Successfully added user: {
"user" : "mongo",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
修改配置文件
processManagement:
fork: true
net:
bindIp: 192.168.253.101
port: 27017
storage:
dbPath: "/mongodb/data"
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
security:
authorization: enabled # 打开认证功能
重启服务
/mongodb/bin/mongod -f /mongodb/conf/mongodb.conf --shutdown
/mongodb/bin/mongod -f /mongodb/conf/mongodb.conf
登陆
/mongodb/bin/mongod -f /mongodb/conf/mongodb.conf
> use admin
switched to db admin
> db.system.users.find({}).pretty()
{
"_id" : "admin.mongo",
"user" : "mongo",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "qSkat7Z8xmL+nf1XSvllMQ==",
"storedKey" : "rk9y5zWRhLQDF0ATPvnzuzbQkR0=",
"serverKey" : "zI7lpLqYU9NbI2Z7f/arjXWSCt4="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
基本操作
- 查看版本
db.version()
- 获取当前数据库名
db.getName()
- 查看所有数据库
show dbs
- 切换到admin数据库,如果数据库不存在则创建临时数据库,退出的时候如果临时创建的数据库没有创建任何集合,系统会自动删除这个数据库
use admin
- 查看当前数据库状态
db.stats()
- 查看当前数据库的监听地址
db.getMongo()
- 查询文档集合
db.collection.find()
- 删除数据库,如果没有指定数据库,默认删除test库
db.dropDatabase()
- 创建集合a
db.createCollection('a')
- 查看当前数据下的所有集合
show collections
- 获取当前数据下的所有集合名
db.getCollectionNames()
- 当插入一个文档的时候,一个集合就会自动创建
db.c.insert({username:"mongodb"})
- 查看c集合的所有文档
db.c.find({}).pretty
- 查看c集合内username为"mongodb"的文档
db.c.find({username:"mongodb"})
- 删除c集合
db.c.drop()
- 插入数据10000条数据
> for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
... Date()}); }
- 统计文档数量
db.log.count()
- 查询所有记录
db.log.find()
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
- 设置每页显示数据的大小
> DBQuery.shellBatchSize=50 # 每页显示50条记录
50
> db.log.findOne() # 查看第1条记录
> db.log.count() # 查询总的记录数
- 删除集合中的记录数
> db.log.remove({}) # 删除集合中所有记录
> db.log.distinct("name") # 查询去掉当前集合中某列的重复数据
- 查看集合存储信息
> db.log.stats()
> db.log.dataSize() //集合中数据的原始大小
> db.log.totalIndexSize() //集合中索引数据的原始大小
> db.log.totalSize() //集合中索引+数据压缩存储之后的大小
> db.log.storageSize() //集合中数据压缩存储的大小
用户管理
基本格式
{
user: "<name>", # 用户名
pwd: "<cleartext password>", # 密码
customData: { <any information> }, # 任意内容,相当于备注
roles: [
{ role: "<role>", # 内置常用的角色有root,dbAdmin,readWrite,read
db: "<database>" } | "<role>", # 管理的数据库对象
...
]
}
#注:用户创建完成后需在配置文件打开auth验证并重启后生效。
创建数据库管理员用户
> use admin
> db.createUser(
{
user: "admin",
pwd: "admin",
roles: [
{ role: "dbAdmin",
db:'Admin'
} ]
}
)
验证用户
db.auth('admin','admin')
删除用户
> db.dropUser("admin")