前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在CentOS7下安装MongoDB

在CentOS7下安装MongoDB

作者头像
端碗吹水
发布2020-09-23 12:20:51
7480
发布2020-09-23 12:20:51
举报
文章被收录于专栏:程序猿的大杂烩
  • 21.26 mongodb介绍
  • 21.27 mongodb安装
  • 21.28 连接mongodb
  • 21.29 mongodb用户管理

mongodb介绍

MongoDB是一个基于分布式文件存储的数据库,属于文档型的,虽然也是NoSQL数据库的一种,但是与redis、memcached等数据库有些区别。MongoDB由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。

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

MongoDB官网地址,目前最新版是3.6:

https://www.mongodb.com/

关于JSON的描述可以参考以下文章:

http://www.w3school.com.cn/json/index.asp

特点:

  • 面向集合存储,易存储对象类型的数据
  • 模式自由
  • 支持动态查询
  • 支持完全索引,包含内部对象
  • 支持查询
  • 支持复制和故障恢复
  • 使用高效的二进制数据存储,包括大型对象(如视频等)
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
  • 文件存储格式为BSON(一种JSON的扩展)
  • 可通过网络访问

不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下图是MongoDB和关系型数据库的术语以及概念的对比:

以下使用两张图对比一下关系型数据库和MongoDB数据库的数据存储结构: 关系型数据库数据结构:

MongoDB数据结构:


安装MongoDB

首先上官方的安装文档:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

mongodb可以通过yum安装,首先需要创建官方提供的yum源: 1.进入/etc/yum.repos.d/目录下:

代码语言:javascript
复制
cd /etc/yum.repos.d/

2.编辑配置文件加入以下内容:

代码语言:javascript
复制
[root@localhost /etc/yum.repos.d]# vim mongodb-org-3.6.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

3.编辑完成之后查看是否有mongodb相关的rpm包:

代码语言:javascript
复制
[root@localhost /etc/yum.repos.d]# yum list |grep mongodb
collectd-write_mongodb.x86_64             5.8.0-1.el7                  epel     
mongodb.x86_64                            2.6.12-4.el7                 epel     
mongodb-org.x86_64                        3.6.1-1.el7                  mongodb-org-3.6
mongodb-org-mongos.x86_64                 3.6.1-1.el7                  mongodb-org-3.6
mongodb-org-server.x86_64                 3.6.1-1.el7                  mongodb-org-3.6
mongodb-org-shell.x86_64                  3.6.1-1.el7                  mongodb-org-3.6
mongodb-org-tools.x86_64                  3.6.1-1.el7                  mongodb-org-3.6
mongodb-server.x86_64                     2.6.12-4.el7                 epel     
mongodb-test.x86_64                       2.6.12-4.el7                 epel     
nodejs-mongodb.noarch                     1.4.7-1.el7                  epel     
php-mongodb.noarch                        1.0.4-1.el7                  epel     
php-pecl-mongodb.x86_64                   1.1.10-1.el7                 epel     
poco-mongodb.x86_64                       1.6.1-2.el7                  epel     
syslog-ng-mongodb.x86_64                  3.5.6-3.el7                  epel     
[root@localhost /etc/yum.repos.d]#

如上,可以看到yum源中已经有mongodb3.6的rpm包。

4.然后就是直接yum安装了:

yum install -y mongodb-org

5.在命令行上输入mongo,然后按两下tap键,出现以下命令代表安装成功:

代码语言:javascript
复制
[root@localhost ~]# mongo
mongo         mongodump     mongofiles    mongoperf     mongos        mongotop      
mongod        mongoexport   mongoimport   mongorestore  mongostat     
[root@localhost ~]# 

连接mongodb

1.先看一下mongodb的配置文件:

代码语言:javascript
复制
[root@localhost ~]# vim /etc/mongod.conf
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:  # 这里是定义日志文件相关的
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:   # 数据存储目录相关
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:  # pid文件相关
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:  # 定义监听的端口以及绑定的IP,IP可以有多个使用逗号分隔即可
  port: 27017
  bindIp: 127.0.0.1,192.168.77.130  # Listen to local interface only, comment to listen on all interfaces.

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

2.启动 mongod 服务:

代码语言:javascript
复制
[root@localhost ~]# systemctl start mongod
[root@localhost ~]# ps aux |grep mongod
mongod     9283  1.7  2.4 1003888 45700 ?       Sl   19:32   0:00 /usr/bin/mongod -f /etc/mongod.conf
root       9307  0.0  0.0 112668   972 pts/0    S+   19:33   0:00 grep --color=auto mongod
[root@localhost ~]# netstat -lntp |grep mongod
tcp        0      0 192.168.77.130:27017    0.0.0.0:*               LISTEN      9359/mongod  
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      9359/mongod 
[root@localhost ~]#

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

mongo --port 27018

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

代码语言:javascript
复制
[root@localhost ~]# mongo
MongoDB shell version v3.6.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.1
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
Server has startup warnings: 
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] 
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] 
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] 
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] 
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-01-05T19:40:00.498+0800 I CONTROL  [initandlisten] 
2018-01-05T19:42:05.011+0800 E -        [main] Error loading history file: FileOpenFailed: Unable to fopen() file /root/.dbshell: No such file or directory
> 

可以看到,报了一个错误信息没有找到/root/.dbshell,这个没关系,等你里面输入了命令后就会自动生成,这个文件是用来记录命令历史的。其他的警告信息不用管,不影响使用。

连接远程的mongodb,需要加--host来指定目标IP,例如:

[root@localhost ~]# mongo --host 192.168.77.130 --port 27017

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

mongo -uusername -ppasswd --authenticationDatabase db

mongodb用户管理

1.进入到MongoDB里,切换到admin库,因为得到admin库里才能进行用户相关的操作:

代码语言:javascript
复制
> use admin
switched to db admin
>

2.创建用户:

代码语言:javascript
复制
> 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"
        }
    ]
}
>

以上我们创建了一个admin用户,user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,role相当于指定权限,db指定库名,创建用户时必须针对一个库。

3.列出所有的用户:

代码语言:javascript
复制
> db.system.users.find()
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "CXds+L1Twxyf9qlKGrxVpQ==", "storedKey" : "s3hGUltMdhQYAF8nR8eNnVxlE7Q=", "serverKey" : "SDwyYVdnUZew1suc+g9oZZx9Has=" } }, "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
>

4.查看当前库下所有的用户

代码语言:javascript
复制
> show users
{
    "_id" : "admin.admin",
    "user" : "admin",
    "db" : "admin",
    "customData" : {
        "description" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}
>

5.删除用户:

代码语言:javascript
复制
# 先创建一个用户
> db.createUser({user:"zero",pwd:"123aaa",roles:[{role:"read",db:"testdb"}]})
Successfully added user: {
    "user" : "zero",
    "roles" : [
        {
            "role" : "read",
            "db" : "testdb"
        }
    ]
}
# 删除用户
> db.dropUser("zero")
true   # 返回true意为成功

# 可以看到zero用户不存在了
> show users
{
    "_id" : "admin.admin",
    "user" : "admin",
    "db" : "admin",
    "customData" : {
        "description" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}
>

6.以上我们创建了一个admin用户,但是若要用户生效,还需要编辑启动脚本vim /usr/lib/systemd/system/mongod.service,在OPTIONS=后面增--auth:

代码语言:javascript
复制
[root@localhost ~]# vim /usr/lib/systemd/system/mongod.service

# 将这句:
Environment="OPTIONS=-f /etc/mongod.conf"

#修改为:
Environment="OPTIONS=--auth -f /etc/mongod.conf"

重启服务:

代码语言:javascript
复制
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart mongod
[root@localhost ~]# !ps
ps aux |grep mongod
mongod     9966  3.4  2.3 1003884 43004 ?       Sl   21:05   0:00 /usr/bin/mongod --auth -f /etc/mongod.conf
root       9994  0.0  0.0 112668   976 pts/0    S+   21:05   0:00 grep --color=auto mongod
[root@localhost ~]#

7.使用admin用户登录MongoDB:

代码语言:javascript
复制
[root@localhost ~]# mongo -u "admin" -p "admin122" --authenticationDatabase "admin" --host 192.168.77.130 --port 27017

8.再来创建一个用户:

代码语言:javascript
复制
> use db1  # 当use一个不存在的库时会自动创建
switched to db db1
> db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )  # 可以有不同的角色针对不同的库
Successfully added user: {
    "user" : "test1",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "db1"
        },
        {
            "role" : "read",
            "db" : "db2"
        }
    ]
}
> show users  # 因为在db1这个库里创建的用户,就只能在这个库里show出来
{
    "_id" : "db1.test1",
    "user" : "test1",
    "db" : "db1",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "db1"
        },
        {
            "role" : "read",
            "db" : "db2"
        }
    ]
}
>

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

在db1中验证身份:

代码语言:javascript
复制
> use db1
switched to db db1
> db.auth("test1", "123aaa")
1

# 验证完之后才可以在db2库中进行相关的操作
> use db2
switched to db db2
> show users
>

关于MongoDB用户角色:

role

含义

read

允许用户读取指定数据库

readWrite

允许用户读写指定数据库

dbAdmin

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

userAdmin

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

clusterAdmin

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

readAnyDatabase

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

readWriteAnyDatabase

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

userAdminAnyDatabase

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

dbAdminAnyDatabase

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

root

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/01/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mongodb介绍
  • 安装MongoDB
  • 连接mongodb
  • mongodb用户管理
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档