weekeight.github.io icon indicating copy to clipboard operation
weekeight.github.io copied to clipboard

Linux mongodb 环境搭建与初始配置

Open weekeight opened this issue 7 years ago • 0 comments

前言

MongoDB 是一个面向文档的通用型数据库,拥有 MySQL 等关系型数据库常用功能。除了能够创建、读取、更新和删除数据之外,也还提供了一些拓展的功能,如索引、聚合、特殊的集合类型(如时间有限的集合)、分片和集群,是一个易于使用、便于拓展的数据库。也正因为它的这些特性,也是前端童鞋使用得比较多的一种数据库。蚂蚁金服的Basement Object 数据存储也是类似 MongoDB 的一种存储方式。

下面我们来看看如何在 Linux 系统(以 centos 系统为例)下快速地搭建起 MongoDB 服务并投入使用。

安装

MongoDB 有两个版本类型:开源社区版(Community Edition)和企业版(Enterprise),功能上两者并没有什么区别,企业版主要是提供了更多的管理服务,有更高级的安全性,如LDAP 身份验证、Red Hat 标识管理认证。这里主要讨论开源社区版。 官方提供了mongodb-org软件包,其中包含了 MongoDB 几乎所有所需功能,使用系统自带的yum软件包管理器可以非常方便地进行安装:

配置资源库

为了确保系统能直接从指定地址获取软件包,创建/etc/yum.repos.d/mongodb-org-3.4.repo文件,填入如下内容配置 MongoDB 资源库:

[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

执行安装命令

sudo yum install -y mongodb-org

系统配置

Linux 默认会限制系统资源的使用,如进程创建的子进程数量、网络连接数等,这样可以防止单个用户占用过多的系统资源,可通过 ulimit -n <value> 来根据自己需求设置,具体可参考UNIX ulimit Settings

启动

MongoDB 安装完后,默认会生成很多命令,如 mongo、mongod、mongodump、mongooplog等。其中比较常用的有 mongod(用于启动 MongoDB 服务器)、mongo(提供强大的类似 javascript 环境的 mongo shell 交互式功能)。 如果简单地通过执行 mongod 命令来启动 MongoDB 服务器,则无法使它在后台运行,控制台关了服务也自动停止了,也无法快速启动指定配置的服务,更不能做到开机自启动。Centos 提供了 service 命令来帮我们快速地启动一些服务,不过它其实就是跑一个指定的 shell 脚本。当我们输入 service 命令时,linux 会去 /etc/rc.d/init.d 下去找这个脚本运行,init.d 下面放了很多这种脚本(如常见的 httpd)。而当我们需要设置开机自启动时也可以通过 chkconfig 命令来设置这些系统服务开机时启动。

MongoDB 安装完后默认会在 /etc/rc.d/init.d 下生成启动脚本 mongod,所以我们可以通过下面命令启动 MongoDB 服务器:

sudo service mongod start 

如需要设置开机自启动可以执行下面脚本:

sudo chkconfig mongod on

访问 /var/log/mongodb/mongod.log 日志文件,如果看到 [initandlisten] waiting for connections on port <port> 的日志则说明启动成功。

MongoDB 设置

每个 mongod 服务器进程都需要有自己的数据存储路径,默认是 /var/lib/mongo。如果需要启动多个服务器进程,则可以指定不同的路径来启动。启动的默认配置文件是 /etc/mongod.conf,我们可通过这个配置文件实现所需配置:Configuration File Options

# 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:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile

# network interfaces
net:
  port: 27017
 bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
 
#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

有一个需要注意的配置是 net 下的 bingIp,如果设置 bindIp: 127.0.0.1 则外网机器无法直接连接此服务器进程。

认证授权

MongoDB 服务器进程默认启动后,并无任何认证机制,即任何用户都可随意连接数据库进行读写操作。MongoDB 有个比较特殊的数据库 admin,专门用来存储数据库管理员信息的。在 MongoDB 里是有不同的角色的,每种角色只能拥有相应的权限,用户也能自定义角色。MongoDB Built-In Roles 为了启用认证机制,我们需要创建两个用户:拥有 userAdminAnyDatabase 角色的用户、对应数据库读写权限 readWrite 的用户,如:

先启动不需要认证的服务器进程,用 mongo shell 直接进入配置:

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

修改 /etc/mongod.conf 配置,加入下面配置并重启,则启动了需要认证才能操作数据库的服务器进程:

security:
  authorization: "enabled"

通过 mongo 命令进入 shell 后,选择对应的数据库,加入拥有 readWrite 权限的用户:

use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" }]
  }
)

重启:

sudo service mongod restart 

连接指定远程数据库

通过上述配置和启动完成后,可以在其他机器通过命令来远程连接到启动的 MongoDB 服务器进程,并在 mongo shell 里做相应的数据库操作:mongo shell

mongo serverip:port/dbname -u username -p password

weekeight avatar May 31 '17 16:05 weekeight