安装mongod
安装依赖
sudo yum install libcurl openssl xz-libs -y
下载安装包
mkdir -p /root/app/mongo6
cd /root/app/mongo6
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.1.tgz
解压
tar -zxvf mongodb-linux-*-6.0.1.tgz
复制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
解压
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/
运行mongo
ulimit设置
大多数类UNIX 操作系统,包括 Linux 和 macOS,都提供了在每个进程和每个用户的基础上限制和控制系统资源(例如线程、文件和网络连接)使用的方法。这些“ulimit”可防止单个用户使用过多的系统资源。有时,这些限制默认值都较低,肯能无法支撑MongoDB的使用,操作过程中会存在一些问题问题。
资源利用率
mongod和mongos会使用线程和文件描述符来跟踪连接和管理内部操作。下面介绍一下MongoDB 的一般资源利用模式。将这些数字与有关您的部署及其用途的实际信息结合使用,以确定理想的 ulimit 设置。
适用于mongod和mongos
- 使用文件描述符和线程跟踪每个传入连接。
- 跟踪每个内部线程或 pthread 作为系统进程。
适用于mongod
- 使用的每个数据文件都有 1 个文件描述符
- 当
storage.journal.enabled
为true
的时候,每一个日志文件都会又一个文件描述符 - 在副本集中,每个mongod都保持与集合中所有其他成员的连接。
mongod使用后台线程处理一些内部进程,包括TTL收集、复制和复制集健康检查,这可能需要少量的额外资源。
适用于mongos
除了客户端连接的线程和文件描述符之外,mongos还必须维护到所有配置服务器和所有碎片的连接,其中包括所有副本集的所有成员。
对于mongos,请考虑以下行为:
- mongos实例为每个碎片维护一个连接池,以便mongos可以重用连接并快速完成请求,而无需创建新连接。
- 您可以使用
net.maxIncomingConnections
运行时选项限制传入连接的数量。通过限制传入连接的数量,可以防止mongos在mongod实例上创建过多连接的级联效应。
查看和设置资源限制
ulimit
ulimit指的是各种资源的每用户限制,因此,如果您的mongod实例作为同时运行多个进程或多个mongod进程的用户执行,您可能会看到对这些资源的争夺
可以使用 ulimit -a
命令查看资源限制
进程值(-u)是指不同进程和子进程线程的组合数量。
修改ulimit
ulimit -n <value>
hard
和soft
都会影响mongo的性能
hard
ulimit是指用户可以在任何时候活动的最大进程数,这是上限任何非root进程都不能增加 hard
ulimit。
soft
ulimit是对一个会话或进程实际执行的限制,但任何进程都可以将其增加到 hard
ulimit最大值。
soft
ulimit 太低可能导致无法创建新线程,如果连接数增长得太高,则关闭连接错误。所以,hard
和soft
ulimit 值都设置为推荐值非常重要的
ulimit 将同时修改hard
和soft
值,除非在修改限制值时指定了 -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/
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
默认情况下,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');
本地主机默认绑定
默认情况下,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 目录路径
评论区