MongoDB数据库的安装及基本配置使用(CentOS7)

技术运维MongoDB 594

在CentOS7上安装MongoDB

注意:笔者测试环境CentOS7,为了偷懒和内容的简洁性直接使用的root用户,如果你使用非root用户需要在命令前加上sodu

本文将指导你在CentOS7中安装MongoDB数据库

更新系统

yum update

添加MongoDB仓库

2018年11月23日更新:

当前版本已经是4.X,以4.0为例,这里需要做出一些修改

vi /etc/yum.repos.d/mongodb-org-4.0.repo

输入以下内容

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

以下内容为历史版本,仓库源已失效:

我们安装的MongoDB版本为3.2(最新版本为3.6),首先我们需要建立一个Repository文件 /etc/yum.repos.d/mongodb-org-3.2.repo 为接下来yum安装做装备

vi /etc/yum.repos.d/mongodb-org-3.2.repo

文件内容

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

保存并退出.

安装MongoDB

Repository仓库我们已经添加好了,现在可以直接用yum命令来安装

yum install mongodb-org

mongodb-org包会在你的系统中自动安装以下内容:

  • mongodb-org-server - MongoDB服务端,守护进程和相关的配置和初始化脚本
  • mongodb-org-mongos - mongos进程
  • mongodb-org-shell - MongoDB shell命令行工具
  • mongodb-org-tools - 包含了大量基础工具,包含数据备份/导入/导出等功能

配置MongoDB

MongoDB的本地配置文件位于 /etc/mongod.conf 使用的是YAML格式书写

  • systemLog 配置各种日志选项,包含:
    • destination 让MongoDB将日志保存为文件还是以syslog方式存储
    • logAppend 服务重启后日志在旧文件中追加还是新建日志文件
    • path 日志文件的目录配置默认为 /var/log/mongodb/mongod.log
  • storage 配置MongoDB数据存储项,包含:
    • dbPath 数据文件的存储位置,默认为 /var/lib/mongo
    • journal.enabled 启用或关闭操作日志的记录,防止数据丢失。
  • net 网络配置,包含:
    • port MongoDB的监听端口
    • bindIP 绑定IP地址,便于从其他应用程序连接

这些是一些非常基础的默认配置

重点推荐:关于安全认证的配置

MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意Mongodb 端口(默认 27017)的开放状态,那么Mongodb就会产生安全风险,被利用此配置漏洞,入侵数据库。

修改文件 /etc/mongod.conf 取消security 的注释并添加

security:
  authorization: enabled

授权选项配置,允许数据库基于角色的访问控制。如果不做修改任何用户都可以修改任何数据库。

每次修改配置后别忘记重启服务

用户资源配置管理

基础命令

echo "mongod     soft    nofiles   64000" >> /etc/security/limits.conf
echo "mongod     soft    nproc     64000" >> /etc/security/limits.conf

官方推荐的配置

详细参数

username|@groupname type resource limit
  • username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
  • type:有soft,hard以及-,soft指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft的限制不能比hard限制高。用-就表明同时设置了soft和hard的值。
  • resource
    • core - 限制内核文件的大小
    • date - 最大数据大小
    • fsize - 最大文件大小
    • memlock - 最大锁定内存地址空间
    • nofile - 打开文件的最大数目
    • rss - 最大持久设置大小
    • stack - 最大栈大小
    • cpu - 以分钟为单位的最多CPU时间
    • noproc - 进程的最大数目
    • as - 地址空间限制
    • maxlogins - 此用户允许登录的最大数目

要使limits.conf文件配置生效,必须要确保 pam_limits.so文件被加入到启动文件中。

查看 /etc/pam.d/login 文件中有:(没有就添加)

session required /lib/security/pam_limits.so

注意:好多人设置了limitc.conf没有测试,测试后发现没有生效

  • 32位系统 session required /lib/security/pam_limits.so
  • 64位系统 session required /lib64/security/pam_limits.so

MongoDB服务管理(启动/重启/停止)

sudo systemctl start mongod
sudo systemctl restart mongod
sudo systemctl stop mongod

开机自启动

systemctl enable mongod

创建数据库用户

如果你在MongoDB配置中启用了基于角色的访问控制(authorization),我们需要创建一个存储用户信息的数据库:

1. 打开MongoDB Shell命令行工具

mongo

2. MongoDB默认会连接到名为test的数据库,在创建任何用户前我们需要创建一个名为admin数据库来存储用户数据:

use admin

3. 使用以下命令创建一个可以管理任意用户的超级管理员(安全起见,请自行更改 mongo-adminpassword的值)

db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})

创建成功后它会显示你刚刚创建的用户信息(除了密码)

Successfully added user: {
    "user" : "mongo-admin",
    "roles" : [
            {
                "role" : "userAdminAnyDatabase",
                "db" : "admin"
            }
    ]
}

4. 退出MongoDB Shell

quit()

第一次创建完管理员用户记得重启一下mongod服务。

5. 测试使用上面第三步中创建的用户来登录admin数据库

mongo -u mongo-admin -p --authenticationDatabase admin

是不是和MySql很像?但是要注意authenticationDatabase参数,如果没有这个参数的话仅可访问,而不可以连接数据库.

另一种验证方法(客户端连接后验证)

mongo --port 27017

use admin
db.auth("mongo-admin", "password")

// 输出 1 表示验证成功

6. 我们刚刚创建了超级管理员,现在我们创建一个数据库user-data及其用户

use user-data

7. 创建数据库user-data的用户example-user,并做权限控制,对user-data数据库仅赋予只读权限,对exampleDB数据库具有读写权限

(请自行修改example-user和password的值)

db.createUser({user: "example-user", pwd: "password", roles:[{role: "read", db: "user-data"}, {role:"readWrite", db: "exampleDB"}]})

创建数据库及其用户只需要按照步骤6,7操作即可

8 退出MongoDB Shell

quit()

管理数据和集合Collections

集合(Collections)就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

通过下面的步骤我们来创建一个集合

1. 打开MongoDB Shell使用我们上面创建的example-user登录

mongo -u example-user -p --authenticationDatabase user-data

2. 创建一个名为exmpleDB的数据库

use exampleDB

注意数据库及用户权限的管理,参考上一段创建数据库用户的第7步.

查看当前数据库使用db命令,显示全部数据库使用 show dbs

3. 创建一个名文exampleCollection的集合

db.createCollection("exampleCollection", {capped: false})

4. 创建两条数据记录

var a = { name : "John Doe",  attributes: { age : 30, address : "123 Main St", phone : 8675309 }}
var b = { name : "Jane Doe",  attributes: { age : 29, address : "321 Main Rd", favorites : { food : "Spaghetti", animal : "Dog" } }}

注意:上面两条记录的数据结构并不一样,这是NoSQL数据库的一个优势

5. 将数据插入exampleCollection集合,使用insert() 方法

db.exampleCollection.insert(a)
db.exampleCollection.insert(b)

每次执行成功后会返回信息

WriteResult({ "nInserted" : 1 })

6. 查看合集

show collections

该命令会显示所有合集,由于我们刚才仅创建了一个exampleCollection合集,所以这里显示了

exampleCollection

7. 从集合中查找数据,我们需要使用find()方法,这和关系型数据库select * from table一样,会查找出这个集合/表的所有数据

db.exampleCollection.find()

得到结果

{ "_id" : ObjectId("571a3e7507d0fcd78baef08f"), "name" : "John Doe" }
{ "_id" : ObjectId("571a3e8707d0fcd78baef090"), "age" : 30 }

这时候你应该注意到这里多了一组key为"_id",value为"ObjectId()"的键值,这是当用户没有定义_id的时候MongoDB会自动为其创建唯一索引.

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。

在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。

根据条件查找

db.exampleCollection.find({"name" : "John Doe"})

系统会返回符合{"name" : "John Doe"}的所有数据

关于集合更多的帮助可以使用help()命令来获取

db.exampleCollection.find().help()

Post Comment