1.MongoDB环境搭建与基本操作
MongoDB官网:https://www.mongodb.com/
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
软件版本说明:本次使用的mongodb版本为:mongodb-linux-x86_64-3.2.8.tgz
1.部署MongoDB
系统环境:
[root@nova-02 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@nova-02 ~]# uname -r
2.6.32-642.el6.x86_64
[root@nova-02 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@nova-02 ~]# getenforce
Enforcing
[root@nova-02 ~]# hostname -I
10.0.0.212 172.16.1.212
创建用户并设置用户密码:
[root@nova-02 ~]# groupadd -g 800 mongod
[root@nova-02 ~]# useradd -u 801 -g mongod mongod
[root@nova-02 ~]# echo 123456|passwd --stdin mongod
创建程序目录:
[root@nova-02 ~]# mkdir -p /application/mongodb
[root@nova-02 mongodb]# mkdir -p bin conf log data
[root@nova-02 mongodb]# ls
bin conf data log
下载安装包并解压:
[root@nova-02 opt]# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tg
[root@nova-02 opt]# ll -h mongodb-linux-x86_64-rhel62-3.2.8.tgz
-rw-r--r--. 1 root root 72M Jul 13 2016 mongodb-linux-x86_64-rhel62-3.2.8.tgz
[root@nova-02 opt]# tar -xf mongodb-linux-x86_64-rhel62-3.2.8.tgz
[root@nova-02 opt]# cd mongodb-linux-x86_64-rhel62-3.2.8
[root@nova-02 mongodb-linux-x86_64-rhel62-3.2.8]# ls
bin GNU-AGPL-3.0 MPL-2 README THIRD-PARTY-NOTICES
[root@nova-02 mongodb-linux-x86_64-rhel62-3.2.8]# cp bin/* /application/mongodb/bin/
[root@nova-02 mongodb-linux-x86_64-rhel62-3.2.8]# ls /application/mongodb/bin/
bsondump mongod mongoexport mongoimport mongoperf mongos mongotop
mongo mongodump mongofiles mongooplog mongorestore mongostat
修改程序属组:
[root@nova-02 ~]# chown -R mongod:mongod /application/mongodb/
切换到mongod用户,设置用户环境变量:
[root@nova-02 ~]# su - mongod
[mongod@nova-02 ~]$ echo 'export PATH=/application/mongodb/bin:$PATH' >>.bash_profile
[mongod@nova-02 ~]$ tail -1 .bash_profile
export PATH=/mongodb/bin:$PATH
[mongod@nova-02 ~]$ source .bash_profile
至此,MongoDB数据库部署完成!
2.管理MongoDB
[root@nova-03 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@nova-03 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。
但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。
数据库的启动与关闭的一般方式:
[mongod@nova-02 ~]$ mongod --dbpath=/application/mongodb/data/ --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4473
child process started successfully, parent exiting
[mongod@nova-02 ~]$ mongod --shutdown --dbpath=/application/mongodb/data/ --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
killing process with pid: 4473
参数说明:
--dbpath 数据存放路径
--logpath 日志文件路径
--logappend 日志输出方式
--port 启用端口号
--fork 在后台运行
--auth 是否需要验证权限登录(用户名和密码)
--bind_ip 限制访问的ip
--shutdown 关闭数据库
登入数据库:
[mongod@nova-02 ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>
也可以使用配置文件的方式管理数据库:
法一:普通格式配置文件
[root@nova-02 ~]# vim /application/mongodb/conf/mongod1.conf
[root@nova-02 ~]# cat /application/mongodb/conf/mongod1.conf
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1
使用配置文件时的启动与关闭方式:
启动:mongod -f mongod1.conf
关闭:mongod -f mongod1.conf --shutdown
法二:YAML格式配置文件(3.X 版本官方推荐使用)
[root@nova-02 ~]# vim /application/mongodb/conf/mongod.conf
[root@nova-02 ~]# cat /application/mongodb/conf/mongod.conf
systemLog:
destination: file
path: "/application/mongodb/log/mongod.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/application/mongodb/data"
processManagement:
fork: true
net:
port: 27017
在数据库中关闭数据库的方法:
[mongod@nova-02 ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
>
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
法三:使用脚本管理mongodb服务
[root@nova-02 ~]# vim /etc/init.d/mongod
[root@nova-02 ~]# cat /etc/init.d/mongod
kconfig: 2345 80 90
# description:mongodb
# by crmn
# blog_url http://blog.nmtui.com
#################################
MONGODIR=/application/mongodb
MONGOD=$MONGODIR/bin/mongod
MONGOCONF=$MONGODIR/conf/mongod.conf
InfoFile=/tmp/start.mongo
. /etc/init.d/functions
status(){
PID=`awk 'NR==2{print $NF}' $InfoFile`
Run_Num=`ps -p $PID|wc -l`
if [ $Run_Num -eq 2 ]; then
echo "MongoDB is running"
else
echo "MongoDB is shutdown"
return 3
fi
}
start() {
status &>/dev/null
if [ $? -ne 3 ];then
action "启动MongoDB,服务运行中..." /bin/false
exit 2
fi
sudo su - mongod -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null
if [ $? -eq 0 ];then
action "启动MongoDB" /bin/true
else
action "启动MongoDB" /bin/false
fi
}
stop() {
sudo su - mongod -c "$MONGOD -f $MONGOCONF --shutdown" &>/dev/null
if [ $? -eq 0 ];then
action "停止MongoDB" /bin/true
else
action "停止MongoDB" /bin/false
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac
3.MongoDB的基本操作
(1)查询操作
在客户端指定数据库进行连接:(默认连接本机test数据库)
[mongod@nova-02 ~]$ mongo 10.0.0.212/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.212/admin
> db
admin
查看当前数据库版本:
> db.version()
3.2.8
切换数据库:
> use test
switched to db test
> db
test
> db
test
> db.getName()
test
查询所有数据库:
> show dbs;
local 0.000GB
> show databases;
local 0.000GB
查看meng数据库当前状态:
> use meng
switched to db meng
> db.stats()
{
"db" : "meng",
"collections" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"fileSize" : 0,
"ok" : 1
}
查看当前数据库的连接机器地址:
> db.getMongo()
connection to 10.0.0.212
(2)数据管理
创建数据库:
> use meng
switched to db meng
说明:
创建数据库,当use的时候,系统就会自动创建一个数据库。
如果use之后没有创建任何集合。系统就会删除这个数据库。
删除数据库:
> db.drop
db.dropAllRoles( db.dropAllUsers( db.dropDatabase( db.dropRole( db.dropUser(
> db.dropDatabase()
{ "ok" : 1 }
说明:
删除数据库,如果没有选择任何数据库,会删除默认的test数据库。
查看当前数据下的所有集合:
创建集合:
法一:
> use meng
switched to db meng
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }
> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]
法二:当插入一个文档的时候,一个集合就会自动创建。
> use meng
switched to db meng
> db.c.insert({name:'meng'});
WriteResult({ "nInserted" : 1 })
> db.c.insert({url:'https://cn.vnnox.com'});
WriteResult({ "nInserted" : 1 })
>
查看创建的合集:
> db.getCollectionNames()
[ "a", "b", "c" ]
>
查看集合里的内容:
> db.c.find()
{ "_id" : ObjectId("5ad071a23b42791aaaa77f53"), "name" : "meng" }
{ "_id" : ObjectId("5ad071ef3b42791aaaa77f54"), "url" : "https://cn.vnnox.com" }
>
重命名集合:
> db.c.renameCollection("meng")
{ "ok" : 1 }
> db.getCollectionNames()
[ "a", "b", "meng" ]
删除集合:
> db.a.drop()
true
> db.getCollectionNames()
[ "b", "meng" ]
插入1w行数据:
>for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()});}
WriteResult({ "nInserted" : 1 })
查询集合中的查询所有记录:
> db.log.find()
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
> DBQuery.shellBatchSize=50; # 每页显示50条记录
50
> db.log.findOne() # 查看第1条记录
{
"_id" : ObjectId("5ad07599815db69b8dee49b0"),
"uid" : 0,
"name" : "mongodb",
"age" : 6,
"date" : ISODate("2018-04-13T09:17:13.796Z")
}
>
> db.log.count() # 查询总的记录数
10000
> db.log.findOne({uid:1000}) # 查询UUID为1000的数据
{
"_id" : ObjectId("5ad0759a815db69b8dee4d98"),
"uid" : 1000,
"name" : "mongodb",
"age" : 6,
"date" : ISODate("2018-04-13T09:17:14.298Z")
}
删除集合中的记录数:
> db.log.distinct("name") # 查询去掉当前集合中某列的重复数据
[ "mongodb" ]
>
> db.log.remove({}) # 删除集合中所有记录
WriteResult({ "nRemoved" : 10000 })
> db.log.distinct("name")
[ ]
查看集合存储信息:
> db.log.stats() # 查看数据状态
> db.log.dataSize() # 集合中数据的原始大小
0
> db.log.totalIndexSize() # 集合中索引数据的原始大小
98304
> db.log.totalSize() # 集合中索引+数据压缩存储之后的大小
360448
> db.log.storageSize() # 集合中数据压缩存储的大小
262144
> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()});}
WriteResult({ "nInserted" : 1 })
>
> db.log.find({uid:1000}).pretty() # pretty()使用
{
"_id" : ObjectId("5ad07854815db69b8dee74a8"),
"uid" : 1000,
"name" : "mongodb",
"age" : 6,
"date" : ISODate("2018-04-13T09:28:52.964Z")
}
4.MongoDB中用户管理
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。
(1)用户的权限
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin :允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin :允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin :只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
(2)创建管理员用户
进入管理数据库:
> use admin
switched to db admin
> db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
注意:
创建管理员角色用户的时候,必须到admin下创建。
删除的时候也要到相应的库下操作。
查看创建完用户后的collections:
> show tables;
b
log
meng
system.users
system.version
查看创建的管理员用户:
> show users
{
"_id" : "admin.root",
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
>
验证用户是否能用:
> db.auth("root","root")
1
用户创建完成后在配置文件中开启用户验证:
[root@nova-02 ~]# tail -2 /application/mongodb/conf/mongod.conf
security:
authorization: enabled
[root@nova-02 ~]# chmod +x /etc/init.d/mongod
重启服务:
[root@nova-02 ~]# /etc/init.d/mongod restart
/etc/init.d/mongod: line 1: kconfig:: command not found
停止MongoDB [ OK ]
启动MongoDB [ OK ]
登陆测试,注意登陆时选择admin数据库
注意:用户在哪个数据库下创建的,最后加上什么库。
法一:命令行中进行登陆
[mongod@nova-02 ~]$ mongo -uroot -proot admin
MongoDB shell version: 3.2.8
connecting to: admin
法二:在数据库中进行登陆验证
[mongod@nova-02 ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>
> use admin
switched to db admin
> db.auth("root","root")
1
> show tables;
b
log
meng
system.users
system.version
>
(3)按实际生产需求创建应用用户
情景一:创建对某库的只读用户:
> use test //在test库创建只读用户test
> db.createUser({user:"test",pwd:"test",roles:[{role:"read",db:"test"}]})
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}
> db.auth("test","test") //测试用户是否创建成功
1
> show users;
{
"_id" : "test.test",
"user" : "test",
"db" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}
> show collections; //登录test用户,并测试是否只读
a
b
> db.createCollection('c')
{ "ok" : 1 }
> show collections;
a
b
c
情景二:创建某库的读写用户
> db.createUser({user:"test1",pwd:"test1",roles:[{role:"readWrite",db:"test"}]})
Successfully added user: {
"user" : "test1",
"roles" : [
{
"role" : "readWrite", //创建test1用户,权限为读写
"db" : "test"
}
]
}
> show users; //查看并测试用户
{
"_id" : "test.test",
"user" : "test",
"db" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}
{
"_id" : "test.test1",
"user" : "test1",
"db" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
> db.auth("test1","test1")
1
情景三:创建对多库不同权限的用户
> use app //创建对app为读写权限,对test库为只读权限的用户
switched to db app
> db.createUser({user:"app",pwd:"app",roles:[{role:"readWrite",db:"app"},{role:"read",db:"test"}]})
Successfully added user: {
"user" : "app",
"roles" : [
{
"role" : "readWrite",
"db" : "app"
},
{
"role" : "read",
"db" : "test"
}
]
}
> show users //查看并测试用户
{
"_id" : "app.app",
"user" : "app",
"db" : "app",
"roles" : [
{
"role" : "readWrite",
"db" : "app"
},
{
"role" : "read",
"db" : "test"
}
]
}
> db.auth("app","app")
1
删除用户:
[mongod@nova-02 ~]$ mongo -uroot -proot 127.0.0.1/admin //删除app用户:先登录到admin数据库
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1/admin
> use app //进入app库删除app用户
switched to db app
> db.dropUser("app")
false
(4)自定义数据库
创建app数据库的管理员:先登录到admin数据库:
[mongod@nova-02 ~]$ mongo -uroot -proot 127.0.0.1/admin
MongoDB shell version: 3.2.8
connecting to: 127.0.0.1/admin
> use app
switched to db app
> db.createUser({user:"admin",pwd:"admin",roles:[{role:"dbAdmin",db:"app"}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "dbAdmin",
"db" : "app"
}
]
}
>
创建app数据库读写权限的用户并具有clusterAdmin权限:
> use app
switched to db app
> db.createUser({user:"app01",pwd:"app01",roles:[{role:"readWrite",db:"app"},{role:"clusterAdmin",db:"admin"}]})
Successfully added user: {
"user" : "app01",
"roles" : [
{
"role" : "readWrite",
"db" : "app"
},
{
"role" : "clusterAdmin",
"db" : "admin"
}
]
}
>
浙公网安备 33010602011771号