我正在尝试通过一些 Mongo 日志进行 grep 以尝试找到我需要优化的缓慢操作。慢查询日志记录是默认的,记录操作超过 100 毫秒。
我认为可以肯定地说,一般来说,搜索 COLLSCANS 会显示需要注意的查询。不太清楚的是,如果 IXSCANS 是我应该搜索的细节。
考虑此处的 MongoDB 文档:
https://docs.mongodb.com/manual/reference/explain-results/#collection-scan-vs-index-use
我的理解是这是一种二元情况,查询是 COLLSCAN 或 IXSCAN。因此,如果我对 IXSCAN 进行 grep,我将查看所有不是 COLLSCANS 的慢查询。这是真的?
我在云服务上有一个 MongoDB 副本集。出于安全原因,副本集可用于云的内部网络。
我遵循了该云服务的指南,并在代理服务器上为副本集的每个成员设置了一个代理:
0.0.0.0:27017 -> member1-private-ip:27107
0.0.0.0:27018 -> member2-private-ip:27107
0.0.0.0:27019 -> member3-private-ip:27017
...
Run Code Online (Sandbox Code Playgroud)
我能够以独立模式从公共网络连接到副本集的每个成员:
mongoUri = new MongoClientURI("mongodb://usr:pwd@proxy-server-public-ip:27017/db") ;
client = MongoClient(mongoUri);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试以副本集模式连接它时:
mongoUri = new MongoClientURI("mongodb://usr:pwd@proxy-server-public-ip:27017,proxy-server-public-ip:27018,proxy-server-public-ip:27019/db?replicaSet=replcaSetName");
client = MongoClient(mongoUri);
Run Code Online (Sandbox Code Playgroud)
我会因连接错误而失败,因为复制集告诉驱动程序使用每个成员的内部地址(无法从公共网络访问)。
ps:我可以在代理服务器上以副本集模式连接到副本集。
如何连接到代理服务器后面的副本集?
更新:我在连接时使用代理服务器的公共地址。
我正在尝试通过在两台服务器上停止 Mongo 然后运行以下命令来在生产服务器和开发环境之间镜像大型 Mongo 数据库:
rsync --archive --delete --recursive --verbose --compress --rsh "ssh -t -o StrictHostKeyChecking=no -i key.pem" remoteuser@remotehost:/var/lib/mongodb/ /var/lib/mongodb
Run Code Online (Sandbox Code Playgroud)
它运行良好几分钟,但随后因错误而停止:
receiving incremental file list
./
collection-228--5129329295041693519.wt
inflate returned -3 (0 bytes)
rsync error: error in rsync protocol data stream (code 12) at token.c(557) [receiver=3.1.1]
rsync: [generator] write error: Broken pipe (32)
rsync error: error in socket IO (code 10) at io.c(820) [generator=3.1.1]
Run Code Online (Sandbox Code Playgroud)
谷歌搜索错误表明这是某种网络连接问题,但我能够很好地连接到两台服务器。
如果我重新运行该命令,它会在完全相同的文件处失败并显示相同的错误消息。是什么原因导致此错误以及如何修复它?
我正在寻找有关 AWS 托管环境中 MongoDB 灾难恢复的最佳实践建议。
我们的设置在这一点上是相当标准的,3 个服务器的副本集(1 个主服务器、1 个辅助服务器和 1 个仲裁器),主服务器和辅助服务器上的 mongo 卷是 EBS 支持的。所有这些都在一个区域中,分布在多个可用区中。最终我们需要跨越区域,但这是改天的讨论。
我在 Mongo 文档中看到的备份建议谈到了 EBS 快照(这很容易实现自动化)。然而,如果灾难来袭,它们不会让我们回到失败的时代。
我正在寻找可用的最强大的策略。高达第二次数据保护和故障后系统恢复速度的优先级高于价格。我们可以稍后优化价格。
在此先感谢您的所有建议...
我需要以很快就会分片的数据库,并且对我最好的做法是什么在启用身份验证不清mongos和config服务器。
我想用密码保护一切。
auth启用吗?谢谢!
我想使用 Mongo init 脚本启动具有 auth 支持的 MongoDB 守护进程:
sudo /etc/init.d/mongod start
Run Code Online (Sandbox Code Playgroud)
我还将 db 用户添加到数据库中以进行身份验证。我正在处理两个文件:(/etc/init.d/mongod用于初始化)和/etc/mongod.conf(用于配置)。
#mongod.conf:
dbpath=/var/lib/mongodb
logappend=true
port = 27017
auth = true
Run Code Online (Sandbox Code Playgroud)
非守护进程方法使用以下--auth标志正确启动进程:
mongod --auth
Run Code Online (Sandbox Code Playgroud)
fork 可以工作,但这不使用 init 脚本:
mongod --fork --auth --logpath /var/log/mongod.log
Run Code Online (Sandbox Code Playgroud)
阅读所有文档和相关帖子,似乎没有人有一个可行的解决方案来获得身份验证支持
service mongod start
Run Code Online (Sandbox Code Playgroud)
链接:
更新:我重新安装的Debian /蒙戈,并能使用service mongod start同auth = true在的conf文件。我可能在初始安装/配置期间破坏了某些东西。
我的 mongodb 安装有问题:当我运行 sudo mongod 时,我得到 mongod: symbol lookup error: mongod: undefined symbol: _ZN5boost6detail13once_epoch_cvE
uname -a
Linux xyz 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2 i686 GNU/Linux
which mongod
/usr/bin/mongod
ldd /usr/bin/mongod
linux-gate.so.1 => (0xb76e7000)
libpcrecpp.so.0 => /usr/lib/i386-linux-gnu/libpcrecpp.so.0 (0xb76b9000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb767b000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb758e000)
libboost_system.so.1.49.0 => /usr/lib/libboost_system.so.1.49.0 (0xb758a000)
libboost_thread.so.1.49.0 => /usr/lib/libboost_thread.so.1.49.0 (0xb7565000)
libboost_filesystem.so.1.49.0 => /usr/lib/libboost_filesystem.so.1.49.0 (0xb7546000)
libboost_program_options.so.1.49.0 => /usr/lib/libboost_program_options.so.1.49.0 (0xb74de000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb74b7000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb749a000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb7481000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb731d000)
/lib/ld-linux.so.2 (0xb76e8000)
librt.so.1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Dockerfile 中官方 mongodb 指南中的以下步骤在 docker 容器中的 ubuntu 14.04 上安装 mongodb:
RUN sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
RUN apt-get update && apt-get -q -y install \
nodejs\
npm \
git \
mongodb-org
Run Code Online (Sandbox Code Playgroud)
这些命令在我的主机 ubuntu 系统上正确安装 mongodb,但不在 docker 中。在我的 docker 镜像中, /etc/init.d/mongod 不存在。运行“docker build”时打印以下错误:
invoke-rc.d: unknown initscript, /etc/init.d/mongod not found.
invoke-rc.d: policy-rc.d denied execution of start.
Run Code Online (Sandbox Code Playgroud) 如果 MongoDB 3.6 崩溃,它似乎不会自动配置为重新启动。查看与 Ubuntu 16.04LTS 的最新 .deb 包捆绑在一起的 systemd 服务,它似乎没有配置重启:
$ sudo systemctl cat mongod
# /lib/systemd/system/mongod.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual
[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
PIDFile=/var/run/mongodb/mongod.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
发送 SIGKILL 和 SIGSEGV 都会终止进程并且不会重新启动。我不确定这些是否被 …
我正在设置我的数据库生产环境,我有一些问题。服务器有两个NVMe磁盘,但不能在硬件RAID控制器中使用。我需要带 NVMe 的 RAID 吗?
在生产中将它们用作JBOD就足够了吗?还是应该使用软件 RAID 1/0(这是 MongoDB 建议的 RAID)?否则,我必须卸下 NVMe 驱动器并订购要在 RAID 硬件控制器中使用的 SATA 接口。