之前认识了两种相同类型的缓存技术(关系型数据库)memcached 和 Redis, MongoDB是与之前两款完全不同的一个类型的缓存技术!称之为:文档型数据库!
提到文档,一个新概念JSON,MongoDB的文档类似于JSON对象!
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
来看一下JSON文档:
{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}
文档型数据库,类似于JSON,且是分布式结构,支持横向扩展!
MongoDB支持yum安装,但是版本比较老,所以我们使用创建一个新的扩展源来安装。
cd /etc/yum.repos.d/
vim mongodb.repo
//加入如下内容
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
--------------------------
yum list |grep mongodb //可以看到mongodb相关的rpm包
yum install -y mongodb-org
systemctl start mongod //启动服务
vim /etc/mongod.conf //查看配置文件
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,192.168.59.131 # Listen to local interface only, comment to listen on all interfaces.
如上添加IP 的时候一定需要用 逗号 分开!
[[email protected] ~]# systemctl restart mongod
[[email protected] ~]# mongo --host 192.168.59.131 --port 27017
然后就可以使用配置的IP地址去连接!
mongo --port 27018
mongo --host 127.0.0.1
mongo -uusername -ppasswd --authenticationDatabase db //这个和MySQL挺像
use admin //需要切换到admin库
创建一个新的用户并指定角色和密码等!
db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )
user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,db指定库名
再次增加一个测试用户:
> db.createUser({user:"asd",pwd:"asd9577",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
"user" : "asd",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
关于 MongoDB 角色:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
列出所有用户,需要切换到admin库
db.system.users.find()
查看当前库下所有的用户
show users
删除用户
db.dropUser('admin')
若要用户生效,还需要编辑启动脚本
vim /usr/lib/systemd/system/mongod.service
在OPTIONS=后面增--auth
Environment="OPTIONS=--auth -f /etc/mongod.conf"
[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart mongod
[[email protected] ~]# ps aux | grep mongod
mongod 5258 5.1 4.0 971176 40728 ? Sl 17:45 0:00 /usr/bin/mongod --auth -f /etc/mongod.conf
root 5283 0.0 0.0 112668 968 pts/0 R+ 17:45 0:00 grep --color=auto mongod
使用授权的用户登录格式如下:
mongo -u "admin" -p "asd9577" --authenticationDatabase "admin"
如果不使用账号和密码的方式再去登录就会报错:
> show users
2017-10-17T17:48:50.903+0800 E QUERY [thread1] Error: not authorized on admin to execute command { usersInfo: 1.0 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1539:1
shellHelper.show@src/mongo/shell/utils.js:752:9
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
可以看到受限!
创建一个账户可以同时针对两个库授权: test1用户对db1库读写,对db2库只读。
db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随随数据库。比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。
use db2
db.auth("test1", "123aaa")
但是当我I们再次使用db1 去验证那一定是可以的!
> db.auth("test1","123aaa")
1