我在 mongodb 中创建了用户。其中一位用户是管理员。但是当我执行 $mongo 时,它允许我在不指定用户和密码的情况下连接到 mongo shell。我应该怎么做才能防止所有人在没有用户登录的情况下访问 mongo shell?请帮忙
将操作系统从 Ubuntu 16 升级到 18 后无法启动 mongod 守护进程
root@dummy2:~# mongod --version
db version v4.0.4
git version: f288a3bdf201007f3693c58e140056adf8b04839
OpenSSL version: OpenSSL 1.1.1 11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
distmod: ubuntu1804
distarch: x86_64
target_arch: x86_64
root@dummy2:~#
cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
root@dummy2:~# /usr/bin/mongod --config /etc/mongo/db8303/mongodb.conf &
/usr/lib/x86_64-linux-gnu/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by /usr/bin/mongod)
我在 libcurl 版本的操作系统升级前后看到的差异:
前:
root@dummy2:~# ls -lrt /usr/lib/x86_64-linux-gnu/libcurl*
/usr/lib/x86_64-linux-gnu/libcurl.so.4 -> libcurl.so.4.4.0
/usr/lib/x86_64-linux-gnu/libcurl.so.3 -> libcurl.so.4
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 -> libcurl-gnutls.so.4.4.0
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.3 -> libcurl-gnutls.so.4
/usr/lib/x86_64-linux-gnu/libcurl.so.4.4.0
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4.4.0
后:
root@dummy2:~# ls -lrt /usr/lib/x86_64-linux-gnu/libcurl
/usr/lib/x86_64-linux-gnu/libcurl.so.4 -> libcurl.so.4.5.0
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4 -> libcurl-gnutls.so.4.5.0
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.3 -> libcurl-gnutls.so.4
/usr/lib/x86_64-linux-gnu/libcurl.so.4.5.0
/usr/lib/x86_64-linux-gnu/libcurl-gnutls.so.4.5.0
有没有人遇到过类似的问题?如何解决这个问题?
我能够从副本集的仲裁节点连接到辅助节点。
mongo -u backup02 -p backup02_password --port 8133 --host p1dummy:8133,p2dummy:8133,drdummy:8133 --authenticationDatabase admin --ssl --sslAllowInvalidCertificates
mongo8133:SECONDARY>
当我尝试使用没有发生的 mongodump 命令连接辅助节点形成仲裁节点时。使用 mongodump 命令,我传递的参数与 mongo 命令相同。我尝试启用详细日志,但这并没有给我完整的日志信息。我可以连接指定 p1dummy 作为参数但是我也应该能够使用连接字符串进行连接,就像我用于 mongo 的主机参数一样:
/usr/bin/mongodump -u backup02 -p backup02_password --port 8133 --host p1dummy:8133,p2dummy:8133,drdummy:8133 --authenticationDatabase admin --out /tmp --db mydbname --ssl --sslAllowInvalidCertificates --excludeCollectionsWithPrefix=system --verbose=5
2021-04-01T12:48:43.899+0000 will listen for SIGTERM, SIGINT, and SIGKILL
2021-04-01T12:48:47.400+0000 Failed: error connecting to db server: no reachable servers
DummyD3 是 3 节点复制集群的 node3。DummyD2 是主要的,DummyD1 是次要的(与主要同步)。
我尝试删除数据路径下的数据,并在第一个在第二个 rsycn 中运行并启动守护进程时从其他辅助节点背靠背两次进行 rsync 以复制更新。
rsync -asvh Dummy1:/mongodb/data/dbinstance/* /mongodb/data/dbinstance
rsync -asvh Dummy1:/mongodb/data/dbinstance/* /mongodb/data/dbinstance
rm /mongodb/data/dbinstance/mongod.lock
rm /mongodb/data/dbinstance/mongod.pid
su - mongoinstance -c "/usr/bin/mongod --config /etc/mongo/dbinstance/mongodb.conf &"
从有问题的节点在屏幕上运行上述命令。
~# mongod --version
db version v4.0.4
我在这里寻找解决方案,如果有人有解决方案来帮助我解决这个问题。
root@DummyD3:~# tail /mongodb/files/errorlogs/dbinstance/mongodb.log
mongod(_ZN5mongo15printStackTraceERSo+0x41) [0x55c2e748caa1]
mongod(+0x23D9CB9) [0x55c2e748bcb9]
mongod(+0x23DA19D) [0x55c2e748c19d]
libpthread.so.0(+0x11390) [0x7fa295382390]
libc.so.6(gsignal+0x38) [0x7fa294fdc428]
libc.so.6(abort+0x16A) [0x7fa294fde02a]
mongod(_ZN5mongo32fassertFailedNoTraceWithLocationEiPKcj+0x0) [0x55c2e5ac1ea7]
mongod(_ZN5mongo17wtRCToStatus_slowEiPKc+0x413) [0x55c2e5bb8eb3]
mongod(_ZN5mongo18WiredTigerKVEngine15_openWiredTigerERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_+0x2D1) [0x55c2e5b90161]
mongod(_ZN5mongo18WiredTigerKVEngineC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PNS_11ClockSourceES8_mbbbb+0x63F) [0x55c2e5b9611f]
mongod(+0xAC6149) [0x55c2e5b78149]
mongod(_ZN5mongo23initializeStorageEngineEPNS_14ServiceContextENS_22StorageEngineInitFlagsE+0x552) [0x55c2e62613a2]
mongod(+0x993251) [0x55c2e5a45251]
mongod(_ZN5mongo11mongoDbMainEiPPcS1_+0x10DB) [0x55c2e5b2d94b]
mongod(main+0x9) [0x55c2e5ac3a39]
libc.so.6(__libc_start_main+0xF0) [0x7fa294fc7830]
mongod(_start+0x29) [0x55c2e5b2bab9]
----- END BACKTRACE -----
我有一个包含 5 个投票成员的 6 个节点副本集(所有这些副本都承载数据)。如果我失去 3 个投票成员,我将没有多数投票成员,我的副本集将变为只读。在这种情况下,如果应用程序有“多数”的读取关注,读取会失败吗?我读过这个多数读取问题引入了“缓存压力”,但是读取会失败吗?或者我是否需要通过以下选项禁用 RC 才能使基本读取(大多数)起作用?
--enableMajorityReadConcern 命令行选项为 false。
replication.enableMajorityReadConcern 配置文件设置为 false。
我想实现 MongoDB 事务。但是有一个名词就是不能单机单独服务器。那么,我必须创建多少个集群才能实现呢?
我将当前/旧运行的数据库转移到一个新的 MongoDB 独立服务器中。为此,我执行了以下操作:
- 从旧服务器转储数据
- 从生成的转储中恢复数据到新服务器
- 配置服务器进行身份验证
问题:
我注意到在执行上述操作后,与旧服务器上的性能相比,新服务器上的一些查询运行速度几乎慢了两倍。
配置:
两台服务器的配置相同,但是新服务器具有 32 GB RAM,而旧服务器具有 28GB RAM。OLD 服务器还运行其他应用程序和服务器。而 NEW 服务器是仅用于此数据库的专用服务器。
CPU 消耗相似,但是 RAM 在 OLD 服务器中被大量占用,而在 NEW 服务器上占用相对较少。
因此,NEW 服务器在硬件和 RAM 消耗方面更出色。新服务器也是独立专用于这个数据库的。
问题:
为什么我的新服务器即使是独立的也比旧服务器慢?我该如何纠正?
我正在使用 mongodb 版本4.2.2
。
我有以下数据:
{
"_id" : ObjectId("5f0c58089c058304f7a64fa9"),
"date" : ISODate("2021-07-11T00:00:00.000Z"),
"dayOfWeek" : 0,
"staffMember" : ObjectId("5f0c58076b559419d62efe47"),
"startTime" : 885
},
/* 2 createdAt:2020-07-13T12:48:08.000Z*/
{
"_id" : ObjectId("5f0c58089c058304f7a64fa8"),
"date" : ISODate("2021-07-11T00:00:00.000Z"),
"dayOfWeek" : 0,
"staffMember" : ObjectId("5f0c58076b559419d62efe47"),
"startTime" : 870
},
/* 3 createdAt:2020-07-13T12:48:08.000Z*/
{
"_id" : ObjectId("5f0c58089c058304f7a64fa7"),
"date" : ISODate("2021-07-11T00:00:00.000Z"),
"dayOfWeek" : 0,
"staffMember" : ObjectId("5f0c58076b559419d62efe47"),
"startTime" : 855
},
/* 4 createdAt:2020-07-13T12:48:08.000Z*/
{
"_id" : ObjectId("5f0c58089c058304f7a64fa6"),
"date" : ISODate("2021-07-11T00:00:00.000Z"),
"dayOfWeek" : 0,
"staffMember" : ObjectId("5f0c58076b559419d62efe47"),
"startTime" : 840
}
我mongoose
在我的项目中使用。当我在节点 js 中运行此查询时:
const { memberId, date } = req.params;
let isoDate = date.toISOString();
let timeSlots = await TimeSlots.find(
{
staffMember: memberId,
date: isoDate
});
结果打印在console
:
db.spaTimeSlots.find({"staffMember" : ObjectId("5f0c58076b559419d62efe47"), date: new Date("Wed, 11 Jul 2020 00:00:00 GMT")})
.projection({})
.sort({_id:-1})
.limit(100)
但是,我想要这个结果:
db.spaTimeSlots.find({"staffMember" : ObjectId("5f0c58076b559419d62efe47"), date: ISODate("2021-07-11T00:00:00.000Z")})
.projection({})
.sort({_id:-1})
.limit(100)
我希望以ISODate
格式返回的结果,而不是文本(即不是Wed, 11 Jul
)。
假设我有以下名为的集合survey
:
{ _id: 1, results: [ { product: "abc", active: true}, { product: "xyz", active: true} ] }
{ _id: 2, results: [ { product: "abc", active: false }, { product: "xyz", active: true } ] }
{ _id: 3, results: [ { product: "abc", active: false }, { product: "xyz", active: false } ] }
通过做:
db.survey.find(
{ results: { $elemMatch: { active: false } }
)
我将获得数组中至少一个对象为假的所有文档,即
{ _id: 2, results: [ { product: "abc", active: false }, { product: "xyz", active: true } ] }
{ _id: 3, results: [ { product: "abc", active: false }, { product: "xyz", active: false } ] }
但是我怎样才能只获得那些拥有所有关键的文档,active: false
即:
{ _id: 3, results: [ { product: "abc", active: false }, { product: "xyz", active: false } ] }
蒂亚..
这是 4.0 版中一个非常有趣的变化,因为检查点似乎起到了与日志非常相似的作用。
检查点确保数据文件在最后一个检查点之前是一致的,包括最后一个检查点;即检查点可以充当恢复点。
好的,所以检查点为我提供了最后一个检查点的数据的持久视图。在发生崩溃的情况下,我在最后一个检查点之后丢失了所有数据。
WiredTiger 日志保留检查点之间的所有数据修改。如果 MongoDB 在检查点之间退出,它会使用日志重放自上一个检查点以来修改的所有数据。
当 Journal 跟踪所有操作时,这有点额外的耐用性。它就像一个我们可以在失败后重新申请的清单。
日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 创建一个日志记录,其中包括更新操作及其关联的索引修改。
似乎检查点的目的是快速移动,但有一次丢失一分钟数据的风险。而该杂志是关于对一切进行会计处理的。那么为什么两者都有呢?似乎让 Journal 覆盖了 Checkpoints 应该提供的任何收益。