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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的IT小王

希望获得您的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值