一、安装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

远程方位mongodb桌面工具 mongodb开启远程连接_mongodb

    重启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