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。
相关推荐
NCIN EXPE4 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台4 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路4 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家4 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE4 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow124 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO4 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623924 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele5 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python