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
posted @   ChrisLeon  阅读(242)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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吧
点击右上角即可分享
微信分享提示
主题色彩