MongoDB实操-副本集 分片 索引
MongoDB实操-副本集 分片 索引
副本集#
一主一从(3.4版本)#
搭建#
docker pull mongo:3.4
#创建yml文件
vi /home/test/monodbtest1/docker-compose.yml
#======================yml文件配置======================
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodbml/master:/data/db
command: mongod --dbpath /data/db --master
slaver:
image: mongo:3.4
volumes:
- /data/mongodbml/slaver:/data/db
command: mongod --dbpath /data/db --slave --source master:27017
links:
- master
#======================yml文件配置结束======================
#执行yml文件
docker-compose up -d
进入主节点查看信息#
docker-compose exec master mongo
#查看配置
rs.conf()
#查看副本集状态
rs.status()
进入从挂载主节点#
docker-compose exec slaver mongo
rs.slaveOk()
故障测试#
docker-compose stop master
经测试,主节点宕机,从节点无法写入。
一主两从(3.4版本)#
搭建#
version: '2'
services:
rs1:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/master:/data/db
command: mongod --dbpath /data/db --replSet myset
rs2:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/slaver1:/data/db
command: mongod --dbpath /data/db --replSet myset
rs3:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/slaver2:/data/db
command: mongod --dbpath /data/db --replSet myset
各节点配置#
进入主节点
rs.initiate()
rs.add('slaver1:27017')
rs.add('slaver2:27017')
进入从节点配置
rs.slaveOk()
经测试,主节点宕机,从节点重新被选举为主节点,主节点再次启动,成为从节点。
一主一从一仲裁(3.4版本)#
搭建#
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs1:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
slave:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs2:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
myarbiter:
image: mongo:3.4
command: mongod --dbpath /data/db --replSet newset --smallfiles --oplogSize 128
配置节点#
主节点
docker-compose exec master mongo
rs.initiate()
rs.add('slave:27017')
rs.add('myarbiter:27017',true)//设置为仲裁节点
从节点、仲裁节点配置
rs.slaveOk()
多节点(lastest)#
创建容器#
docker run --name mongo0 -p 27010:27017 -d mongo:lastest mongod --replSet "rs"
docker run --name mongo1 -p 27011:27017 -d mongo:lastest mongod --replSet "rs"
docker run --name mongo2 -p 27012:27017 -d mongo:lastest mongod --replSet "rs"
进入主节点配置#
#进入mongo1容器
docker exec -ti mongo1 /bin/bash
#连接mondb
mongo
#初始化副本集
rs.initiate({"_id": "rs", "members": [{"_id":0, "host":"10.168.1.130:27010"}, {"_id":1, "host":"10.168.1.130:27011"}, {"_id":2, "host":"10.168.1.130:27012","arbiterOnly":true}]})
exit
mongo
rs.conf()
"arbiterOnly":true
为仲裁配置
分片#
yml创建#
version: '2'
services:
shard1:
image: mongo:4.0.5
container_name: mongo_shard1
command: mongod --shardsvr --directoryperdb --replSet shard1
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/shard1:/data/db
privileged: true
networks:
- mongo
shard2:
image: mongo:4.0.5
container_name: mongo_shard2
command: mongod --shardsvr --directoryperdb --replSet shard2
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/shard2:/data/db
privileged: true
networks:
- mongo
shard3:
image: mongo:4.0.5
container_name: mongo_shard3
command: mongod --shardsvr --directoryperdb --replSet shard3
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/shard3:/data/db
privileged: true
networks:
- mongo
config1:
image: mongo:4.0.5
container_name: mongo_config1
command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/config1:/data/configdb
networks:
- mongo
config2:
image: mongo:4.0.5
container_name: mongo_config2
command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/config2:/data/configdb
networks:
- mongo
config3:
image: mongo:4.0.5
container_name: mongo_config3
command: mongod --configsvr --directoryperdb --replSet fates-mongo-config --smallfiles
volumes:
- /etc/localtime:/etc/localtime
- /data/base/fates/mongo/config3:/data/configdb
networks:
- mongo
mongos:
image: mongo:4.0.5
container_name: mongo_mongos
command: mongos --configdb fates-mongo-config/config1:27019,config2:27019,config3:27019 --bind_ip 0.0.0.0 --port 27017
ports:
- 27017:27017
volumes:
- /etc/localtime:/etc/localtime
depends_on:
- config1
- config2
- config3
networks:
- mongo
networks:
mongo:
driver: bridge
执行#
docker network create mongo
编写运行脚本#
docker-compose up -d
sleep 30s
docker-compose exec config1 bash -c "echo 'rs.initiate({_id: \"fates-mongo-config\",configsvr: true, members: [{ _id : 0, host : \"config1:27019\" },{ _id : 1, host : \"config2:27019\" }, { _id : 2, host : \"config3:27019\" }]})' | mongo --port 27019"
docker-compose exec shard1 bash -c "echo 'rs.initiate({_id: \"shard1\",members: [{ _id : 0, host : \"shard1:27018\" }]})' | mongo --port 27018"
docker-compose exec shard2 bash -c "echo 'rs.initiate({_id: \"shard2\",members: [{ _id : 0, host : \"shard2:27018\" }]})' | mongo --port 27018"
docker-compose exec shard3 bash -c "echo 'rs.initiate({_id: \"shard3\",members: [{ _id : 0, host : \"shard3:27018\" }]})' | mongo --port 27018"
docker-compose exec mongos bash -c "echo 'sh.addShard(\"shard1/shard1:27018\")' | mongo"
docker-compose exec mongos bash -c "echo 'sh.addShard(\"shard2/shard2:27018\")' | mongo"
docker-compose exec mongos bash -c "echo 'sh.addShard(\"shard3/shard3:27018\")' | mongo"
替换文本的换行等字符串#
sed -i 's/\r$//' deploy-and-start.sh
运行脚本#
sh deploy-and-start.sh
进入容器&进入mongo#
docker exec -it mongo_mongos bash
mongo --host 10.168.1.130 --port 27017
使用分片创建数据库#
sh.enableSharding("mongodbDemo")
对_id 进行哈希分片:#
sh.shardCollection("mongodbDemo.order", {"_id": "hashed" })
刷新路由#
db.adminCommand("flushRouterConfig")
让当前分片支持平衡#
sh.enableBalancing("mongodbDemo.order")
开启平衡#
sh.startBalancer()
查看详细分片信息#
sh.status({"verbose":1})
插入数据#
use mongodbDemo
for (i = 1;i <= 100;i=i+1){
db.order.insert({'price': 1})
}
查看该表分片数据信息
db.order.getShardDistribution()
索引#
创建索引#
db.collection.createIndex({stuNo:20210101}{background:true,expireAfterSeconds:200,name:"ix_sno",unique:true});
执行计划分析#
db.collection.find({stuNo:20210602}).explain('executionStats');
查看索引#
db.collection.getIndexes()
mongo-express#
web版本的mongo图形界面工具
docker run -it --rm \
--name mongo-express \
-p 8081:8081 \
-e ME_CONFIG_OPTIONS_EDITORTHEME="ambiance" \
-e ME_CONFIG_MONGODB_SERVER="10.168.1.130" \
-e ME_CONFIG_MONGODB_PORT="27017" \
-e ME_CONFIG_BASICAUTH_USERNAME="admin" \
-e ME_CONFIG_BASICAUTH_PASSWORD="admin" \
mongo-express
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧