如何在 CentOS 8 上安装 MongoDB

此教程的早期版本是由Melissa Anderson撰写的(https://www.digitalocean.com/community/users/melissaanderson)。

介绍

MongoDB,也称为 Mongo,是一个开源文档数据库,用于许多现代Web应用程序,它被归类为 NoSQL数据库,因为它不依赖传统的基于表的关系数据库结构。

相反,它使用具有动态方案的JSON类文档,这意味着与关系数据库不同,MongoDB在将数据添加到数据库之前不需要预定义方案。

在本教程中,您将在 CentOS 8 服务器上安装 MongoDB,测试它,并学习如何将其管理为systemd服务。

前提条件

要完成本教程,您将需要运行 CentOS 8 的服务器,该服务器应该具有非 root 用户,具有管理权限,并配置了「firewalld」的防火墙。

步骤1:安装 MongoDB

在标准的 CentOS 存储库中没有官方的 MongoDB 包。为了在您的服务器上安装 Mongo,您需要添加一个存储文件,该文件指向 MongoDB 的官方 Repo。

在本指南中,我们将使用 DNF 包管理器安装 Mongo,因此您需要将库文件添加到 /etc/yum.repos.d/ 目录中。

您可以使用vi - 一个广泛使用的文本编辑器,默认安装在CentOS系统上 - 创建存储文件,但vi可能对没有经验的用户来说有些不直观。

若要使用 DNF 安裝「nano」,請執行以下命令:

1sudo dnf install nano

在此安裝過程中,系統會要求您確認您想要安裝軟體. 要做到這一點,請按「y」,然後按「ENTER」。

1[secondary_label Output]
2Transaction Summary
3================================================================================
4Install 1 Package
5
6Total download size: 581 k
7Installed size: 2.2 M
8Is this ok [y/N]: y

安装完成后,运行以下命令来创建并打开存储文件以进行编辑:

1sudo nano /etc/yum.repos.d/mongodb-org.repo

然后将下列内容添加到空文件中. 这将安装 MongoDB 的版本 4.4 (本文写作时的最新版本):

1[label /etc/yum.repos.d/mongodb-org.repo]
2[mongodb-org]
3name=MongoDB Repository
4baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
5gpgcheck=1
6enabled=1
7gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

<$>[注] :您可以通过查阅数据库的官方文档来检查是否有更新的MongoDB版本。

在那里,你会找到一个代码块,其中包含最新的 MongoDB 版本的存储库信息. 如果不同于以前的文件内容,你可以复制该配置并将其添加到你的 .repo 文件。

以下是这些指令中的每一个做什么:

  • [mongodb-org]:.repo 文件的第一个行是一个单一的字符串,包装在插槽中,它作为存储库
  • 名称的标识符:该指令定义了可人读的名称来描述存储库。你可以输入任何你想在这里的名称,但为了清晰度,你可以输入 MongoDB 存储库
  • baseurl:这指向存储库的 repodata 目录的 URL,其中存储库的 `repodata 目录,其中包含存储库的元数据,可以找到
  • gpchered verify:将这个指令输入 1告诉DNF 包管理器在该存储

添加库信息后,保存并关闭文件. 如果您使用nano创建复制文件,请按CTRL + X,Y,然后按ENTER

在继续之前,您可以通过运行该程序的repolist命令来测试DNF是否能够找到和使用此存储库:

1dnf repolist

如果存储库可供服务器的包管理器使用,则可以在输出中找到它:

1[secondary_label Output]
2repo id repo name
3AppStream CentOS-8 - AppStream
4BaseOS CentOS-8 - Base
5extras CentOS-8 - Extras
6mongodb-org MongoDB Repository

接下来,您可以使用此命令安装mongodb-org包:

1sudo dnf install mongodb-org

再次,您将被要求通过按y然后按ENTER来确认您想要安装该包;如果是这样的情况,请再次按y,然后按ENTER

一旦命令完成,MongoDB 将安装在您的服务器上. 但是,在您启动数据库之前,MongoDB 文档建议您在服务器上禁用透明巨大的页面以优化性能。

步骤 2 – 禁用透明的大型页面以提高性能

默认情况下,CentOS 启用了 Linux 内存管理系统 Transparent Huge Pages (THP)。THP 使用额外大的内存页面来减少 Translation Lookaside Buffer 搜索对大量内存的机器的影响,但此系统可能会对数据库性能和您禁用 THP 的 MongoDB 文档推荐产生负面影响。

要在 CentOS 8 上禁用透明巨大的页面,您可以创建一个systemd单元文件,在启动时将其禁用。systemd是许多 Linux 操作系统中使用的 init 系统和软件套件,您可以控制服务器的许多方面。在 systemd 中,一个 unit 指的是系统知道如何操作和管理的任何资源。

/etc/systemd/system/ 目录中创建此文件,使用 sudo 特权:

1sudo nano /etc/systemd/system/disable-thp.service

在文件中,您需要添加几个单独的部分. 首先添加的是包含有关服务单元的一些一般信息的[单位]部分。

添加以下突出的线条:

1[label /etc/systemd/system/disable-thp.service]
2[Unit]
3Description=Disable Transparent Huge Pages (THP)
4After=sysinit.target local-fs.target
5Before=mongod.service

[Unit]部分标题后,有以下选项:

  • 描述:这定义了单元 的可读名称 After:这确保了 disable-thp 服务单元仅在两个指定的 targets - 预定义组 systemd 单元 - 结束开始
  • Before 之后才会启动:此选项确保了 disable-thp 服务始终在 mongod,即 MongoDB 服务单元,启动 之前才会启动。

接下来,将突出的[服务]部分添加到文件:

1[label /etc/systemd/system/disable-thp.service]
2. . .
3Before=mongod.service
4
5[Service]
6Type=oneshot
7ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'

本节的类型选项定义了这个单元将是一个未拍摄类型的进程,这意味着它将是一个一次性任务,而systemd应该等待进程退出,然后继续。

使用ExecStart选项来指定完整的路径和将启动过程的命令的任何参数。 此处包含的命令将打开一个壳流程,然后在单个引文之间运行命令。 此命令响应永远字符串,然后将其引导到下一个tee命令中。 tee命令然后将/sys/kernel/mm/transparent_hugepage/enabled文件重写为never作为其唯一的内容,并将任何输出传输到/dev/null,一个_null device_(https://en.wikipedia.org/wiki/Null_device)即将丢弃任何书面信息。

接下来,添加这个突出的[安装]部分:

1[label /etc/systemd/system/disable-thp.service]
2. . .
3ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
4
5[Install]
6WantedBy=basic.target

此部分只有一个选项,即WantedBy,这将导致在启动basic.target时启动disable-thp单元。

<$>[注] :如果您想了解更多关于systemd单元和服务的信息,我们鼓励您查看我们关于理解 Systemd 单元和单元文件的指南。

整个服务单元文件在您完成添加所有行后应该是这样的:

 1[label /etc/systemd/system/disable-thp.service]
 2[Unit]
 3Description=Disable Transparent Huge Pages (THP)
 4After=sysinit.target local-fs.target
 5Before=mongod.service
 6
 7[Service]
 8Type=oneshot
 9ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
10
11[Install]
12WantedBy=basic.target

完成后保存并关闭文件,然后重新加载systemd,让您的系统知道新的禁用-thp服务:

1sudo systemctl daemon-reload

接下来,开始禁用-thp服务:

1sudo systemctl start disable-thp.service

您可以通过检查 /sys/kernel/mm/transparent_hugepage/enabled 文件的内容来确认 THP 已被禁用:

1cat /sys/kernel/mm/transparent_hugepage/enabled

如果成功禁用了THP,则输出中的永不将被包装成支架:

1[secondary_label Output]
2always madvise [never]

接下来,启用禁用-thp服务,以便它自动启动并在服务器启动时禁用 THP。请注意,此命令不包括服务文件定义中的.service

1sudo systemctl enable disable-thp

在 MongoDB 服务启动之前,您的服务器每次启动和禁用 THP 时,将启动禁用-thp服务,但是,您还需要采取一个步骤来确保 THP 在您的系统上仍然禁用。

默认情况下,CentOS 8 还安装和启用了调节 - 一个内核调节工具。调节使用了一些预先配置的 _tuning 配置文件,可以改善某些特定用例的性能。

定制工具可能会影响您的系统的 THP 设置,因此 MongoDB 文档还建议您创建自定义配置文件,以确保 THP 不会意外启用。

通过创建一个新的目录来开始,以保持自定义的定制配置文件:

1sudo mkdir /etc/tuned/no-thp

在此目录中,创建一个名为tuned.conf的配置文件:

1sudo nano /etc/tuned/no-thp/tuned.conf

将以下两个部分添加到文件中:

1[label /etc/tuned/no-thp/tuned.conf]
2[main]
3include=virtual-guest
4
5[vm]
6transparent_hugepages=never

在这里,我们只指定一个包括声明,这将导致没有配置文件继承另一个名为虚拟客人调整配置文件的特性。

<$>[注] :在许多情况下,继承虚拟客人配置文件的特性会起到作用,但可能并不适合每个情况。

下一节指定了一个特殊的插件 - vm - 它是专门用于启用或禁用 THP 基于以下值的 transparent_hugepages 布尔选项。

添加这些行后,保存并关闭文件,然后启用新配置文件:

1sudo tuned-adm profile no-thp

您现在可以启动 MongoDB 服务并测试数据库的功能。

步骤 3 – 启动 MongoDB 服务并测试数据库

步骤 1 所描述的安装过程会自动配置 MongoDB 以由 systemd 控制的 daemon 运行,这意味着您可以使用各种 systemctl 命令管理 MongoDB。

运行以下systemctl命令来启动 MongoDB 服务:

1sudo systemctl start mongod

然后检查服务的状态:

1sudo systemctl status mongod

此命令将返回如下输出,表示服务已启动并运行:

 1[secondary_label Output]
 2 mongod.service - MongoDB Database Server
 3   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
 4   Active: active (running) since Thu 2020-10-01 20:31:26 UTC; 19s ago
 5     Docs: https://docs.mongodb.org/manual
 6  Process: 14208 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
 7  Process: 14205 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
 8  Process: 14203 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
 9  Process: 14201 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
10 Main PID: 14210 (mongod)
11   Memory: 66.6M
12   CGroup: /system.slice/mongod.service
13           └─14210 /usr/bin/mongod -f /etc/mongod.conf

确认服务按预期运行后,允许 MongoDB 服务在启动时启动:

1sudo systemctl enable mongod

您可以通过连接到数据库服务器并执行诊断命令进一步验证数据库是否正常运行。下列命令将连接到数据库并输出其当前版本、服务器地址和端口。

1mongo --eval 'db.runCommand({ connectionStatus: 1 })'

「connectionStatus」会检查并返回数据库连接的状态.响应中的「OK」字段的值为「1」表示服务器按预期运行:

 1[secondary_label Output]
 2MongoDB shell version v4.4.1
 3connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
 4Implicit session: session { "id" : UUID("460fe822-2881-477c-b095-aa3ccb49702d") }
 5MongoDB server version: 4.4.1
 6{
 7    "authInfo" : {
 8    	"authenticatedUsers" : [ ],
 9    	"authenticatedUserRoles" : [ ]
10    },
11    "ok" : 1
12}

另外,请注意,数据库运行在端口 27017127.0.0.1,即代表 localhost 的本地回路地址。

接下来,我们将看看如何使用systemd来管理MongoDB服务器实例。

第4步:管理MongoDB服务

如前所述,在步骤 1 中描述的安装过程将 MongoDB 配置为systemd服务,这意味着您可以使用标准的systemctl命令来管理它,就像其他 CentOS 系统服务一样。

请记住,systemctl status命令检查 MongoDB 服务的状态:

1sudo systemctl status mongod

您可以随时停止服务,键入:

1sudo systemctl stop mongod

要在停止服务时启动服务,运行:

1sudo systemctl start mongod

您也可以在已经运行时重新启动服务器:

1sudo systemctl restart mongod

在步骤 3 中,您已启用 MongoDB 自动启动服务器. 如果您有时想要禁用此自动启动,请键入:

1sudo systemctl disable mongod

然后,要重新启用它在启动时启动,请再次运行启用命令:

1sudo systemctl enable mongod

有关如何管理systemd服务的更多信息,请参阅 Systemd Essentials: Working with Services, Units, and the Journal

结论

在本教程中,您已将官方的 MongoDB 存储库添加到您的 DNF 重置列表中,并安装了最新版本的数据库,然后禁用了 Transparent Huge Pages 来优化数据库的性能,测试了 Mongo 的功能,并练习了一些systemctl命令。

作为下一步的立即步骤,我们强烈建议您通过遵循我们在CentOS 8上如何保护MongoDB(https://andsky.com/tech/tutorials/how-to-secure-mongodb-on-centos-8)上的指南来加强MongoDB安装的安全性。

您可以在 这些 DigitalOcean 社区文章中找到有关如何配置和使用 MongoDB 的更多教程)。

Published At
Categories with 技术
comments powered by Disqus