weekeight.github.io
weekeight.github.io copied to clipboard
Linux mongodb 环境搭建与初始配置
前言
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