一、安装mongodb
安装过程,参考:
版本更新可以及时跟踪官网:
https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/
1.导入包管理系统使用的公钥
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
2.为MongoDB创建一个列表文件
根据版本创建/etc/apt/sources.list.d/mongodb-org-3.4.list 列表文件
Ubuntu 14.04
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
Ubuntu 16.04
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
3.更新本地包数据库
sudo apt-get update
4.安装最新版本的MongoDB
sudo apt-get install -y mongodb-org
5.查看配置文件,留意下security这个参数,接下来的用户身份验证会用到。
配置文件mongod.conf所在路径: /etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb #数据库存储路径
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true #以追加的方式写入日志
path: /var/log/mongodb/mongod.log #日志文件路径
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 #绑定监听的ip 127.0.0.1只能监听本地的连接,可以改为0.0.0.0
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
6.启动和关闭MongoDB
sudo service mongod start # 启动
sudo service mongod stop # 关闭
ps aux | grep mongod # 查看守护进程mongod的运行状态
二、配置用户
安装完成后的MongoDB默认是没有开启用户验证的,也就是说任何人登陆进去都有超级管理员权限,我们需要启动访问控制,对用户身份进行验证。在启动访问控制前,我们先创建一个超级用户root,以后可以通过超级用户进行其他用户的新增和更改等操作,root用户是超级用户,拥有所有权限,如果只想有一个可以设置所有用户角色权限的用户,也可以将roles设置为userAdminAnyDatabase,该角色可以在所有数据库里创建、删除和管理用户。创建用户的代码如下:
> use databasename
switched to db databasename
> db.createUser(
... {
... user: "dba",
... pwd: "dba",
... roles: [ { role: "root", db: " databasename" } ]
... }
... )
成功会提示
Successfully added user: {
"user" : "dba",
"roles" : [
{
"role" : "root",
"db" : " databasename "
}
]
}
上述指令中,user和pwd参数是用户名和密码,我们着重说一下roles参数,这个参数决定了新增用户的权限。MongoDB有一些内置角色如下:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system(不建议使用)
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
概括来说,就是user有关的,如userAdmin、userAdminAnyDatabase是操作用户的,可以进行用户的创建删除修改,不能操作数据库对象和数据库读写;db有关的,如dbAdmin、dbAdminAnyDatabase是操作数据库对象的,不能操作用户和数据库读写;与read、write有关的,是进行读写等操作的,不能操作用户和数据库对象。对于单个数据库,还有一个dbOwner角色,它拥有该数据的所有权限,包括dbAdmin,readWrite,userAdmin。
MongoDB用户权限分配的操作是针对某个库来说的,所以可以看到上述创建角色的过程中,roles里面有一个数据库db参数。即使是一些对所有数据库有权限的角色如userAdminAnyDatabase,也要在新增的时候指定db参数为“admin”
root用户创建成功后,修改/etc/mongod.conf文件,将security的值设置为authorization: enable
重启mongod服务:service mongod restart
我们开启了用户验证后,不做登录限制的情况下,虽然任何人都可以进入mongodb服务,但是没有进行用户验证就不能进行数据库操作。
用户验证有两种方式
1、先连接再验证,先进入mongod服务,然后到用户所在的数据库下,执行db.auth(“username”,”pwd”)进行用户身份验证,返回1表示成功
2、在连接过程中验证,语法是:
mongo --port 27017 -u "username" -p "pwd" --authenticationDatabase "dbname"
之后我们就可以通过root用户新增其他用户,命令和之前的一样。
添加用户成功后,我们到用户所在的数据库下,进行用户身份认证,就可以以该用户的身份进行对应权限的数据库操作。
验证用户身份的指令之一db.auth(“username”,”pwd”)
也可以在mongodb内切换用户,但是我在具体实践过程中发现,从root用户切换到另一个coffee用户,虽然身份认证成功了,但是权限并没有及时更新,建议需要切换数据库用户的时候,先退出mongod,再进去用另一个用户进行验证操作。
还有,用户在哪里创建就在哪里验证比如你在admin数据库下创建了test1数据库下的user1和test2数据库下的user2,需要先在admin数据库下验证用户,再去对应的数据库进行操作。
如果需要变更用户的信息,用有权限的用户账号登录操作
修改用户指令(不支持更改用户名)
db.updateUser(
"username",
{ pwd: "newPass",
roles: [{ role: “newRole”, db: “dbName”}]
}
)
总结一下,用户配置的过程
安装mongodb默认不开启用户认证 ——> 创建一个root超级用户 ——> 修改配置文件,开启用户认证,重启mongod服务 ——> 用root用户新增其他用户 ——> 其他用户连接验证进行数据库操作
三、远程连接
1、修改配置文件
vim /etc/mongod.conf
把bindIp: 127.0.0.1,改成bindIpAll: true表示对所有ip开放访问权限
2、重启mongod服务
service mongod restart
3、防火墙开放27017端口
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT
4、接下来我们就可以进行远程连接了
有两种方式验证
(1)用可视化工具,我用的是Studio 3T(MongoChef),新建连接输入对应的ip和用户信息,验证连接成功
(2)用另一台服务器登录
mongo xx.xx.xx.xx(ip地址):27017
这个登陆到的是mongodb/test数据库
用特定用户登录
mongo xx.xx.xx.xx:27017/admin –u username -p
关于bindIp的配置,我用的mongo4.0.1,自己试了一下,测试的结果是bindIp:0.0.0.0和bindIpAll: true可以实现远程连接,直接注释掉bingdIp不能实现远程连接,注意,参数值前要有空格,否则无法生效
四、遇到的问题
记录一些安装过程中出现的问题,连接问题请务必确保在阿里云(或你的服务器平台)上配置了安全组规则,开放了27017端口
1、启动mongo服务(service mongod start)的时候报错Failed to start mongod.service: Unit not found
解决方法:
(1)创建配置文件
sudo nano /etc/systemd/system/mongodb.service
(2)添加文本
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
[Install]
WantedBy=multi-user.target
(3)Ctrl + X 退出
(4)启动服务
sudo systemctl start mongodb
sudo systemctl status mongodb
2、启动mongo(mongo --bind_ip "" --port 27017 -u "username" -p "pwd" --authenticationDatabase "dbname")的时候报错
解决方法
(1)查看保存数据库的目录是否存在
ls -ld /data/db
如果提示目录不存在的话就要在根目录下创建一个
sudo mkdir /data/db
(2)启动MongoDB的同时指定数据库保存在什么地方
mongod --dbpath /data/db
指令执行完成后,我们就可以正常启动mongo了
参考资料:
http://blog.51cto.com/ovcer/1416906