MongoDB 分片管理

Mongodb版本:3.6 mongodb

1、分片概念

1.数据块

块也叫区间,可能存在一分片一区间和一分片多区间两种状况。数据库

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

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

好比一个块[50-100)如今拆分红两个块,那么默认会拆分红[50-75)[75-100)两个块,若是当前分片块比其它分片的块大于9那么可能[75-100)改块会被移动到新的分片当中。网络

2.平衡器

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

2、分片查询

1.查询群集状态

sh.status

须要显示隐藏的分片信息执行分布式

sh.status(true)

2.检查配置信息

全部的配置信息都保存在配置服务器的config数据库中。ide

use config

show tables

actionlogspa

记录平衡器的相关操做日志。操作系统

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

记录集群中数据库的信息,无论数据库有没有分片。如数据库开启了分片,那么"partitioned" :字段的值为true。"primary"记录数据库所属的主分片。全部新集合默认建立在数据库主分片上。好比当前的集合在某个分片上面尚未数据那么不会在该分片上建立集合。因此若是某个分片存在分片的集合,那么必须将集合的数据移走或者将集合删除,不然该分片没法删除。

lockpings

记录分片运行是否正常的ping记录信息

locks

记录存储分布式锁操做信息。

migrations

mongos

记录mongos的相关信息,记录每个mongos实例的信息。

settings

包含平衡器和块的设置信息等。

shards

群集分片信息

tags

记录分片标签信息

transactions

version

群集版本信息

注意:若是须要修改配置信息,须要经过链接到mongos切换到config数据库操做而不是直接链接到配置服务器中操做。

参考:https://docs.mongodb.com/manual/reference/config-database/

3.查看网络链接

db.adminCommand({"connPoolStats":1})

4.限制链接数量

--maxConns 

mongos能够接受的最大并发链接数。若是此设置高于操做系统配置的最大链接跟踪阈值,则此设置无效。

注意:在版本2.6中MongoDB删除了maxIncomingConnections 设置的上限。

3、分片管理

1.添加分片

use admin

db.auth("dba","dba")

sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");

sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");

sh.addShard("rs-c/192.168.137.30:26010,192.168.137.30:26011,192.168.137.30:26012");

sh.status();

2.删除分片

先当前分片对应数据库挪到其它的分片上。这里的"products"指的是数据库名

db.runCommand( { movePrimary: "products", to: "rs-b" })

而后再删除分片

db.runCommand({"removeShard":"rs-c"});

 

注意:须要屡次执行db.runCommand({"removeShard":"rs-c"});命令来删除分片,首先平衡器会将分片上的数据进行迁移,能够经过sh.isBalancerRunning()命令查询是否迁移完成,迁移完成以后再次执行删除分片命令完全移除分片。

3.平衡器管理

3.1开启平衡器

use admin
sh.startBalancer()
或者
sh.setBalancerState(true)

3.2关闭平衡器

use admin
sh.stopBalancer()
或者
sh.setBalancerState(false);

查看是否关闭,返回flase标识平衡器已关闭,还须要查询均衡器正在运行状况

sh.getBalancerState();

while( sh.isBalancerRunning() ) {

          print("waiting...");

          sleep(1000);

}

在执行数据库管理操做以前应该关闭平衡器,关闭平衡器以后,系统不会再进入平衡过程, 可是均衡器的关闭不是当即就完成,因此还须要查询均衡器是否正在运行.

3.3查看平衡器开启状态

db.settings.find({"_id":"balancer"})
或者
sh.getBalancerState()

3.4查看平衡器是否在运行

sh.isBalancerRunning()

返回ture表明正在运行,false表明当前没有在运行。

3.5指定平衡时间

必须先保证平衡器是开启状态

use config
sh.setBalancerState( true )

db.settings.update({"_id":"balancer"},
{"$set":{"activeWindow":{"start":"13:00","stop":"16:00"}}},
{upsert:true}
)
  • For HH values, use hour values ranging from 00 - 23.
  • For MM value, use minute values ranging from 00 - 59.

3.6关闭平衡时间

use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

 

3.7关闭开启指定文档的平衡器

关闭

sh.disableBalancing("test.aa")

开启

sh.enableBalancing("test.aa")

查询是否关闭文档的平衡器,返回true表明关闭。没有结果返回没有关闭,返回报错表明文档不存在或者文档没有开启分片

db.getSiblingDB("config").collections.findOne({_id : "test.aa"}).noBalance;

3.8.备份时注意事项

在执行备份前须要关闭平衡器,可是均衡器的关闭不是当即就完成,因此还须要查询均衡器是否正在运行,不要在平衡器处于活动状态时备份,能够备份操做前执行如下查询:

sh.getBalancerState()

sh.isBalancerRunning()

注意:保证平衡器处于关闭状态同时sh.isBalancerRunning()返回的不是ture ;也能够经过设置平衡器的平衡时间来维护备份。

参考:https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/

4.块管理

1.修改数据块大小

单位MB,默认块大小为64MB。块越大迁移至分片的耗时就越长。

use config;
查询当前块大小
db.settings.find({"_id":"chunksize"})
修改块大小
db.settings.save( { _id:"chunksize", value: 64 } );

2.手动移动数据块

2.1查询文档块信息

db.getCollection('chunks').find({"ns":"test.xxxx"})

2.2将块"$minKey"移动到分片rs-c

移动块只须要指定块的返回内的随便一个值便可,注意块的范围不包含上限。

sh.moveChunk("test.xxxx",{"username":"$minKey"},"rs-c")

 

2.3拆分块

若是块的大小超过setting设置的最大块大小时,系统会禁止移动块,这时候须要将块进行拆分。这里须要指定新的块范围,指定下限便可。

 

sh.splitAt("test.xxxx",{ "username" :"p" })

2.4查询块的大小

db.runCommand({ dataSize: "test.xxxx", keyPattern: { "username": 1 }, min: { "username" : "b" }, max: { "username" : "c" } })

单位字节,须要指定块的范围。

2.5没法拆分的特大块处理

假设使用year/month/day字段做为分片,某一天业务遭受攻击致使这天的数据量暴增,可是因为分片的值已经的最小单位了没法再拆分了,这个时候经过块拆分已经没法解决问题,能够手动将块移动到非热点的分片上。

5.刷新配置信息

mongos有时没法从配置服务器正确更新配置信息,可使用flushRouterConfig命令手动刷新缓存,若是刷新还没法解决须要重启mongos进程。

db.adminCommand({"flushRouterConfig":1})

6.删除分片数据库

use news

db.dropDatabase()

 

 

 

 

 

 

 

 

备注:

    做者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点全部随笔都是原创,欢迎你们转载;但转载时必须注明文章来源,且在文章开头明显处给明连接,不然保留追究责任的权利。

《欢迎交流讨论》

相关文章
相关标签/搜索