本篇文章为大家展示了MongoDB中怎么实现分片管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
一、分片概念1.数据块块也叫区间,可能存在一分片一区间和一分片多区间两种情况。
一分片一区间:数据不会在片之间自动移动来保持分片的数据的均匀性,需要手动拆分分片来移动数据。
而一分片多区间情况:一个数据块默认64MB,当数据块达到64MB时就会创建新的块,当然前提是当前的粒度还允许再拆分,平衡器会保证每个分片数据块的均匀。但是移动块也遵循分片的原则,块之间的数据集不能有交集。
比如一个块[50-100)现在拆分成两个块,那么默认会拆分成[50-75)[75-100)两个块,如果当前分片块比其它分片的块大于9那么可能[75-100)改块会被移动到新的分片当中。
2.平衡器平衡器(balancer)负责数据的迁移。它会周期性地检查分片间是否存在不平衡,如果存在,则会开启块的迁移。不平衡的表现指,一个分片明显比其他分片拥有更多的块。假如有一些集合达到了阈值,平衡器则会开始做块迁移。它会从负载比较比较大的分片中选择一个块,并询问该分片是否需要在迁移之前对块进行拆分。完成必要的拆分后,就会将块迁移至数量比较少的机器上。
二、分片查询1.查询群集状态需要显示隐藏的分片信息执行
2.检查配置信息所有的配置信息都保存在配置服务器的config数据库中。
actionlog
记录平衡器的相关操作日志。
changelog
跟踪记录集群的操作,包括集合分片操作、块拆分和迁移、添加删除分片等。例如块拆分信息:
db.getCollection('changelog').find({"what":/split/}).sort({"time":-1}).limit(2)每次数据库块移动都会创建插入4条记录到changelog文档总,分别是start、commit、from、to
{ "_id" : "backup-2018-04-09T15:52:26.656+0800-5acb1bbaebfa528b3521327c", "server" : "backup", "clientAddr" : "192.168.137.30:53996", "time" : ISODate("2018-04-09T07:52:26.656Z"), "what" : "moveChunk.start", "ns" : "test.person", "details" : { "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : 1.0 }, "from" : "rs-b", "to" : "rs-a" } } /* 2 */ { "_id" : "backup-2018-04-09T15:52:29.289+0800-5acb1bbdebfa528b35213335", "server" : "backup", "clientAddr" : "192.168.137.30:53996", "time" : ISODate("2018-04-09T07:52:29.289Z"), "what" : "moveChunk.commit", "ns" : "test.person", "details" : { "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : 1.0 }, "from" : "rs-b", "to" : "rs-a" } } /* 3 */ { "_id" : "backup-2018-04-09T15:52:29.297+0800-5acb1bbdebfa528b3521333a", "server" : "backup", "clientAddr" : "192.168.137.30:53996", "time" : ISODate("2018-04-09T07:52:29.297Z"), "what" : "moveChunk.from", "ns" : "test.person", "details" : { "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : 1.0 }, "step 1 of 6" : 0, "step 2 of 6" : 10, "step 3 of 6" : 153, "step 4 of 6" : 2061, "step 5 of 6" : 402, "step 6 of 6" : 24, "to" : "rs-a", "from" : "rs-b", "note" : "success" } } /* 4 */ { "_id" : "master-2018-04-09T15:52:29.307+0800-5acb1bbd7bc60438ea626411", "server" : "master", "clientAddr" : "", "time" : ISODate("2018-04-09T07:52:29.307Z"), "what" : "moveChunk.to", "ns" : "test.person", "details" : { "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : 1.0 }, "step 1 of 6" : 22, "step 2 of 6" : 11, "step 3 of 6" : 4, "step 4 of 6" : 0, "step 5 of 6" : 2042, "step 6 of 6" : 373, "note" : "success" } }View Code
details字段中的每一步表示的都是时间,"step N of 6"信息以毫秒为单位显示步骤耗时的长短。
当from分片收到mongos发来的moveChunks命令时,它会做如下操作:
(1).检查命令参数;
(2)向配置服务器申请获得一个分布锁,以便进入迁移过程;
(3)尝试连接到to分片;
(4)复制数据
(5)与to分片和配置服务器一起确认迁移是否成功完成。
当to分片收到from分片发来的命令时,它会执行如下操作:
(1)迁移索引;
(2)删除块范围内已经存在的任何数据;
(3)将块中的所有文档复制到to分片;
(4)在to分片上运行复制期间对这些文档所执行过的操作;
(5)等待to分片将迁移过来的数据复制到副本集的大多数服务器上。
(6)标志迁移是否执行成功。
chunks
存储集合分片所有块信息
collections
记录所有分片集合信息,该记录中的记录不会因为分片集合被删除而被清除。
databases
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。