老板说 MongoDB 测试环境这么贵,弄单机? 开发说要复制集测试? 你们这群XXX!!
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
线上的云使用的云原生或云托管数据库产品,我们使用的当然很爽,可线下的数据库搭建和使用这部分,也并不是没有需求,这里测试库是我们日常的工作,而在日常的工作中,MongoDB的搭建就产生一个问题,我们是搭建单机,还是搭建复制集。
在搭建复制集在测试库中是没有必要的,而我们希望测试机能提供与复制集类似的一些模拟和联系的需求比如我们通过云上的数据库同步工具,将线上的数据同步到线下的MongoDB.而单机的MongoDB 是无法满足这个需求的也就是我们需要一个单体的MongoDB 但要可以具有oplogs。所以我们在下面的环节,对于测试环境,我们建立一个只有一个节点的MongoDB的主集群。
大致的过程如下
1 下载MongoDB 8.2.1 社区版
2 下载MongoDB tools 和 mongosh 程序
(之前老版本中Mongodb是通过mongo来访问数据库,而后期工具与数据库和访问工具都单独进行打包,需要分别下载这些部分)
3 规划目录,规划配置文件
systemLog:
destination: file
path: "/mongodb/mongod.log"
logAppend: true
timeStampFormat: iso8601-local
processManagement:
fork: false
net:
bindIp: 192.168.198.100
port: 27017
maxIncomingConnections: 5000
wireObjectCheck: true
security:
keyFile: /mongodb/keyfile/keyfile.key
clusterAuthMode: keyFile
authorization: disabled
javascriptEnabled: true
clusterIpSourceAllowlist: ["192.168.198.100/24","192.168.198.101/24","192.168.198.102/24"]
storage:
dbPath: /mongodb/data/
journal:
commitIntervalMs: 50
directoryPerDB: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
journalCompressor: zstd
directoryForIndexes: true
indexConfig:
prefixCompression: true
oplogMinRetentionHours: 1
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100
slowOpSampleRate: 0.5
replication:
oplogSizeMB: 10240
replSetName: test
这里需要注意几点,在第一次安装时需要建立配置文件中的对应的目录,同时对这些目录赋予mongo user的权限,配置文件第一次在没有配置账号密码的情况下,需要注释掉
replication keyFile: /mongodb/keyfile/keyfile.key
clusterAuthMode: keyFile
同时启动时 authorization: disabled 将认证设置为 disabled
启动后,先在admin数据库建立root账号,然后在关闭mongodb数据库,将上述的配置文件打开注释,并将authorization: disabled 设置为enabled。
在将系统设置为复制集
Enterprise admin>
... rs.initiate({
... _id: "test",
... members: [
... { _id: 0, host: "192.168.198.100:27017" }
... ]
... })
{ ok: 1 }
Enterprise test [direct: other] admin> rs.conf()
{
_id: 'test',
version: 1,
term: 1,
members: [
{
_id: 0,
host: '192.168.198.100:27017',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
tags: {},
secondaryDelaySecs: Long('0'),
votes: 1
}
],
protocolVersion: Long('1'),
writeConcernMajorityJournalDefault: true,
settings: {
chainingAllowed: true,
heartbeatIntervalMillis: 2000,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000,
catchUpTimeoutMillis: -1,
catchUpTakeoverDelayMillis: 30000,
getLastErrorModes: {},
getLastErrorDefaults: { w: 1, wtimeout: 0 },
replicaSetId: ObjectId('68ebb18be68c384ef91271f9')
}
}
至此一个供测试使用的mongodb建立成功。
Enterprise test [direct: primary] test> rs.status()
{
set: 'test',
date: ISODate('2025-10-12T14:17:28.730Z'),
myState: 1,
term: Long('2'),
syncSourceHost: '',
syncSourceId: -1,
heartbeatIntervalMillis: Long('2000'),
majorityVoteCount: 1,
writeMajorityCount: 1,
votingMembersCount: 1,
writableVotingMembersCount: 1,
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
lastCommittedWallTime: ISODate('2025-10-12T14:17:24.676Z'),
readConcernMajorityOpTime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
appliedOpTime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
durableOpTime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
writtenOpTime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
lastAppliedWallTime: ISODate('2025-10-12T14:17:24.676Z'),
lastDurableWallTime: ISODate('2025-10-12T14:17:24.676Z'),
lastWrittenWallTime: ISODate('2025-10-12T14:17:24.676Z')
},
lastStableRecoveryTimestamp: Timestamp({ t: 1760278615, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: 'electionTimeout',
lastElectionDate: ISODate('2025-10-12T14:17:14.671Z'),
electionTerm: Long('2'),
lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 0, i: 0 }), t: Long('-1') },
lastSeenWrittenOpTimeAtElection: { ts: Timestamp({ t: 1760278625, i: 1 }), t: Long('1') },
lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1760278625, i: 1 }), t: Long('1') },
numVotesNeeded: 1,
priorityAtElection: 1,
electionTimeoutMillis: Long('10000'),
newTermStartDate: ISODate('2025-10-12T14:17:14.675Z'),
wMajorityWriteAvailabilityDate: ISODate('2025-10-12T14:17:14.725Z')
},
members: [
{
_id: 0,
name: '192.168.198.100:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
uptime: 14,
optime: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
optimeDate: ISODate('2025-10-12T14:17:24.000Z'),
optimeWritten: { ts: Timestamp({ t: 1760278644, i: 1 }), t: Long('2') },
optimeWrittenDate: ISODate('2025-10-12T14:17:24.000Z'),
lastAppliedWallTime: ISODate('2025-10-12T14:17:24.676Z'),
lastDurableWallTime: ISODate('2025-10-12T14:17:24.676Z'),
lastWrittenWallTime: ISODate('2025-10-12T14:17:24.676Z'),
syncSourceHost: '',
syncSourceId: -1,
infoMessage: 'Could not find member to sync from',
electionTime: Timestamp({ t: 1760278634, i: 1 }),
electionDate: ISODate('2025-10-12T14:17:14.000Z'),
configVersion: 1,
configTerm: 2,
self: true,
lastHeartbeatMessage: ''
}
],
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1760278644, i: 1 }),
signature: {
hash: Binary.createFromBase64('LUOca5KJRvvlj1HCbImV9pb9YiI=', 0),
keyId: Long('7560331610030080007')
}
},
operationTime: Timestamp({ t: 1760278644, i: 1 })
}
Enterprise test [direct: primary] test>
MongoDB 的很多高级功能(如下)都必须依赖副本集才能启用:
Multi-document Transactions(多文档事务)
Change Streams(变更流)
$lookup与事务结合Majority 写入语义
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase Hybrid search 能力测试,平换MySQL的好选择
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究
OceanBase 6大学习法--OBCA视频学习总结第六章
OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计
OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 新版本就一定好--由培训现象让我做的实验
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
MySQL相关文章
一篇为MySQL用户,分析版本核心差异的文章--8.028-8.4的差异
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师
数据库优化系列
微软动手了,联合OpenAI + Azure 云争夺AI服务市场
HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!
从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会
被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......
个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等
从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!
SQL SERVER 2025发布了, China幸亏有信创!
删除数据“八扇屏” 之 锦门英豪 --我去-BigData!
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》