mongodb 存储数据的模式: 初始1个chunk,每个分片的单元,类似于mysql 里面的 页 缺省chunk大小:64M,单个chunk存储满后,会分裂成两个chunk(还是64M),每个chunk存储原来的32M数据,默认情况下,只会在一个shard里面分裂,默认情况下,也是先用第一个shardMongodb:自动拆分 mongos 里面的一个blancer组件,会自动检查,分片节点的chunk检查,如果发现节点的chunk分布不均匀,它会进行chunk迁移,到其他节点,(chunk迁移过程会非常消耗磁盘的IO,以及网络的IO),而且这一切都是自动的。
![]()
分片键:shard key 必须为分片collection 定义分片键 基于一个或多个列(类似于mysql 中的索引) 分片键定义数据空间 想象key space 类似一条线上一个点数据 一个key rang 是一条线上一段数据 我们可以按照分片键进行Range和Hash分片 选择分片键的理念: 那个列经常用来做查询条件,就将它选择为分片键,如果无法选择,就选择一个类似于主键的列或者ID的列 range--->它首先会选择其中一个节点为主节点,往主上面存储,当达到一个chunk大小的时候,才会选择第二个节点,进行存储,当你的数据比较少的时候,比如说1000行,肯定是达不到64M,这样就失去了分片的意义了。 先用主节点,当达到一个chunk大小,才用第二个节点,然后交叉使用。(适用于,数据量比较大的。) Hash----->hash分片策略更加的科学一些,使我们的数据,更加均匀的,离散的分布到我们所有的节点上,查询的时候,我们的请求,也会比较均匀的落在不同的节点上,这样性能就会较高一些。 ++++++++++++++++ 分片注意事项: 分片键是不可变,分完了不能再分了。 分片键必须有索引,##Mongodb也有索引,也是B树索引,也支持Hash索引。 分片键大小限制512bytes 分片键用于路由查询 MongoDB不接受已进行collection级分片的collection上插入无分片键的文档,也不支持空值插入。 ########## RANGE分片配置及测试 test库下的vast大表进行手工分片(mongod用户环境下操作) 1、激活数据库分片功能,你要对那个库进行分片,必须要先激活这个库的分片功能。 mongo --port 38017 admin ##连接到mongos 里面 admin> ( { enablesharding : "数据库名称" } ) use admin eg: admin> db.runCommand( { enablesharding : "test" } )
2、指定分片建索引,对集合分片 eg:范围片键 --创建索引 use test > db.vast.ensureIndex( { id: 1 } ) --开启分片 use admin > db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
配置分片的表是test库下的vast表,用的是id这个分片键,1表示,按从小到大的顺序分布,-1,表示从大到小。 3、集合分片验证 admin> use test test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } 插入数据需要一点时间,根据你的服务器配置不同,时间也不一样。 test> db.vast.stats() 4、分片结果测试 登录到不同节点 shard1: mongo --port 38021 use test db.vast.count(); shard2: mongo --port 38024 use test db.vast.count();
![]()
此实验,是把sh2当成了主节点,只有当主节点,达到64M的时候,才会选择到第二个节点。 最后,mongos 里面的一个blancer组件,会自动做分片节点的chunk检查,如果发现节点的chunk分布不均匀,它会进行chunk迁移,将其他平均分布到其他节点。
![]()
![]()
++++++++++++++++++ shard1: mongo --port 38021 use test db.vast.count();
shard2: mongo --port 38024 use test db.vast.count();
---------------------------------------------------- ########## Hash分片配置及测试(mongod用户环境下操作) 对oldboy库下的vast大表进行hash 创建哈希索引 (1)激活oldboy分片功能 mongo --port 38017 admin use admin admin> db.runCommand( { enablesharding : "oldboy" } )
(2)对于oldboy库下的vast表建立hash索引 use oldboy oldboy> db.vast.ensureIndex( { id: "hashed" } ) (3)对oldboy库下面的vast表(collection)开启分片 use admin admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)录入10w行数据测试 use oldboy for(i=1;i<100001;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } (5)hash分片结果测试 mongo --port 38021 use oldboy db.vast.count();
mongo --port 38024 use oldboy db.vast.count();
--------------------------- 5、判断是否Shard集群 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()
9、查看分片的详细信息 admin> db.printShardingStatus() 或 admin> sh.status() ***** 能看到以 5、6、7、8的信息 10、删除分片节点(谨慎) (1)确认blance是否在工作 sh.getBalancerState() (2)删除shard2节点(谨慎) mongos> db.runCommand( { removeShard: "shard2" } ) 注意:删除操作一定会立即触发blancer。 添加分片节点:(在admin库下面操作) 先做好分片节点的复制集: db.runCommand({ addshard : "sh3/192.168.68.190:38034,192.168.68.190:38035,192.168.68.190:38036",name:"shard3"}) 一加完,blancer会自动触发chunk迁移到新节点,使所有节点的chunk都是均匀的。 11、balancer操作 ***** 介绍: mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。 什么时候工作? 1、自动运行,会检测系统不繁忙的时候做迁移 2、在做节点删除的时候,立即开始迁移工作 3、balancer只能在预设定的时间窗口内运行 ***** 可以人为的订制 blancer工作的时间段,默认是全时间段,24小时工作的。 一般生产中,都会设置blancer的工作时间窗口。 有需要时可以关闭和开启blancer(备份的时候) mongos> sh.stopBalancer() mongos> sh.startBalancer() 12、自定义 自动平衡进行的时间段 https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window // connect to mongos mongo --port 38017 admin use config sh.setBalancerState( true ) ##可以不做 db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true ) sh.getBalancerWindow()
sh.status()
关于集合的balancer(了解下) 关闭某个集合的balance,一般不会用到。 sh.disableBalancing("students.grades") 打开某个集合的balancer sh.enableBalancing("students.grades") 确定某个集合的balance是开启或者关闭 db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance; ----------------
配置分片的表是test库下的vast表,用的是id这个分片键,
此实验,是把sh2当成了主节点,只有当主节点,达到64M的时候,才会选择到第二个节点。
最后,mongos 里面的一个blancer组件,会自动做分片节点的chunk检查,如果发现节点的chunk分布不均匀,它会进行chunk迁移,将其他平均分布到其他节点。
++++++++++++++++++
shard1:
mongo --port 38021
use test
db.vast.count();
shard2:
mongo --port 38024
use test
db.vast.count();
(4)录入10w行数据测试
use oldboy
mongo --port 38024
use oldboy
db.vast.count();
---------------------------
5、判断是否Shard集群
或者:
config>
8、单独查看分片的片键
9、查看分片的详细信息
admin>
关于集合的balancer(了解下)
关闭某个集合的balance,一般不会用到。