将 MongoDB 3系版本安装在 CentOS7 上

首先

由于尝试在 CentOS7 上安装 MongoDB3.4,并且特别是在消除警告部分,我遇到了各种困难,因此做了一些备注。

CentOS的版本如下所示,使用的是Sakura的VPS。

# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

1. MongoDB 的安装和启动

按照公式文章中的指引,使用yum在Red Hat Enterprise或CentOS Linux上安装MongoDB Community Edition。

1.1. 使用 yum 在系统中安装 MongoDB.

首先,在/etc/yum.repos.d目录下添加文件,并添加yum仓库。

# vi /etc/yum.repos.d/mongodb-org-3.4.repo
[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

使用 yum 安装

# yum install -y mongodb-org

在接下来的部分,官方记录中详细描述了 SELinux 的配置,但我认为很多人在服务器初步设置时会选择禁用 SELinux,所以我会跳过这一部分(我自己也没做过)。

1.2. MongoDB的启动和自动启动设置

启动MongoDB

# systemctl start mongod

MongoDB的自动启动

# systemctl enable mongod

确认MongoDB的版本。

# mongo --version
MongoDB shell version v3.4.1

只需提供一种选项的汉语本地化改写:启动 MongoDB 的 Shell。

# mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-01-11T18:01:33.949+0900 I CONTROL  [initandlisten]
> 

成功启动。看来MongoDB已经安装成功了。

2. 警告:我们建议将其设置为“永不”删除

当我启动Shell时,遇到了一个警告。这次我将解决它。虽然官方提供了解决方法,但其中某些部分无法正常工作。因此,我也参考了其他文章。

禁用透明巨大页面(THP)- MongoDB手册3.4
安装MongoDB 3.0-抓住当下

透明大页(THP)是一种Linux内存管理系统,通过使用较大的内存页面来减少具有大内存量的机器上的翻译后备缓冲器(TLB)查找的开销。然而,数据库的工作负载通常在THP上表现不佳,因为它们倾向于具有稀疏而非连续的内存访问模式。为了确保与MongoDB的最佳性能,您应该在Linux机器上禁用THP。

在基于红帽(Red Hat)系列的 CentOS Linux 中,采用了一个名为THP(透明大页面)的页面管理系统,但看起来这个系统与 MongoDB 不兼容。

2.1. 编写初始化脚本

我在/etc/init.d目录中创建了一个脚本。
我尝试复制粘贴官方提供的脚本,但是无法删除一部分警告信息,所以我参考了其他文章,并做了以下更改。

# vi /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO

case $1 in
  start)
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
      echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi

    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0  > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi

    unset re
    unset thp_path
    ;;
esac

更改权限

# chmod 755 /etc/init.d/disable-transparent-hugepages

添加服务设置
(关于chkconfig,这篇文章很易懂)

# chkconfig --add disable-transparent-hugepages
# chkconfig --list
disable-transparent-hugepages   0:off   1:off   2:on    3:on    4:on    5:on    6:off

我忘记是否执行了/sbin/service disable-transparent-hugepages start…抱歉。

2.2. 调整和ktune设置

如果使用了tuned或ktune,则在安装初始化脚本之外,您必须执行此步骤。

如果您使用tuned或ktune,除了2.1之外,还需要进行以下设置。(有关tuned或ktune,请参见此处链接)

在Red Hat和CentOS上提供了tuned和ktune这两种动态内核调优工具,它们可以禁用透明大页。要在tuned或ktune中禁用透明大页,您需要编辑或创建一个新的配置文件,并将THP设置为“never”。

似乎需要创建一个新的配置文件。

# mkdir /etc/tuned/no-thp
# vi /etc/tuned/no-thp/tuned.conf
[main]
include=virtual-guest

[vm]
transparent_hugepages=never

使用tuned-adm命令进行配置文件切换。

# tuned-adm profile no-thp

正在测试是否已经进行了变更。如果”[]”前面没有出现”never”,那么就是成功的。

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

2.3. 重新启动MongoDB并确认shell。

重启 MongoDB

# systemctl restart mongod

启动Shell并确认WARNING是否已消除。

# mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.4.1
Server has startup warnings:
2017-01-11T18:24:52.860+0900 I CONTROL  [initandlisten]
2017-01-11T18:24:52.860+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-01-11T18:24:52.860+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-01-11T18:24:52.860+0900 I CONTROL  [initandlisten]
> 

警告:我们建议将其设置为“永不”选项似乎已经消失了。

如果WARNING无法消除,请从日志中确认错误。

# tail /var/log/mongodb/mongod.log

3. 警告: 数据库未启用访问控制。

我认为这是来自MongoDB 3系的警告。似乎是关于MongoDB安全方面的问题。我们将使用openssl命令进行内部认证。虽然很难找到,但有官方的文章可供参考。
启用内部认证 — MongoDB手册3.0

我正在参考这篇文章来设置keyfile的位置。

3.1. 创建密钥文件

创建密钥文件

# mkdir -p /usr/local/mongodb/conf
# openssl rand -base64 741 > /usr/local/mongodb/conf/mongodb-keyfile

在公式文件中没有提到chown这个命令,但是我在使用过程中发生了“Permission Denied”错误。

# chmod 600 /usr/local/mongodb/conf/mongodb-keyfile
# chown -R mongod.mongod /usr/local/mongodb/conf/mongodb-keyfile

将其添加到配置文件中,并重新启动。

请确保在设置文件中添加。不要忘记取消注释security。

# vi /etc/mongod.conf
security:
  keyFile: /usr/local/mongodb/conf/mongodb-keyfile

重新启动MongoDB

# systemctl restart mongod

启动Shell

# mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
> 

警告已消失!(也许需要添加用户认证)

4. 添加用户认证

如果保持现状,任何人都可以接触Mongo数据库,这是非常危险的。我曾经因为受到针对Mongo的恶意软件感染而导致所有数据丢失。我们应该首先添加用户认证。官方文档中也有相应的方法说明。

启用身份验证 — MongoDB 手册 3.4

4.1. 创建管理用户

创建管理用户。向admin数据库中添加一个具有管理用户权限(userAdminAnyDatabase)的用户。请自行准备并设置密码部分。

# mongo

> use admin
switched to db admin

> db.createUser({user:"myUserAdmin",pwd:"password",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
    "user" : "myUserAdmin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

更新 MongoDB 的配置文件。

# vi /etc/mongod.conf
security:
  keyFile: /usr/local/mongodb/conf/mongodb-keyfile
  authorization: enabled

重新启动MongoDB。

# systemctl restart mongod

从现在开始需要登录。有两种方法可以登录:一种是启动mongo的shell并使用db.auth()进行登录,另一种是在启动mongo的shell时进行登录。

在启动Mongo的Shell之后,使用db.auth()进行登录的方法是:登录成功后,会出现数字1。

# mongo
> use admin
switched to db admin

> db.auth("myUserAdmin","password")
1

当启动Mongo的shell时,登录的方法是确保shell成功启动。

# mongo -u "myUserAdmin" -p "password" --authenticationDatabase "admin"

4.2 创建普通用户

Mongo数据库似乎要为每个数据库创建一个用户。让我们创建一个测试用户并确认其权限。
readWrite权限可以进行数据库的读写操作,而’read’权限仅限于读取操作。

# mongo -u "myUserAdmin" -p "password" --authenticationDatabase "admin"

> use test

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

试着关闭一次终端,然后再次登录。

# mongo -u "myTester" -p "xyz123" --authenticationDatabase "test"

> db.foo.insert( { x: 1, y: 1 } )
WriteResult({ "nInserted" : 1 })

> show collections
foo

> db.foo.find()
{ "_id" : ObjectId("58762b81a5a33029aaf665ee"), "x" : 1, "y" : 1 }

好的,我成功地查看了数据。接下来,让我们先关闭终端,然后再次登录试试看。

# mogno

> use test
switched to db test

> show collections
2017-01-11T21:58:19.707+0900 E QUERY    [main] Error: listCollections failed: {
    "ok" : 0,
    "errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",
    "code" : 13,
    "codeName" : "Unauthorized"
} :

> db.foo.find()
Error: error: {
    "ok" : 0,
    "errmsg" : "not authorized on test to execute command { find: \"foo\", filter: {} }",
    "code" : 13,
    "codeName" : "Unauthorized"
}

因为这次未进行测试用户认证,所以无法查看集合。

不要忘记最后删除测试用户。

# mongo -u "myUserAdmin" -p "password" --authenticationDatabase "admin"

> db.dropUser("myuser")

引用来源


在Red Hat Enterprise或CentOS Linux上安装MongoDB社区版- MongoDB手册3.4
禁用Transparent Huge Pages(THP)- MongoDB手册3.4
安装MongoDB 3.0- Carpe Diem
启用内部认证- MongoDB手册3.0
mongodb3.0.x配置文件模板- Qiita
启用认证- MongoDB手册3.4