linux 学习笔记-082-NoSQL-mongodb 介绍与安装,连接 mongodb,mongodb 用户管理

发布于 2018-05-10  169 次阅读


mongodb 介绍

官网:https://www.mongodb.com/, 当前最新版 3.6

C++编写,基于分布式的,属于 NoSQL 的一种

在 NoSQL 中是最像关系型数据库的

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。

关于 JSON :http://www.w3school.com.cn/json/index.asp

因为基于分布式,所以很容易扩展

MongoDB 和关系型数据库对比

linux 学习笔记-082-NoSQL-mongodb 介绍与安装,连接 mongodb,mongodb 用户管理

关系型数据库数据结构

linux 学习笔记-082-NoSQL-mongodb 介绍与安装,连接 mongodb,mongodb 用户管理

MongoDB 数据结构

linux 学习笔记-082-NoSQL-mongodb 介绍与安装,连接 mongodb,mongodb 用户管理

mongodb 安装

如果装了 epel 源,是可以直接使用 yum 安装 mongodb 的,但是 epel 源安装的 mongodb 版本比较旧,所以我这里就按照官方说明文档安装 mongodb 3.6 版本

官方安装文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

[root@am-01:~#] cd /etc/yum.repos.d

[root@am-01:/etc/yum.repos.d#] vim mongodb.repo

[mongodb-org-3.6]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

[root@am-01:/etc/yum.repos.d#] yum list | grep mongodb

mongodb-org.x86_64                       3.6.4-1.el7                   mongodb-org-3.6

mongodb-org-mongos.x86_64                3.6.4-1.el7                   mongodb-org-3.6

mongodb-org-server.x86_64                3.6.4-1.el7                   mongodb-org-3.6

mongodb-org-shell.x86_64                 3.6.4-1.el7                   mongodb-org-3.6

mongodb-org-tools.x86_64                 3.6.4-1.el7                   mongodb-org-3.6

[root@am-01:/etc/yum.repos.d#] yum -y install mongodb-org

连接 mongodb

查看配置文件

[root@am-01:~#] cat /etc/mongod.conf

systemLog:

  destination: file

  logAppend: true

  path: /var/log/mongodb/mongod.log

#定义日志

storage:

  dbPath: /var/lib/mongo

  journal:

    enabled: true

#定义 dbPath,类似于 mysql 中的 datadir

processManagement:

  fork: true  # fork and run in background

  pidFilePath: /var/run/mongodb/mongod.pid

  timeZoneInfo: /usr/share/zoneinfo

#定义 pid

net:

  port: 27017

  bindIp: 127.0.0.1

#定义监听的端口及绑定的 IP,多个 IP 的话使用逗号分隔

启动 mongodb 并检查启动状态

[root@am-01:~#] systemctl start mongod.service

[root@am-01:~#] ps aux | grep mong

mongod     3146 13.8  4.3 1006324 43548 ?       Sl   23:04   0:01 /usr/bin/mongod -f /etc/mongod.conf

root       3170  0.0  0.0 112676   980 pts/0    S+   23:05   0:00 grep --color=auto mong

[root@am-01:~#] netstat -lntp | grep mongo

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      3146/mongod  

连接 mongodb

在本机可以直接运行命令 mongo 进入到 mongodb shell 中

如果 mongodb 监听端口并不是默认的 27017,则在连接的时候需要加--port 选项,例如

mongo --port 27018

连接远程 mongodb,需要加--host,例如

mongo --host  127.0.0.1

如果设置了验证,则在连接的时候需要带用户名和密码

mongo -uusername -ppasswd --authenticationDatabase db

mongodb 用户管理

创建用户并设置密码

[root@am-01:~#] mongo

MongoDB shell version v3.6.4

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.6.4

> use admin

switched to db admin

#切换到 admin 库

> db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )

Successfully added user: {

"user" : "admin",

"customData" : {

"description" : "superuser"

},

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

#user 指定用户,customData 为说明字段,可以省略,pwd 为密码,roles 指定用户的角色,db 指定库名

列出所有的用户

> db.system.users.find()

{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "R4fNtz15LM7NwVNrwvvS2g==", "storedKey" : "qOgdOfVf7Tjsin28T2z+oUnKnoY=", "serverKey" : "TzBJglz1m5kgZ6D9Pamll6E4FJ8=" } }, "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

列出当前库下的所有用户

> show users

{

"_id" : "admin.admin",

"user" : "admin",

"db" : "admin",

"customData" : {

"description" : "superuser"

},

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

删除一个用户

> db.createUser({user:"am",pwd:"itsupport.0",roles:[{role:"read",db:"testdb"}]})

Successfully added user: {

"user" : "am",

"roles" : [

{

"role" : "read",

"db" : "testdb"

}

]

}

#先新建一个实验用户

> db.dropUser('am')

true

#删除实验用户

> show users

{

"_id" : "admin.admin",

"user" : "admin",

"db" : "admin",

"customData" : {

"description" : "superuser"

},

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

#show users 可以发现实验用户没见了

使用加了密的用户登录 mongodb

[root@am-01:~#] vim /usr/lib/systemd/system/mongod.service

Environment="OPTIONS=--auth -f /etc/mongod.conf"

#需要添加"--auth"才可以使用用户名和密码的方式登陆 mongodb

[root@am-01:~#] systemctl daemon-reload

[root@am-01:~#] systemctl restart mongod.service

[root@am-01:~#] ps aux | grep mong

mongod     3519 30.8  4.3 1006324 43924 ?       Sl   23:35   0:01 /usr/bin/mongod --auth -f /etc/mongod.conf

root       3547  0.0  0.0 112676   980 pts/0    S+   23:36   0:00 grep --color=auto mong

[root@am-01:~#] mongo -u'admin' -p'admin122' --authenticationDatabase 'admin'

MongoDB shell version v3.6.4

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.6.4

> use admin

switched to db admin

> show users

{

"_id" : "admin.admin",

"user" : "admin",

"db" : "admin",

"customData" : {

"description" : "superuser"

},

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

#注意点,创建用户的时候针对的是一个库,所以登陆的时候也要指定库名("use 库名"会自动创建库)

再次实验去了解库和用户的关系

> use db1

switched to db db1

> db.createUser({user:"test1",pwd:"123456",roles:[{role:"readWrite",db:"db1"},{role:"read",db:"db2"}]})

Successfully added user: {

"user" : "test1",

"roles" : [

{

"role" : "readWrite",

"db" : "db1"

},

{

"role" : "read",

"db" : "db2"

}

]

}

#创建库 db1 并进入,创建针对 db1 库和 db2 库的用户 test1,此用户对 db1 库读写,对 db2 库只读

#先 use db1,表示用户在 db1 库中创建,就一定要 db1 库验证身份,即用户的信息跟随随数据库。比如上述 test1 虽然有 db2 库的读取权限,但是一定要先在 db1 库进行身份验证,直接访问会提示验证失败

> use db1

switched to db db1

> db.auth("test1","123456")

1

> use db2

switched to db db2

> show users

#进入 db1 库,在 db1 库中,test1 进行验证之后,就可以 use db2,这时可以使用 test1 在 db2 库中的只读权限了

MongoDB 用户角色

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile

userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限

dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。

root:只在 admin 数据库中可用。超级账号,超级权限