4.MongoDB sharding Cluster 分片集群

  • MongoDB分片集群的介绍:

    • 是MongoDB提供的一种可水平扩展的数据存储解决方案。
    • 当单个MongoDB服务器无法满足数据存储需求或吞吐量要求时,可以使用分片集群来分散数据量和查询负载。
  • 分片集群的结构组成:

    • 1.分片(shards):
      • 真正存储数据的服务器,以chunk为单位存数据。每个分片是单个的一个MongDB实例,也可以是一个复制集,用于提供数据冗余和高可用性
    • 2.查询路由(mongs):

      • 数据路由,和客户端打交道的模块。
      • 查询路由器(通常使用mongos进程实现)是分片集群的入口,它负责将应用程序的请求路由到正确的分片
    • 3.配置服务器(config Server):
      • 所有存、取数据的方式,所有shard节点的信息,分片功能一些配置信息。可以理解为真实数据的元数据。
  • 实验准备环境:

    • 10个mongodb实例,端口为:38017-38026
    • 1.shard节点:
      • 对应的实例:

        • shard节点1:38021-23(一主两从,其中一个节点为arbiter)
        • shard节点2:38024-26(一主两从,其中一个节点为arbiter)
    • 2.config server:

      • 3台构成复制集(一主两从)
      • 对应实例端口:38018-38020
    • 3.查询路由(mongos):
      • 路由节点,一台服务器:38017
  • 实验步骤:

    • 1.配置shard分片集:

      • 创建多实例目录:

        • mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data
        • mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data
        • mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data
        • mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data
        • mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data
        • mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data
      • 修改配置文件:
        • shard分片集1:

          • cat > /mongodb/38021/conf/mongodb.conf<<EOF
          • systemLog:
          • destination: file
          • path: /mongodb/38021/log/mongodb.log
          • logAppend: true
          • storage:
          • journal:
          • enabled: true
          • dbPath: /mongodb/38021/data
          • directoryPerDB: true
          • #engine: wiredTiger
          • wiredTiger:
          • engineConfig:
          • cacheSizeGB: 1
          • directoryForIndexes: true
          • collectionConfig:
          • blockCompressor: zlib
          • indexConfig:
          • prefixCompression: true
          • net:
          • bindIp: 192.168.8.5,127.0.0.1
          • port: 38021
          • replication:
          • oplogSizeMB: 2048
          • replSetName: sh1
          • sharding:
          • clusterRole: shardsvr
          • processManagement:
          • fork: true
          • EOF
          • cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/
          • cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/
          • sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i
          • sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
      • shard 分片集2:

        • cat > /mongodb/38024/conf/mongodb.conf<<EOF
        • systemLog:
        • destination: file
        • path: /mongodb/38024/log/mongodb.log
        • logAppend: true
        • storage:
        • journal:
        • enabled: true
        • dbPath: /mongodb/38024/data
        • directoryPerDB: true
        • wiredTiger:
        • engineConfig:
        • cacheSizeGB: 1
        • directoryForIndexes: true
        • collectionConfig:
        • blockCompressor: zlib
        • indexConfig:
        • prefixCompression: true
        • net:
        • bindIp: 192.168.8.5,127.0.0.1
        • port: 38024
        • replication:
        • oplogSizeMB: 2048
        • replSetName: sh2
        • sharding:
        • clusterRole: shardsvr
        • processManagement:
        • fork: true
        • EOF
        • cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/
        • cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/
        • sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i
        • sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
      • 启动所有节点,搭建复制集:

        • mongod -f /mongodb/38021/conf/mongodb.conf
        • mongod -f /mongodb/38022/conf/mongodb.conf
        • mongod -f /mongodb/38023/conf/mongodb.conf
        • mongod -f /mongodb/38024/conf/mongodb.conf
        • mongod -f /mongodb/38025/conf/mongodb.conf
        • mongod -f /mongodb/38026/conf/mongodb.conf
      • 登录shard节点1的主服务器,搭建复制集:

        • mongo --port 38021 admin
        • config = {_id: 'sh1', members: [
        • {_id: 0, host: '192.168.8.5:38021'},
        • {_id: 1, host: '192.168.8.5:38022'},
        • {_id: 2, host: '192.168.8.5:38023',"arbiterOnly":true}]
        • }
        • rs.initiate(config)
      • 登录shard节点2的主服务器,搭建复制集:

        • mongo --port 38024 admin
        • config = {_id: 'sh2', members: [
        • {_id: 0, host: '192.168.8.5:38024'},
        • {_id: 1, host: '192.168.8.5:38025'},
        • {_id: 2, host: '192.168.8.5:38026',"arbiterOnly":true}]
        • }
        • rs.initiate(config)
    • 至此,整个集群中用于存储用户数据的分片集群已经搭建好了,接下来我们来搭建config server层,它主要用于存储元数据(数据信息)

      • config节点配置:

        • mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data
        • mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data
        • mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
      • 修改配置文件:

        • cat > /mongodb/38018/conf/mongodb.conf <<EOF
        • systemLog:
        • destination: file
        • path: /mongodb/38018/log/mongodb.conf
        • logAppend: true
        • storage:
        • journal:
        • enabled: true
        • dbPath: /mongodb/38018/data
        • directoryPerDB: true
        • #engine: wiredTiger
        • wiredTiger:
        • engineConfig:
        • cacheSizeGB: 1
        • directoryForIndexes: true
        • collectionConfig:
        • blockCompressor: zlib
        • indexConfig:
        • prefixCompression: true
        • net:
        • bindIp: 192.168.8.5,127.0.0.1
        • port: 38018
        • replication:
        • oplogSizeMB: 2048
        • replSetName: configReplSet
        • sharding:
        • clusterRole: configsvr
        • processManagement:
        • fork: true
        • EOF
        • cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
        • cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/
        • sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i
        • sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i
      • 启动节点,并配置复制集:

        • mongod -f /mongodb/38018/conf/mongodb.conf
        • mongod -f /mongodb/38019/conf/mongodb.conf
        • mongod -f /mongodb/38020/conf/mongodb.conf
        • 登录主节点:

          • mongo --port 38018 admin
          • config = {_id: 'configReplSet', members: [
          • {_id: 0, host: '192.168.8.5:38018'},
          • {_id: 1, host: '192.168.8.5:38019'},
          • {_id: 2, host: '192.168.8.5:38020'}]
          • }
          • rs.initiate(config)
    • 至此config server节点已经配置完毕,接下来我们配置mongos节点(查询路由),它负责与客户端建立连接,确定数据应该分布在那个分片,让整个集群看起来像一个简单的服务器。
      • mongos节点配置:

        • 创建实例目录:
          • mkdir -p /mongodb/38017/conf /mongodb/38017/log
        • 修改配置文件:

          • cat > /mongodb/38017/conf/mongos.conf << EOF
          • systemLog:
          • destination: file
          • path: /mongodb/38017/log/mongos.log
          • logAppend: true
          • net:
          • bindIp: 192.168.8.5,127.0.0.1
          • port: 38017
          • sharding:
          • configDB: configReplSet/192.168.8.5:38018,192.168.8.5:38019,192.168.8.5:38020
          • processManagement:
          • fork: true
          • EOF
        • 启动mongos:
          • mongos -f /mongodb/38017/conf/mongos.conf
        • 至此我们整个分片集群搭建完毕,接下来对分片集群进行操作。
    • 分片集群操作:

      • 连接mongos节点:
        • mongo 192.168.8.10:38017/admin
      • 添加分片:

        • db.runCommand( { addshard : "sh1/192.168.8.5:38021,192.168.8.5:38022,192.168.8.5:38023",name:"shard1"} )
        • db.runCommand( { addshard : "sh2/192.168.8.5:38024,192.168.8.5:38025,192.168.8.5:38026",name:"shard2"} )
      • 列出分片:

        • db.runCommand( { listshards : 1 }
    • 分片方法:

      • Hash分片:

        • 对hehe库下的大表进行hash
        • 1.对hehe开启分片功能:

          • mongo --port 38017 admin
          • use admin
          • admin> db.runCommand( { enablesharding : "hehe" } )
        • 2.对hehe库下的t10w表建立hash索引:

          • use hehe
          • > db.t10w.ensureIndex( { id: "hashed" } )
        • 3.开启分片:

          • use admin
          • sh.shardCollection( "hehe.t10w", { id: "hashed" } )
        • 4.录入10w行数据测试:

          • use hehe
          • for(i=1;i<100001;i++){ db.t10w.insert({"id":i,"name":"lisi","age":30,"date":new Date()}); }
        • 5.验证,在打开两个终端,分别登录俩个不同的shard分片复制集中,对t10w表,进行行数查看:

          • su - mongod
          • mongo --port 38021
          • use hehe
          • db.t10w.count();
          • 发现数据分别在两个shard节点的复制集中存入,而不是仅仅存入到了一个shard节点中,这就是hash分片算法起到的作用
          • su - mongod
          • mongo --port 38024
          • use hehe
          • db.t10w.count();
      • 分片集群当中,常用到的操作命令:

        • 判断是否shard集群

          • mongo --port 38017 admin
          • admin> db.runCommand({ isdbgrid : 1})
        • 6、列出所有分片信息
          • admin> db.runCommand({ listshards : 1})
        • 7、列出开启分片的数据库

          • admin> use config
          • config> db.databases.find( { "partitioned": true } )
          • 或者:
          • config> db.databases.find() //列出所有数据库分片情况
        • 8、查看分片的片键

          • config> db.collections.find().pretty()
          • {
          • "_id" : "test.t100w",
          • "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
          • "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
          • "dropped" : false,
          • "key" : {
          • "id" : "hashed"
          • },
          • "unique" : false
          • }
        • 9、查看分片的详细信息

          • admin> db.printShardingStatus()
          • admin> sh.status() *****
        • 10、删除分片节点(谨慎)

          • (1)确认blance是否在工作
          • sh.getBalancerState()
          • (2)删除shard2节点(谨慎)
          • mongos> use admin
          • mongos> db.runCommand( { removeShard: "shard2" } )
          • 注意:删除操作一定会立即触发blancer。
相关推荐
Elastic 中国社区官方博客3 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.7 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐11 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999913 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道2 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring