mangodb 之 初出茅庐
mongodb 是使用c++编写,面向文档的非关系型数据库。数据以bson(类似json)的格式存储。
mongodb中包含的主要术语:
- 库(database): 类似MySQL中的库
- 集合(collection):类似MySQL中的表,集合没有数据结构,可以存放任意类型的文档数据
- 文档(document):类似MySQL中的row,是一条条bson格式的数据记录
- 域(field): 类似MySQL 中的列column
- 索引(index): 类似MySQL 中的索引
- 主键(_id): mongodb 自动生成主键 _id
快速开始
测试版本 5.0 2024-04-07 20:30
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.13.tgz tar xf mongodb-linux-x86_64-rhel70-5.0.13.tgz
cd mongodb-linux-x86_64-rhel70-5.0.13/bin mkdir ../{logs,data} ./mongod --port=27017 --logpath=../logs/mongod.log --dbpath=../data --fork
bin]# ./mongo > show databases; admin 0.000GB config 0.000GB local 0.000GB
> show dbs; admin 0.000GB config 0.000GB local 0.000GB
CRUD
库操作
-
创建库
# 创建并切换到 newdatabase,数据库名不能包含 " " 、 特殊字符,最多64个字符,建议全部小写 > use newdatabase; switched to db newdatabas -
删除库
# 删除当前数据库,这个操作更像一个清空数据的动作 > db.dropDatabase() { "ok" : 1 } -
修改库
-
查询库
# 查看数据库 # show dbs; # show databases; # 此时我们没有看到 newdatabase ,因为在mongo中默认显示有集合的db > show databases; admin 0.000GB # 存放用户和权限信息 config 0.000GB # 在复制集和分片中 local 库中的数据不会复制到其他mongod 实例 local 0.000GB # 分片集群保存分片相关信息 # 查看当前所在的数据库 > db newdatabase # 此时在查看databases 发现已经可以显示了 > db.newtable.insert({name: "wangendao"}) WriteResult({ "nInserted" : 1 }) > show dbs; admin 0.000GB config 0.000GB local 0.000GB newdatabase 0.000GB
集合操作
-
创建集合
# 创建集合 db.createCollection('userinfo') db.userinfo.insert({name:'user01',tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]}) -
删除集合
# 删除集合 > db.userinfo.drop() true -
修改集合
-
查看集合
# 查看集合 show collections show tables
文档操作
文档操作增、删、改、查
-
新增文档
// 切换或创建数据库 use newdatabase -
insert 在3.6 版本中提示已经废弃
插入单条数据
db.userinfo.insert( {name:'user001',tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]} ) 插入多条数据
db.userinfo.insert([ {name:'user001',tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]}, {name:"user002",tel: "",level: ""} ]) for(let i=1;i<10;i++){ db.userinfo.insert({name:'user00'+i,tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]}) } -
insertOne
db.userinfo.insertOne({name: 'user002',tel: 17727842169,level: 'vip4',skills:["python,go,mongo"]}) 插入多条数据
for(let i=1;i<10;i++){ db.userinfo.insertOne({name:'user00'+i,tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]}) } -
insertMany
db.userinfo.insertMany([ {name:'user001',tel: 17727842169, level: 'vip3',skills:["python","go","redis","mongo"]}, {name:"user002",tel: "",level: ""} ]) -
bulkWrite
-
-
删除文档
-
remove 提示在3.2 版本中提示已经废弃
// 删除所有内容 db.userinfo.remove({}) // 删除指定内容 db.userinfo.remove({_id: 1}) -
deleteOne
// 按照升序顺序删除一条文档 db.userinfo.deleteOne({}) 删除指定内容
db.userinfo.deleteOne({skills:['python','go','redis','mongo']}) db.userinfo.deleteOne({name:{$in:['zhangsan3','zhangsan2']}}) -
deleteMany
// 删除所有内容 db.userinfo.deleteMany({}) 删除指定内容
db.userinfo.deleteMany({skills:['python','go','redis','mongo']}) db.userinfo.deleteMany({name:{$in:['zhangsan3','zhangsan2']}}) -
findOneAndDelete
删除并返回被删除的内容,雷同于python 中数组的pop()
newdatabse> db.userinfo.findOneAndDelete({name: 'user9'}) { _id: ObjectId('6612938d63e940a434c00e8a'), name: 'user9', age: 9 } -
findOneAndReplace
使用新的集合替换完全替换旧文档内容,并返回旧文档
newdatabases> db.userinfo.findOneAndReplace({name: 'user6'},{name: "user6",tel: '17727842169'}) { _id: ObjectId('66129732413ddd1570c00e83'), name: 'user6', age: 6 } -
findOneAndUpdate
更新文档内容,并返回旧文档内容
newdatabases> db.userinfo.findOneAndUpdate({age: 7},{$set: {age: 17}}) { _id: ObjectId('66129732413ddd1570c00e84'), name: 'user7', age: 7 } -
bulkWrite
-
-
修改文档
-
update
db.集合名称.update({选择条件},{更新后字段},{可选项}),在6.0版本中提示已经废除
-
-
查询文档
-
insert
use test -
update
基本语法:
# 如果不带$set 更新后只保留{level:"vip2} db.userinfo.update({name: "user001"},{level: "vip2"}) db.userinfo.update({name: 'user002'},{$set:{level: "level2"}}) db.userinfo.update({level: 'vip2'},{$set:{address: 'gd',name: 'user002'}}) # 如果不带{multi :true} 则只更新第一个匹配的记录 db.userinfo.update({level: 'vip3'},{$set:{level: 'vip4'}},{multi: true}) updataMany db.userinfo.updateMany db.userinfo.updateOne db.userinfo.updateSearchIndex # 把age 字段+1 > db.userinfo.update({name: "user003"},{$inc:{age:NumberInt(1)}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.userinfo.find() { "_id" : ObjectId("660c0c8455d92d32d47c7f4f"), "name" : "user001", "tel" : 17727842169, "level" : "vip3", "skills" : [ "python", "go", "redis", "mongo" ] } { "_id" : ObjectId("660c0c8455d92d32d47c7f50"), "name" : "user002", "tel" : "", "level" : "" } { "_id" : ObjectId("660c114d55d92d32d47c7f51"), "name" : "user003", "age" : 34 } -
find
# 查询集合中所有文档 db.userinfo.find({}) db.userinfo.find({}).pretty() db.userinfo.find({level: 'vip2'}).pretty() # 只显示指定字段 1 表示显示,0 表示不显示 > db.userinfo.find( {level: 'vip3'}, {name:1} ) { "_id" : ObjectId("660c0c8455d92d32d47c7f4f"), "name" : "user001" } # 只显示指定字段 > db.userinfo.find( {level: 'vip3'}, {name:1,_id:0} ) { "name" : "user001" } 正则查询,支持js的正则表达
db.userinfo.find({level: /^vip[0-3]+/}) 比较查询 < <= > >= = !=
db.userinfo.find({name: {$lt: 'user005'}}) db.userinfo.find({name: {$lte: 'user005'}}) db.userinfo.find({name: {$gt: 'user005'}}) db.userinfo.find({name: {$gte: 'user005'}}) db.userinfo.find({name: {$eq: 'user005'}}) db.userinfo.find({name: {$ne: 'user005'}}) **包含查询 in nin **
db.userinfo.find({name: {$in: ["user001","user002"]}}) db.userinfo.find({name: {$nin: ["user001","user002"]}}) 逻辑 and or
and
db.userinfo.find({name: {$ne: 'user005'},level: 'vip2'}) db.userinfo.find({ $and:[ {name: {$lt:'user005'}}, {level: 'vip2'} ] }) or
db.userinfo.find({ $or:[ {name: 'user005'}, {level: 'vip2'} ] }) 匹配skill 数组有4个元素的
db.userinfo.find({skills:{$size: 4}}) 按照名称排序
1 升序
-1 降序
db.userinfo.find({skills:{$size: 4}}).sort({name: -1}) db.userinfo.find({skills:{$size: 4}}).sort({name: -1}).skip(1).limit(2) 分页查询
# 查询集合中有多少条文档 db.userinfo.count() # 限制返回一条 db.userinfo.find().limit(1) # 限制返回一条,并跳过第一条。等同于返回第二条数据 > db.userinfo.find().limit(1).skip(1) db.userinfo.count({skills:{$size: 4}}) db.userinfo.find({skills:{$size: 4}}).count() 去重 > db.userinfo.distinct('level') [ "vip2", "vip4" ]
索引
mongodDB 使用 b-tree 索引,单字段索引和符合索引
-
创建索引
db.alert.createIndexes(keys,options) monitor> db.alert.getIndexes() [ { v: 2, key: { _id: 1 }, name: '_id_' } ] monitor> db.alert.createIndex({alertname:1}) alertname_1 monitor> db.alert.getIndexes() [ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { alertname: 1 }, name: 'alertname_1' } ] monitor> db.alert.createIndex({alertname:1,instance:1}) alertname_1_instance_1 monitor> db.alert.getIndexes() [ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { alertname: 1 }, name: 'alertname_1' }, { v: 2, key: { alertname: 1, instance: 1 }, name: 'alertname_1_instance_1' } ] -
查看索引
monitor> db.alert.getIndexes() // v:2 表示v2版本 // key: { _id: 1} 以_id 为field为索引,_id:1 其中1表示 升序 // name: '_id_' 索引名称 [ { v: 2, key: { _id: 1 }, name: '_id_' } ] -
删除索引
# 按照索引名称 db.alert.dropIndex('alertname_1') # 按照索引条件 db.alert.dropIndex({alertname:1,instance:1}) # 删除所有索引 db.alert.dropIndexes()
查询计划
查询是否使用了索引
monitor> db.alert.find({_id: ObjectId('660f919214f296d707ec7cfd')}).explain() { explainVersion: '1', queryPlanner: { namespace: 'monitor.alert', indexFilterSet: false, parsedQuery: { _id: { '$eq': ObjectId('660f919214f296d707ec7cfd') } }, queryHash: 'A300CFDE', planCacheKey: 'D6154327', maxIndexedOrSolutionsReached: false, maxIndexedAndSolutionsReached: false, maxScansToExplodeReached: false, winningPlan: { stage: 'IDHACK' }, rejectedPlans: [] }, command: { find: 'alert', filter: { _id: ObjectId('660f919214f296d707ec7cfd') }, '$db': 'monitor' }, serverInfo: { host: '01cd0479423b', port: 27017, version: '5.0.25', gitVersion: 'dab8c370be035063df257746cc1a2de1bf36bcd4' }, serverParameters: { internalQueryFacetBufferSizeBytes: 104857600, internalQueryFacetMaxOutputDocSizeBytes: 104857600, internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600, internalDocumentSourceGroupMaxMemoryBytes: 104857600, internalQueryMaxBlockingSortMemoryUsageBytes: 104857600, internalQueryProhibitBlockingMergeOnMongoS: 0, internalQueryMaxAddToSetBytes: 104857600, internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600 }, ok: 1 }
副本集
- 主节点 primary : 支持读写
- 从节点 secondaries: 支持读操作
- 仲裁者 arbiter: 不保留任何数据的副本,只具有投票选举作用。 也可以将仲裁服务与副本服务部署在一起
分片集
分片集群包含如下组件:
- shard: 是一个复制集,存储分片数据集的一部分数据
- mongos: 为客户端提供了访问mongo的路由
- config servers:存储集群的元数据和配置信息。从3.4开始 config servers 必须部署为复制集架构
架构图
部署config servers
-
启动config server
配置文件
config/configsvr.yaml
sharding: clusterRole: configsvr replication: replSetName: config net: bindIp: 0.0.0.0 storage: dbPath: /tmp directoryPerDB: true engine: wiredTiger journal: enabled: true wiredTiger: collectionConfig: blockCompressor: snappy engineConfig: cacheSizeGB: 0.25 directoryForIndexes: true indexConfig: prefixCompression: true docker-compose.yaml
version: "3.3" networks: mongodb: driver: bridge ipam: config: - subnet: 172.31.4.0/24 services: mongoconfig1: networks: mongodb: ipv4_address: 172.31.4.11 # aliases: # - mongoconfig1 image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig2: networks: mongodb: ipv4_address: 172.31.4.12 # aliases: # - mongoconfig2 image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig3: networks: mongodb: ipv4_address: 172.31.4.13 # aliases: # - mongoconfig3 image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] docker-compose up -d -
构建config server 复制集
echo 'rs.initiate( { _id: "config", configsvr: true, members: [ { _id : 0, host : "mongoconfig1:27019" }, { _id : 1, host : "mongoconfig2:27019" }, { _id : 2, host : "mongoconfig3:27019" } ] } )'|mongosh --host mongoconfig2 --port 27019 查看复制集状态
config [direct: primary] test> rs.status() { set: 'config', date: ISODate('2024-04-06T09:21:58.702Z'), myState: 1, term: Long('1'), syncSourceHost: '', syncSourceId: -1, configsvr: true, heartbeatIntervalMillis: Long('2000'), majorityVoteCount: 2, writeMajorityCount: 2, votingMembersCount: 3, writableVotingMembersCount: 3, optimes: { lastCommittedOpTime: { ts: Timestamp({ t: 1712395318, i: 1 }), t: Long('1') }, lastCommittedWallTime: ISODate('2024-04-06T09:21:58.474Z'), readConcernMajorityOpTime: { ts: Timestamp({ t: 1712395318, i: 1 }), t: Long('1') }, appliedOpTime: { ts: Timestamp({ t: 1712395318, i: 1 }), t: Long('1') }, durableOpTime: { ts: Timestamp({ t: 1712395318, i: 1 }), t: Long('1') }, lastAppliedWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastDurableWallTime: ISODate('2024-04-06T09:21:58.474Z') }, lastStableRecoveryTimestamp: Timestamp({ t: 1712395299, i: 1 }), electionCandidateMetrics: { lastElectionReason: 'electionTimeout', lastElectionDate: ISODate('2024-04-06T09:21:50.263Z'), electionTerm: Long('1'), lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1712395299, i: 1 }), t: Long('-1') }, lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1712395299, i: 1 }), t: Long('-1') }, numVotesNeeded: 2, priorityAtElection: 1, electionTimeoutMillis: Long('10000'), numCatchUpOps: Long('0'), newTermStartDate: ISODate('2024-04-06T09:21:50.297Z'), wMajorityWriteAvailabilityDate: ISODate('2024-04-06T09:21:50.831Z') }, members: [ { _id: 0, name: 'mongoconfig1:27019', health: 1, state: 2, stateStr: 'SECONDARY', uptime: 19, optime: { ts: Timestamp({ t: 1712395317, i: 1 }), t: Long('1') }, optimeDurable: { ts: Timestamp({ t: 1712395317, i: 1 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:21:57.000Z'), optimeDurableDate: ISODate('2024-04-06T09:21:57.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastDurableWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastHeartbeat: ISODate('2024-04-06T09:21:58.274Z'), lastHeartbeatRecv: ISODate('2024-04-06T09:21:57.279Z'), pingMs: Long('0'), lastHeartbeatMessage: '', syncSourceHost: 'mongoconfig2:27019', syncSourceId: 1, infoMessage: '', configVersion: 1, configTerm: 1 }, { _id: 1, name: 'mongoconfig2:27019', health: 1, state: 1, stateStr: 'PRIMARY', uptime: 150, optime: { ts: Timestamp({ t: 1712395318, i: 1 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:21:58.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastDurableWallTime: ISODate('2024-04-06T09:21:58.474Z'), syncSourceHost: '', syncSourceId: -1, infoMessage: 'Could not find member to sync from', electionTime: Timestamp({ t: 1712395310, i: 1 }), electionDate: ISODate('2024-04-06T09:21:50.000Z'), configVersion: 1, configTerm: 1, self: true, lastHeartbeatMessage: '' }, { _id: 2, name: 'mongoconfig3:27019', health: 1, state: 2, stateStr: 'SECONDARY', uptime: 19, optime: { ts: Timestamp({ t: 1712395317, i: 1 }), t: Long('1') }, optimeDurable: { ts: Timestamp({ t: 1712395317, i: 1 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:21:57.000Z'), optimeDurableDate: ISODate('2024-04-06T09:21:57.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastDurableWallTime: ISODate('2024-04-06T09:21:58.474Z'), lastHeartbeat: ISODate('2024-04-06T09:21:58.273Z'), lastHeartbeatRecv: ISODate('2024-04-06T09:21:57.276Z'), pingMs: Long('0'), lastHeartbeatMessage: '', syncSourceHost: 'mongoconfig2:27019', syncSourceId: 1, infoMessage: '', configVersion: 1, configTerm: 1 } ], ok: 1, '$gleStats': { lastOpTime: Timestamp({ t: 1712395299, i: 1 }), electionId: ObjectId('7fffffff0000000000000001') }, lastCommittedOpTime: Timestamp({ t: 1712395318, i: 1 }), '$clusterTime': { clusterTime: Timestamp({ t: 1712395318, i: 1 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1712395318, i: 1 }) }
部署shard
-
配置文件
[root@lavm-ioreaqndwv mongoshare]# cat config/mongod.yaml sharding: clusterRole: shardsvr replication: replSetName: shard1 net: bindIp: 0.0.0.0 storage: dbPath: /tmp directoryPerDB: true engine: wiredTiger journal: enabled: true wiredTiger: collectionConfig: blockCompressor: snappy engineConfig: cacheSizeGB: 0.25 directoryForIndexes: true indexConfig: prefixCompression: true -
docker-composer.yaml
version: "3.3" networks: mongodb: driver: bridge ipam: config: - subnet: 172.31.4.0/24 services: mongoconfig1: networks: mongodb: ipv4_address: 172.31.4.11 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig2: networks: mongodb: ipv4_address: 172.31.4.12 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig3: networks: mongodb: ipv4_address: 172.31.4.13 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] shard1: networks: mongodb: ipv4_address: 172.31.4.21 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] shard2: networks: mongodb: ipv4_address: 172.31.4.22 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] shard3: networks: mongodb: ipv4_address: 172.31.4.23 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] -
初始化
echo 'rs.initiate( { _id: "shard1", configsvr: false, members: [ { _id : 0, host : "shard1:27018" }, { _id : 1, host : "shard2:27018" }, { _id : 2, host : "shard3:27018" } ] } )'|mongosh --host shard3 --port 27018 shard1 [direct: primary] test> rs.status() { set: 'shard1', date: ISODate('2024-04-06T09:49:57.241Z'), myState: 1, term: Long('1'), syncSourceHost: '', syncSourceId: -1, heartbeatIntervalMillis: Long('2000'), majorityVoteCount: 2, writeMajorityCount: 2, votingMembersCount: 3, writableVotingMembersCount: 3, optimes: { lastCommittedOpTime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, lastCommittedWallTime: ISODate('2024-04-06T09:49:49.570Z'), readConcernMajorityOpTime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, appliedOpTime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, durableOpTime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, lastAppliedWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastDurableWallTime: ISODate('2024-04-06T09:49:49.570Z') }, lastStableRecoveryTimestamp: Timestamp({ t: 1712396979, i: 1 }), electionCandidateMetrics: { lastElectionReason: 'electionTimeout', lastElectionDate: ISODate('2024-04-06T09:49:49.514Z'), electionTerm: Long('1'), lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1712396979, i: 1 }), t: Long('-1') }, lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1712396979, i: 1 }), t: Long('-1') }, numVotesNeeded: 2, priorityAtElection: 1, electionTimeoutMillis: Long('10000'), numCatchUpOps: Long('0'), newTermStartDate: ISODate('2024-04-06T09:49:49.560Z'), wMajorityWriteAvailabilityDate: ISODate('2024-04-06T09:49:51.021Z') }, members: [ { _id: 0, name: 'shard1:27018', health: 1, state: 2, stateStr: 'SECONDARY', uptime: 17, optime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, optimeDurable: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:49:49.000Z'), optimeDurableDate: ISODate('2024-04-06T09:49:49.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastDurableWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastHeartbeat: ISODate('2024-04-06T09:49:55.522Z'), lastHeartbeatRecv: ISODate('2024-04-06T09:49:57.028Z'), pingMs: Long('0'), lastHeartbeatMessage: '', syncSourceHost: 'shard3:27018', syncSourceId: 2, infoMessage: '', configVersion: 1, configTerm: 1 }, { _id: 1, name: 'shard2:27018', health: 1, state: 2, stateStr: 'SECONDARY', uptime: 17, optime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, optimeDurable: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:49:49.000Z'), optimeDurableDate: ISODate('2024-04-06T09:49:49.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastDurableWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastHeartbeat: ISODate('2024-04-06T09:49:55.523Z'), lastHeartbeatRecv: ISODate('2024-04-06T09:49:57.028Z'), pingMs: Long('0'), lastHeartbeatMessage: '', syncSourceHost: 'shard3:27018', syncSourceId: 2, infoMessage: '', configVersion: 1, configTerm: 1 }, { _id: 2, name: 'shard3:27018', health: 1, state: 1, stateStr: 'PRIMARY', uptime: 1044, optime: { ts: Timestamp({ t: 1712396989, i: 5 }), t: Long('1') }, optimeDate: ISODate('2024-04-06T09:49:49.000Z'), lastAppliedWallTime: ISODate('2024-04-06T09:49:49.570Z'), lastDurableWallTime: ISODate('2024-04-06T09:49:49.570Z'), syncSourceHost: '', syncSourceId: -1, infoMessage: 'Could not find member to sync from', electionTime: Timestamp({ t: 1712396989, i: 1 }), electionDate: ISODate('2024-04-06T09:49:49.000Z'), configVersion: 1, configTerm: 1, self: true, lastHeartbeatMessage: '' } ], ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1712396989, i: 5 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1712396989, i: 5 }) }
部署mongos
-
配置文件
sharding: configDB: config/mongoconfig1:27019,mongoconfig2:27019,mongoconfig3:27019 net: bindIp: 0.0.0.0 -
docker-compose.yaml
version: "3.3" networks: mongodb: driver: bridge ipam: config: - subnet: 172.31.4.0/24 services: mongoconfig1: networks: mongodb: ipv4_address: 172.31.4.11 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig2: networks: mongodb: ipv4_address: 172.31.4.12 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] mongoconfig3: networks: mongodb: ipv4_address: 172.31.4.13 aliases: - config image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/configsvr.yaml:/etc/configsvr.yaml" entrypoint: ["mongod","-f","/etc/configsvr.yaml"] shard1: networks: mongodb: ipv4_address: 172.31.4.21 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] shard2: networks: mongodb: ipv4_address: 172.31.4.22 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] shard3: networks: mongodb: ipv4_address: 172.31.4.23 aliases: - shard image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongod.yaml:/etc/mongod.yaml" entrypoint: ["mongod","-f","/etc/mongod.yaml"] mongos1: networks: mongodb: ipv4_address: 172.31.4.31 aliases: - mongos image: mongodb/mongodb-community-server:5.0-ubuntu2004 volumes: - "./config/mongos.yaml:/etc/mongos.yaml" entrypoint: ["mongos","-f","/etc/mongos.yaml"] -
添加分片信息
[direct: mongos] monitor> sh.addShard( "shard1/shard1:27018,shard2:27018,shard3:27018") { shardAdded: 'shard1', ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1712399671, i: 4 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1712399671, i: 4 }) } -
为指定数据库启用分片
sh.enableSharding("monitor") -
对指定数据库中指定集合按照指定算法进行分片
sh.shardCollection("monitor.alert", { name : "hashed" } )
mongodb 增加副本
rs.add()
路由节点 mongos
配置节点 config
复制集:
primary
secoundary
仲裁节点
sh.status()
config 是mongo的配置文件数据库
-
服务端启动认证
-
mongod -f mongod.conf --auth
-
方式2
security: authorization: enabled
-
newdatabase> db.userinfo.count() DeprecationWarning: Collection.count() is deprecated. Use countDocuments or estimatedDocumentCount. 4 newdatabase> db.userinfo.countDocuments() 4 newdatabase> db.userinfo.estimatedDcocumentCount() TypeError: db.userinfo.estimatedDcocumentCount is not a function newdatabase> db.userinfo.estimatedDocumentCount() 4 newda
安全认证
-
拿到数据库如何确定数据库版本,架构 等基本信息
-
查看数据库文档大小,和索引大小
-
慢查询原因,如何判断查询是否走了索引
-
数据备份和恢复
-
数据迁移
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示