本教程的早期版本由Melissa Anderson编写。
介绍
MongoDB,也称为Mongo,是许多现代 Web 应用程序中使用的开源文档数据库。它被归类为NoSQL 数据库,因为它不依赖于传统的基于表的关系数据库结构。
相反,它使用具有动态模式的类似 JSON 的文档,这意味着与关系数据库不同,MongoDB 在向数据库添加数据之前不需要预定义的模式。您可以随时根据需要随时更改架构,而无需使用更新的架构设置新数据库。
在本教程中,您将在 CentOS 8 服务器上安装 MongoDB,对其进行测试,并了解如何将其作为systemd
服务进行管理。
先决条件
要完成本教程,您需要一台运行 CentOS 8 的服务器。该服务器应具有具有管理权限的非 root 用户和配置为firewalld
. 要进行设置,请遵循我们的 CentOS 8 初始服务器设置指南。
第 1 步 – 安装 MongoDB
在标准 CentOS 存储库中没有可用的官方 MongoDB 包。为了在您的服务器上安装 Mongo,您需要添加一个指向 MongoDB 官方存储库的存储库文件。您的包管理器将在搜索包时读取此文件,并能够使用它来安装 Mongo 及其任何依赖项。
在本指南中,我们将使用 DNF 包管理器安装 Mongo,因此您需要将存储库文件添加到/etc/yum.repos.d/
目录中。.repo
在搜索包源时,DNF 会检查此目录中以后缀结尾的所有文件。
您可以使用vi
——默认安装在 CentOS 系统上的广泛使用的文本编辑器——来创建存储库文件,但vi
对于没有使用它的用户来说可能有点不直观。作为替代方案,我们建议nano
使用标准 CentOS 软件库提供的更加用户友好的编辑器。
要nano
使用 DNF安装,请运行以下命令:
- sudo dnf install nano
在此安装过程中,系统会要求您确认是否要安装该软件。为此,请按y
,然后按ENTER
:
OutputTransaction Summary
================================================================================
Install 1 Package
Total download size: 581 k
Installed size: 2.2 M
Is this ok [y/N]: y
安装完成后,运行以下命令创建并打开存储库文件进行编辑:
- sudo nano /etc/yum.repos.d/mongodb-org.repo
然后将以下内容添加到空文件中。这将安装MongoDB 4.4版(撰写本文时的最新版本):
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
注意:您可以通过查阅数据库的官方文档来检查是否有更新版本的 MongoDB 可用。在 Web 浏览器中,导航到MongoDB 的RedHat 和 CentOS 安装说明的配置包管理系统部分。
在那里,您将找到一个代码块,其中包含最新版本 MongoDB 的存储库信息。如果与之前的文件内容不同,您可以复制该配置并将其添加到您的.repo
文件中。
以下是每个指令的作用:
[mongodb-org]
:.repo
文件的第一行是一个单独的字符串,用括号括起来,作为存储库的标识符name
:该指令定义了一个人类可读的名称来描述存储库。您可以在此处输入您喜欢的任何名称,但为了清楚起见,您可以输入MongoDB Repository
baseurl
: 这指向一个目录的 URLrepodata
,其中可以找到存储库的目录,其中包含存储库的元数据gpgcheck
: 将此指令设置为1
告诉 DNF 包管理器在此存储库上启用 GPG 签名检查,要求它验证您要从中安装的任何包是否已损坏或篡改enabled
: 将此指令设置为1
将告诉 DNF 将此存储库作为包源包含在内;将其设置为0
将禁用此行为gpgkey
:此指令指定应导入以验证此存储库中的包的签名的 GPG 密钥的 URL
添加存储库信息后,保存并关闭文件。如果您曾经nano
创建过 repo 文件,请按CTRL + X
、Y
、来创建ENTER
。
在继续之前,您可以通过运行程序的repolist
命令来测试 DNF 是否能够找到并使用此存储库:
- dnf repolist
如果存储库可用于您的服务器的包管理器,您会发现它列在输出中:
Outputrepo id repo name
AppStream CentOS-8 - AppStream
BaseOS CentOS-8 - Base
extras CentOS-8 - Extras
mongodb-org MongoDB Repository
之后,您可以mongodb-org
使用以下命令安装软件包:
- sudo dnf install mongodb-org
再次,您将被要求通过按y
then来确认您要安装该软件包ENTER
。DNF 也可能会要求您确认导入 Mongo 的签名密钥;如果是这种情况,请再次按y
,然后按ENTER
。
命令完成后,MongoDB 将安装在您的服务器上。但是,在启动数据库之前,MongoDB 文档建议您禁用服务器上的透明大页面以优化性能。
第 2 步 – 禁用透明大页面以提高性能
CentOS 默认启用透明大页面 (THP),这是一种 Linux 内存管理系统。THP 使用超大内存页来减少翻译后备缓冲区查找对具有大量内存的机器的影响。但是,此系统会对数据库性能产生负面影响,MongoDB 文档建议您禁用 THP。
要在 CentOS 8 上禁用透明大页面,您可以创建一个systemd
将在启动时禁用它的单元文件。systemd
是许多 Linux 操作系统中使用的初始化系统和软件套件,您可以使用它来控制服务器的许多方面。在 systemd 中,单元指的是系统知道如何操作和管理的任何资源。单元文件是定义这些资源之一的特殊配置文件。
在/etc/systemd/system/
具有sudo
权限的目录中创建此文件:
- sudo nano /etc/systemd/system/disable-thp.service
在该文件中,您需要添加几个单独的部分。您将添加的[Unit]
第一个部分是包含有关服务单元的一些一般信息的部分。
添加以下突出显示的行:
[Unit]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target local-fs.target
Before=mongod.service
在[Unit]
节标题之后是以下选项:
Description
:这为单元定义了一个人类可读的名称After
:这可确保disable-thp
服务单元仅在两个指定目标 (预定义的systemd
单元组)完成启动后才启动Before
: 此选项确保disable-thp
服务始终mongod
在 MongoDB 服务单元启动之前完成启动
接下来,将突出显示的[Service]
部分添加到文件中:
. . .
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
本节的Type
选项定义了这个单元将是一个oneshot
类型进程,这意味着它将是一个一次性任务,systemd
应该等待进程退出才能继续。
该ExecStart
选项用于指定将启动进程的命令的完整路径和任何参数。此处包含的命令将打开一个 shell 进程,然后在单引号之间运行该命令。此命令回显字符串never
,然后将其通过管道传输到以下tee
命令中。tee
然后,该命令将/sys/kernel/mm/transparent_hugepage/enabled
文件重写never
为唯一的内容,并将任何输出传递给/dev/null
,一个空设备会立即丢弃写入其中的任何信息。这实际上将禁用 THP。
之后,添加此突出显示的[Install]
部分:
. . .
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
[Install]
部分携带装置的安装信息。本节只有一个选项,WantedBy
,它会在disable-thp
启动时导致设备basic.target
启动。
注意:如果您想了解有关systemd
单元和服务的更多信息,我们鼓励您查看我们的了解 Systemd 单元和单元文件指南。
添加完所有行后,整个服务单元文件应如下所示:
[Unit]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
完成后保存并关闭文件。然后,重新加载systemd
以使您的系统知道新disable-thp
服务:
- sudo systemctl daemon-reload
接下来,启动disable-thp
服务:
- sudo systemctl start disable-thp.service
您可以通过检查/sys/kernel/mm/transparent_hugepage/enabled
文件的内容来确认 THP 已被禁用:
- cat /sys/kernel/mm/transparent_hugepage/enabled
如果 THP 被成功禁用,never
将在输出中用括号括起来:
Outputalways madvise [never]
之后,启用该disable-thp
服务,使其在服务器启动时自动启动并禁用 THP。请注意,此命令不包含.service
在服务文件定义中。 systemctl
如果它不存在,则会将此后缀附加到您自动传递的任何参数,因此没有必要包含它:
- sudo systemctl enable disable-thp
该disable-thp
服务现在开始,每当服务器启动和禁用的MongoDB服务启动前THP。但是,您还需要采取另外一个步骤来确保 THP 在您的系统上保持禁用状态。
默认情况下,CentOS 8 还tuned
安装并启用了一个内核调优工具。 tuned
使用许多预配置的调整配置文件,可以提高许多特定用例的性能。您可以编辑这些配置文件或创建为您的系统定制的新配置文件。
该tuned
工具可能会影响您系统上的 THP 设置,因此 MongoDB 文档还建议您还创建自定义配置文件以确保 THP 不会意外启用。
首先创建一个新目录来保存自定义tuned
配置文件:
- sudo mkdir /etc/tuned/no-thp
在此目录中,创建一个名为 的配置文件tuned.conf
:
- sudo nano /etc/tuned/no-thp/tuned.conf
将以下两个部分添加到文件中:
[main]
include=virtual-guest
[vm]
transparent_hugepages=never
第一部分 ,[main]
必须包含在每个tuned
配置文件中。在这里,我们只指定一个include
语句,它将导致no-thp
配置文件继承另一个tuned
名为的配置文件的特征virtual-guest
。
注意:virtual-guest
像这样继承配置文件的特性在许多情况下都有效,但可能并非对每种情况都是最佳的。我们鼓励您查看有关提供的tuned
配置文件的文档,以确定继承另一个配置文件的特征是否更适合您的系统。
下一节指定了一个特殊的插件——vm
它专门用于根据transparent_hugepages
布尔选项后面的值启用或禁用 THP 。
添加这些行后,保存并关闭文件。然后启用新的配置文件:
- sudo tuned-adm profile no-thp
这样,您就在服务器上禁用了 THP。您现在可以启动 MongoDB 服务并测试数据库的功能。
第 3 步 – 启动 MongoDB 服务并测试数据库
步骤 1 中描述的安装过程会自动将 MongoDB 配置为作为受 控制的守护程序运行systemd
,这意味着您可以使用各种systemctl
命令管理 MongoDB 。但是,此安装过程不会自动启动该服务。
运行以下systemctl
命令启动MongoDB服务:
- sudo systemctl start mongod
然后检查服务的状态:
- sudo systemctl status mongod
此命令将返回如下输出,表明服务已启动并正在运行:
Output● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-10-01 20:31:26 UTC; 19s ago
Docs: https://docs.mongodb.org/manual
Process: 14208 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
Process: 14205 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 14203 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 14201 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
Main PID: 14210 (mongod)
Memory: 66.6M
CGroup: /system.slice/mongod.service
└─14210 /usr/bin/mongod -f /etc/mongod.conf
确认服务按预期运行后,启用MongoDB服务开机启动:
- sudo systemctl enable mongod
您可以通过连接到数据库服务器并执行诊断命令来进一步验证数据库是否正常运行。以下命令将连接到数据库并输出其当前版本、服务器地址和端口。它还将返回 MongoDB 内部connectionStatus
命令的结果:
- mongo --eval 'db.runCommand({ connectionStatus: 1 })'
connectionStatus
将检查并返回数据库连接的状态。的值1
用于ok
在响应字段指示该服务器正在按预期:
OutputMongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("460fe822-2881-477c-b095-aa3ccb49702d") }
MongoDB server version: 4.4.1
{
"authInfo" : {
"authenticatedUsers" : [ ],
"authenticatedUserRoles" : [ ]
},
"ok" : 1
}
另请注意,数据库在端口27017
on 上运行127.0.0.1
,本地环回地址代表localhost。这是 MongoDB 的默认端口号。
接下来,我们将看看如何使用systemd
.
第 4 步 – 管理 MongoDB 服务
如前所述,步骤 1 中描述的安装过程将 MongoDB 配置为作为systemd
服务运行。这意味着您可以systemctl
像使用其他 CentOS 系统服务一样使用标准命令来管理它。
回想一下,该systemctl status
命令检查 MongoDB 服务的状态:
- sudo systemctl status mongod
您可以通过键入以下内容随时停止该服务:
- sudo systemctl stop mongod
要在服务停止时启动服务,请运行:
- sudo systemctl start mongod
您还可以在服务器已经运行时重新启动它:
- sudo systemctl restart mongod
在第 3 步中,您启用了 MongoDB 以随服务器自动启动。如果您想禁用此自动启动,请键入:
- sudo systemctl disable mongod
然后重新启用它在引导时启动,enable
再次运行命令:
- sudo systemctl enable mongod
有关如何管理systemd
服务的更多信息,请查看Systemd Essentials:使用服务、单元和日志。
结论
在本教程中,您将官方 MongoDB 存储库添加到您的 DNF 存储库列表并安装了最新版本的数据库。然后您禁用透明大页面以优化数据库的性能,测试 Mongo 的功能,并练习一些systemctl
命令。
作为立即的下一步,我们强烈建议您按照我们关于如何在 CentOS 8 上保护 MongoDB 的指南来加强 MongoDB 安装的安全性。一旦它受到保护,您就可以配置 MongoDB 以接受远程连接。
您可以在这些 DigitalOcean 社区文章中找到有关如何配置和使用 MongoDB 的更多教程。我们还鼓励您查看官方MongoDB 文档,因为它是关于 MongoDB 提供的可能性的重要资源。