侧边栏壁纸
博主头像
丛庆

没事儿写代码,有事写代码。email:1024@cong.zone

  • 累计撰写 116 篇文章
  • 累计创建 97 个标签
  • 累计收到 4 条评论

【MongoDB】【CentOS7】MongoDB6安装

丛庆
2022-09-11 / 0 评论 / 0 点赞 / 679 阅读 / 2,891 字 / 正在检测是否收录...
温馨提示:
部分资料和图片来源于网络,如有危害到您的利益请与我联系删除,1024@cong.zone。

安装mongod

安装依赖

sudo yum install libcurl openssl xz-libs -y

image-1662842416831

下载安装包

mkdir -p /root/app/mongo6
cd /root/app/mongo6
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.1.tgz

image-1662842376872

解压

tar -zxvf mongodb-linux-*-6.0.1.tgz

image-1662842446450

复制bin目录下的文件到/usr/bin

sudo cp /root/app/mongo6/mongodb-linux-x86_64-rhel70-6.0.1/bin/* /usr/local/bin/

安装mongoDBshell

下载mongos包

mkdir -p /root/app/mongos
cd /root/app/mongos
wget https://downloads.mongodb.com/compass/mongosh-1.5.4-linux-x64.tgz

image-1662842794296

解压

tar -zxvf mongosh-1.5.4-linux-x64.tgz

授执行权限

chmod +x bin/mongosh

将下载的文件添加到/usr/local/bin/目录

sudo cp mongosh /usr/local/bin/
sudo cp mongosh_crypt_v1.so /usr/local/lib/

image-1662842940452

运行mongo

ulimit设置

大多数类UNIX 操作系统,包括 Linux 和 macOS,都提供了在每个进程和每个用户的基础上限制和控制系统资源(例如线程、文件和网络连接)使用的方法。这些“ulimit”可防止单个用户使用过多的系统资源。有时,这些限制默认值都较低,肯能无法支撑MongoDB的使用,操作过程中会存在一些问题问题。

资源利用率

mongod和mongos会使用线程和文件描述符来跟踪连接和管理内部操作。下面介绍一下MongoDB 的一般资源利用模式。将这些数字与有关您的部署及其用途的实际信息结合使用,以确定理想的 ulimit 设置。

适用于mongod和mongos

  • 使用文件描述符和线程跟踪每个传入连接。
  • 跟踪每个内部线程或 pthread 作为系统进程。

适用于mongod

  • 使用的每个数据文件都有 1 个文件描述符
  • storage.journal.enabledtrue的时候,每一个日志文件都会又一个文件描述符
  • 在副本集中,每个mongod都保持与集合中所有其他成员的连接。

mongod使用后台线程处理一些内部进程,包括TTL收集、复制和复制集健康检查,这可能需要少量的额外资源。

适用于mongos

除了客户端连接的线程和文件描述符之外,mongos还必须维护到所有配置服务器和所有碎片的连接,其中包括所有副本集的所有成员。

对于mongos,请考虑以下行为:

  • mongos实例为每个碎片维护一个连接池,以便mongos可以重用连接并快速完成请求,而无需创建新连接。
  • 您可以使用net.maxIncomingConnections运行时选项限制传入连接的数量。通过限制传入连接的数量,可以防止mongos在mongod实例上创建过多连接的级联效应。

查看和设置资源限制

ulimit

ulimit指的是各种资源的每用户限制,因此,如果您的mongod实例作为同时运行多个进程或多个mongod进程的用户执行,您可能会看到对这些资源的争夺

可以使用 ulimit -a命令查看资源限制
image-1662839493001

进程值(-u)是指不同进程和子进程线程的组合数量。

修改ulimit

ulimit -n <value>

hardsoft都会影响mongo的性能
hardulimit是指用户可以在任何时候活动的最大进程数,这是上限任何非root进程都不能增加 hardulimit。
softulimit是对一个会话或进程实际执行的限制,但任何进程都可以将其增加到 hardulimit最大值。

softulimit 太低可能导致无法创建新线程,如果连接数增长得太高,则关闭连接错误。所以,hardsoftulimit 值都设置为推荐值非常重要的

ulimit 将同时修改hardsoft值,除非在修改限制值时指定了 -H-S 参数。

对于许多 Linux 发行版,您可以通过将 -n 选项替换为 ulimit -a 输出中的任何可能值来更改值。

在改变ulimit设置后,你必须重新启动进程以利用修改后的设置。在Linux上,你可以使用/proc文件系统来查看运行中的进程的当前限制

根据你的系统配置和默认设置,使用ulimit对系统限制的任何改变在系统重启后可能会被恢复。检查你的发行版和操作系统文档以了解更多信息。

通常使用systemctl来启动mongo,因为他会使用ulimit的设置
启动命令

systemctl start mongod.service

如果不使用systemctl来启动mongo, systemd 会覆盖一些ulimit设置
如果你使用下面的命令启动mongo,就会使用user-slice(例如 user-1000.slice) systemd设置

mongod --config ~/mongod.conf

systemd user slice 限制了用户进程资源

Red Hat Enterprise Linux和CentOS 6/7会强制执行单独的最大进程限制,nproc,该限制覆盖ulimit设置。此值在以下配置文件中定义,具体取决于版本:

Version Value File
RHEL / CentOS 7 4096 /etc/security/limits.d/20-nproc.conf
RHEL / CentOS 6 1024 /etc/security/limits.d/90-nproc.conf

要为以上系统版本配置 nproc 值,需要使用新的 soft nproc 和 hard nproc 值创建一个名为 /etc/security/limits.d/99-mongodb-nproc.conf 的文件以增加进程限制。有关推荐值,参考下文的ulimit推荐值章节

在 RHEL / CentOS 8 中,不再需要单独的 nproc 值。 ulimit 命令足以在 RHEL / CentOS 8 上配置所需的最大进程值。

ulimit推荐值

因为需求是不同的每一种部署方式的设置都可能不同;然而,以下阈值和设置对于mongod和mongos部署:

  • -f (file size): unlimited
  • -t (cpu time): unlimited
  • -v (virtual memory): unlimited
  • -l (locked-in-memory size): unlimited
  • -n (open files): 64000
  • -m (memory size): unlimited
  • -u (processes/threads): 64000

对于 macOS 平台,推荐的进程限制为 2500,这是该平台的最大可配置值。

为了保证你的修改生效,记得在修改后重启mongo和mongos

/proc 文件系统

/proc 文件系统将每个进程的限制存储在位于 /proc//limits 的文件系统对象中,其中 是进程的 PID 或进程标识符。您可以使用以下 bash 函数为一个或多个具有给定名称的进程返回限制对象的内容:

 return-limits(){

     for process in $@; do
          process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`

          if [ -z $@ ]; then
             echo "[no $process running]"
          else
             for pid in $process_pids; do
                   echo "[$process #$pid -- limits]"
                   cat /proc/$pid/limits
             done
          fi

     done

}

您可以将此函数复制并粘贴到当前 shell 会话中,或将其作为脚本的一部分加载。使用以下调用之一调用该函数:

return-limits mongod
return-limits mongos
return-limits mongod mongos

使用默认目录

默认情况下,MongoDB 使用 mongod 用户帐户运行并使用以下默认目录:

  • /var/lib/mongo (数据目录i)
  • /var/log/mongodb (日志目录)
    创建 MongoDB 数据和日志目录:
sudo mkdir -p /var/lib/mongo
sudo mkdir -p /var/log/mongodb

image-1662844991042

默认情况下,MongoDB 使用 mongod 用户帐户运行。创建一个 mongod 和一个 mongodb 组。
确保 mongod 属于该组,然后将这些目录的所有者和组设置为 mongod:

sudo chown -R mongod:mongod /var/lib/mongo
sudo chown -R mongod:mongod /var/log/mongodb

运行mongoDB

 mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --bind_ip_all --port=27017 --auth --fork

验证是否启动成功

查看日志文件判断是否成功

tail /var/log/mongodb/mongod.log

出现如下内容就是成功啦

[initandlisten] waiting for connections on port 27017

使用mongos连接mongod

mongosh

停止mongod

 mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown

设置账号密码

mongosh  
# 进入 admin 数据库
use admin
 
# 设置admin 用户密码
db.createUser({user: 'root', pwd: '123456', roles: ['root']})
 
# 验证刚刚创建的账户是否成功 1: 成功 0:失败
db.auth('root', '123456') 
 
# 创建一个用户,并且赋予权限,
db.createUser({ user: 'root', pwd: '123456', roles: [{ role: 'root', db: 'admin' }] })
 
# 修改密码
db.changeUserPassword('root','123456');

image-1665033748810

本地主机默认绑定

默认情况下,MongoDB 启动绑定IP设置为 127.0.0.1,它绑定到 localhost 网络接口。这意味着 mongod 只能接受来自在同一台机器上运行的客户端的连接。远程客户端将无法连接到 mongod,并且 mongod 将无法初始化副本集,除非将此值设置为有效的网络接口。
该值可以配置为:
在 MongoDB 配置文件中bindIp, 或者通过命令行参数--bind_ip

使用非默认目录

要使用默认目录以外的数据目录和/或日志目录:
创建一个或多个新目录。
编辑配置文件 /etc/mongod.conf 并相应地修改以下字段:
storage.dbPath to specify a new data directory path (e.g. /some/data/directory)
systemLog.path to specify a new log file path (e.g. /some/log/directory/mongod.log)

确保运行 MongoDB 的用户有权访问一个或多个目录:

sudo chown -R mongod:mongod <directory>

如果更改运行 MongoDB 进程的用户,则必须授予新用户访问这些目录的权限。

如果强制执行,请配置 SELinux。请参阅配置 SELinux。

配置 SELinux

配置不当的 SELinux 策略可能不安全或可能会阻止您的mongod工作中的实例。
如果 SELinux 处于强制模式,您必须为 MongoDB 自定义 SELinux 策略以

  • 允许访问cgroup
  • 允许访问 netstat

允许访问 cgroup

当前的SELinux策略不允许MongoDB进程访问/sys/fs/cgroup,这是确定系统上可用内存所必需的。如果打算在强制模式下运行SELinux,则需要对SELinux策略进行以下调整:

  • 确保您的系统安装了 checkpolicy 包:
sudo yum install checkpolicy

创建自定义策略文件 mongodb_cgroup_memory.te:

cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;

require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}

#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF

创建后,通过运行以下三个命令编译和加载自定义策略模块:

checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
sudo semodule -i mongodb_cgroup_memory.pp

MongoDB 进程现在能够在 SELinux 设置为强制访问的情况下访问正确的文件。

允许访问 FTDC 的 netstat

当前的SELinux策略不允许MongoDB进程打开和读取/proc/net/netstat,这是全职诊断数据捕获(FTDC)所必需的。如果打算在强制模式下运行SELinux,则需要对SELinux策略进行以下调整:

确保您的系统安装了 checkpolicy 包:

sudo yum install checkpolicy

创建自定义策略文件 mongodb_proc_net.te:

cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;

require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}

#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF

创建后,通过运行以下三个命令编译和加载自定义策略模块:

checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
sudo semodule -i mongodb_proc_net.pp

使用自定义 MongoDB 目录路径

0

评论区