MongoDB中怎么实现分片管理

本篇文章为大家展示了MongoDB中怎么实现分片管理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、分片概念1.数据块

块也叫区间,可能存在一分片一区间和一分片多区间两种情况。

一分片一区间:数据不会在片之间自动移动来保持分片的数据的均匀性,需要手动拆分分片来移动数据。

而一分片多区间情况:一个数据块默认64MB,当数据块达到64MB时就会创建新的块,当然前提是当前的粒度还允许再拆分,平衡器会保证每个分片数据块的均匀。但是移动块也遵循分片的原则,块之间的数据集不能有交集。

比如一个块[50-100)现在拆分成两个块,那么默认会拆分成[50-75)[75-100)两个块,如果当前分片块比其它分片的块大于9那么可能[75-100)改块会被移动到新的分片当中。

2.平衡器

平衡器(balancer)负责数据的迁移。它会周期性地检查分片间是否存在不平衡,如果存在,则会开启块的迁移。不平衡的表现指,一个分片明显比其他分片拥有更多的块。假如有一些集合达到了阈值,平衡器则会开始做块迁移。它会从负载比较比较大的分片中选择一个块,并询问该分片是否需要在迁移之前对块进行拆分。完成必要的拆分后,就会将块迁移至数量比较少的机器上。

二、分片查询1.查询群集状态

需要显示隐藏的分片信息执行

2.检查配置信息

所有的配置信息都保存在配置服务器的config数据库中。

MongoDB中怎么实现分片管理

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

MongoDB中怎么实现分片管理

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。