MongoDB 分片集群 实践

 

docker-compose.yml:

version: '3.9'
services:
  shard1-1:
    image: mongo:4.4.4
    container_name: shard1-1
    # --shardsvr: 这个参数仅仅只是将默认的27017端口改为27018,如果指定--port参数,可用不需要这个参数
    # --directoryperdb:每个数据库使用单独的文件夹
    command: mongod --shardsvr --directoryperdb --replSet shard1
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard1-1/data:/data/db
    networks:
      - mongo

  shard1-2:
    image: mongo:4.4.4
    container_name: shard1-2
    command: mongod --shardsvr --directoryperdb --replSet shard1
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard1-2/data:/data/db
    networks:
      - mongo

  shard1-3:
    image: mongo:4.4.4
    container_name: shard1-3
    command: mongod --shardsvr --directoryperdb --replSet shard1
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard1-3/data:/data/db
    networks:
      - mongo

  shard2-1:
    image: mongo:4.4.4
    container_name: shard2-1
    command: mongod --shardsvr --directoryperdb --replSet shard2
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard2-1/data:/data/db
    networks:
      - mongo

  shard2-2:
    image: mongo:4.4.4
    container_name: shard2-2
    command: mongod --shardsvr --directoryperdb --replSet shard2
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard2-2/data:/data/db
    networks:
      - mongo

  shard2-3:
    image: mongo:4.4.4
    container_name: shard2-3
    command: mongod --shardsvr --directoryperdb --replSet shard2
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/shard2-3/data:/data/db
    networks:
      - mongo

  config1:
    image: mongo:4.4.4
    container_name: config1
    command: mongod --configsvr --directoryperdb --replSet config 
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/config1/data:/data/configdb
    networks:
      - mongo

  config2:
    image: mongo:4.4.4
    container_name: config2
    command: mongod --configsvr --directoryperdb --replSet config 
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/config2/data:/data/configdb
    networks:
      - mongo

  config3:
    image: mongo:4.4.4
    container_name: config3
    command: mongod --configsvr --directoryperdb --replSet config
    volumes:
      - /etc/localtime:/etc/localtime
      - /mymongoDB/config3/data:/data/configdb
    networks:
      - mongo

  mongos: #生产上需要创建多个mongos,然后借助haproxy 或者lvs做高可用)
    image: mongo:4.4.4
    container_name: mongos
    command: mongos --configdb 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
    name: mongo

集群搭建:

启动容器
docker-compose  up -d
#进入配置服务器成员之一启动副本集
docker exec -it config1 mongo --port 27019
#启动副本集
rs.initiate(
  {
    _id: "config",
    configsvr: true,
    members: [
      { _id : 0, host : "config1:27019" },
      { _id : 1, host : "config2:27019" },
      { _id : 2, host : "config3:27019" }
    ]
  }
)

#进入分片1服务器成员之一启动副本集
docker exec -it shard1-1 mongo --port 27018
#
rs.initiate(
  {
    _id : "shard1",
    members: [
      { _id : 0, host : "shard1-1:27018" },
      { _id : 1, host : "shard1-2:27018" },
      { _id : 2, host : "shard1-3:27018" }
    ]
  }
)

#进入分片2服务器成员之一启动副本集
docker exec -it shard2-1 mongo --port 27018
rs.initiate(
  {
    _id : "shard2",
    members: [
      { _id : 0, host : "shard2-1:27018" },
      { _id : 1, host : "shard2-2:27018" },
      { _id : 2, host : "shard2-3:27018" }
    ]
  }
)

docker exec -it mongos mongo
#将分片添加到群集
sh.addShard( "shard1/shard1-1:27018,shard1-2:27018,shard1-3:27018")
sh.addShard( "shard2/shard2-1:27018,shard2-2:27018,shard2-3:27018")

分片集群搭建完 剩下就是:
#依旧在路由服务器上操作
#于平衡器操作
https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#check-the-balancer-state
#启用数据库分片
sh.enableSharding("<database>")
#基于哈希或者范围分片操作;空集会自动创建索引;非空集就要先创建索引例如:db.user.createIndex({"id": 1})。
sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )或者sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

测试集群:
#先把块调小,测试完再调回默认64M
use config #进配置库
db.settings.save( { _id:"chunksize", value: 1} ) #设置1M块
db.serverStatus().sharding #查看状态

#测试范围分片:
sh.enableSharding("mydb") #开启数据库分片功能
sh.shardCollection("mydb.user",{"id": 1}) #选集合的分片建基于范围分片
#造测试数据
use mydb
for(i=1;i<=20000;i++){db.user.insert({"id":i,"name":"jack"+i})}
#查看分片效果
sh.status()

#哈希分片 和上面一样只是第二步,分片类型不是递增而是哈希
sh.enableSharding("mydb2") 
sh.shardCollection("mydb2.user",{"id":"hashed"})
use mydb2
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
sh.status()
结果如下:

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值