7、Docker搭建高可用的mongodb副本集+分片集群(Replica Sets+Sharded Cluster)

Field是collection的一个字段,系统将会利用filed的值,来计算应该分到哪一个片上.
这个filed叫”片键”, shard key

mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,
 
而是N篇文档,形成一个块"chunk",
优先放在某个片上,
当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,
维护片之间的数据均衡
 
问: 为什么插入了10万条数据,才2个chunk?
答: 说明chunk比较大(默认是64M)
在config数据库中,修改chunksize的值.
 
问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,
自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?
答: 服务器之间IO的增加,
 
接上问: 能否我定义一个规则, 某N条数据形成1个块,预告分配M个chunk,
M个chunk预告分配在不同片上.
以后的数据直接入各自预分配好的chunk,不再来回移动?
 
答: 能, 手动预先分片!

Mongodb 分片与chunk
问题---我们向mongos路由器,添加了10条数据,发现并没有均匀的分布在B,D两个片上, 而是都在B上.
 
原因: mongodb并不是按行的级别,在片上绝对的平均分配.
而是以块为单位,来各片上寻求平衡.
 
过程是这样的--------
1: 数据先往主片上添加,都放在一个chunk(块)里, 这个块达到一定大小(默认是64M), 再生成新块.
2: 新块仍然是主片上,
3: configdb判断主片上有2块,而其他片的chunk过少,则会自动移动chunk过去.
 
 
在大型系统中,chunk的自动移动,(后台balance程序控制的), 会加剧IO的压力.
 
----我们可以根据业务量,合适的推测数量的增长,对数据进行预先分片, pre-split
即手工分片,而不自动分片.
 
注意: 预先分片的collection得是空的
Use admin  //切换到admin数据库,进行管理
db.runCommand({split:’database.collection’,middle:{_id:值}});
例:
db.runCommand({split:’shop.goods’,middle:{_id:10000}});
db.runCommand({split:’shop.goods’,middle:{_id:20000}});
....
db.runCommand({split:’shop.goods’,middle:{_id:120000}});
这样将会把
[0,10000]-->切成1个块chunk
(10000,20000]->切成一个块chunk.
....
(110000,120000]->切成一个块chunk.
 
,系统会预告生成这些空块,并在shard片之间达到平衡.
然后再插入数据,chunk不会再自动转移.





我是跟着下面两个链接搭建练手的

参考1  https://blog.csdn.net/quanmaoluo5461/article/details/85164588
参考2 https://www.cnblogs.com/liushuchen/p/11811451.html

 

Field是collection的一个字段,系统将会利用filed的值,来计算应该分到哪一个片上.

这个filed叫”片键”, shard key

 

mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,

 

而是N篇文档,形成一个块"chunk",

优先放在某个片上,

当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,

维护片之间的数据均衡

 

问: 为什么插入了10万条数据,才2个chunk?

答: 说明chunk比较大(默认是64M)

在config数据库中,修改chunksize的值.

 

问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,

自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?

答: 服务器之间IO的增加,

 

接上问: 能否我定义一个规则, 某N条数据形成1个块,预告分配M个chunk,

M个chunk预告分配在不同片上.

以后的数据直接入各自预分配好的chunk,不再来回移动?

 

答: 能, 手动预先分片!

 

Mongodb 分片与chunk

问题---我们向mongos路由器,添加了10条数据,发现并没有均匀的分布在B,D两个片上, 而是都在B上.

 

原因: mongodb并不是按行的级别,在片上绝对的平均分配.

而是以块为单位,来各片上寻求平衡.

 

过程是这样的--------

1: 数据先往主片上添加,都放在一个chunk(块)里, 这个块达到一定大小(默认是64M), 再生成新块.

2: 新块仍然是主片上,

3: configdb判断主片上有2块,而其他片的chunk过少,则会自动移动chunk过去.

 

 

在大型系统中,chunk的自动移动,(后台balance程序控制的), 会加剧IO的压力.

 

----我们可以根据业务量,合适的推测数量的增长,对数据进行预先分片, pre-split

即手工分片,而不自动分片.

 

注意: 预先分片的collection得是空的

Use admin  //切换到admin数据库,进行管理

db.runCommand({split:’database.collection’,middle:{_id:值}});

例:

db.runCommand({split:’shop.goods’,middle:{_id:10000}});

db.runCommand({split:’shop.goods’,middle:{_id:20000}});

....

db.runCommand({split:’shop.goods’,middle:{_id:120000}});

这样将会把

[0,10000]-->切成1个块chunk

(10000,20000]->切成一个块chunk.

....

(110000,120000]->切成一个块chunk.

 

,系统会预告生成这些空块,并在shard片之间达到平衡.

然后再插入数据,chunk不会再自动转移.

 

 

参考1 https://blog.csdn.net/quanmaoluo5461/article/details/85164588

参考2 https://www.cnblogs.com/liushuchen/p/11811451.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值