您的位置:首页 > 其它

数据分区

2016-04-03 15:45 239 查看
一分片一分区
一分片多分区:当一个块变得越来越大时,MongoDB会自动将其分割成两个较小的块,如果分片区间比例失调,则MongoDB会通过迁移块来确保均衡。

平衡器:平衡器的目标不仅是要保持数据均匀分布,还要最小化被移动的数据量。要触发一轮平衡,一个分片必须必块最少的分片多出至少9个块,到那时,块就被迁移出拥挤的分片,知道与其他分片平衡为止。一般每个块的大小是200M

MongoDB集群基本上由三类进程组成,实际存储数据的分片,负责把请求路由到正确数据的进程,用于跟踪集群状态的配置服务器。

片键决定数据在集群内的分布情况

使用几乎所有的数据库软件都能进行手动分片,应用需要维护与若干不同数据库服务器的连接,每个连接时完全独立的,应用程序管理不同服务器上的不同数据没存储查询都需要在正确的服务器上进行,这种方法可以很好地工作,但是非常难以维护,比如向集群添加节点或从集群删除节点都很困难,调整数据分布和负载模式也不轻松。

MongoDB支持自动分片,可以摆脱手动分片的管理困扰。集群自动切片数据,做负载均衡。

MongoDB分片的基本思想是将集合切分成小块,这些块分散到若干片里面,每个片负责总数据的一部分。应用程序不必知道那片对应那些数据,甚至不需要知道数据已经被拆分了,所以在分片之前要运行一个路由进程,该进程名是mongos,这个路由器知道所以数据的存放位置,所以应用可以连接它来正常发送请求,对应用来说,它仅知道连接一个普通的mongod,路由器知道数据和片的对应关系,就能够转发请求到正确的片上,如果请求有了回应,路由器将其收集起来会送给应用。

什么时候分片:
机器的磁盘不够用;
单个mongod已经不能满足写数据的性能需求了
想将大量的数据放到内存中提高性能

假设有个存储日志的集合,现在要分片,开启分片功能,然后告诉MongoDB用timestamp作为片键,就把所有的数据放到一个片上,可以随意插入数据,但是总会实在一个片上。而后,增加一个片,这个片建好并运行了之后,MongoDB就会把集合拆分成两半,成为块,每个块中包含片键值在一定范围内的所有文档。将其中的一块移动到新片上。

选择片键:
选择一个好的片键非常关键,选择一个好片键,只要应用程序还在正常运行,只要发现访问量提高就添加服务器,MongoDB就会确保一直正常运行下去。
片键决定了数据在集群中的分布情况。

片键值数量有限的片键成为小基数片键,如果选择小基数的片键,到头来肯定会得到一堆既巨大又无法移动,还不能分割的块。
如果打算采用小基数片键的原因是需要在那个字段上进行大量查询,就是也组合片键,并确保第二个字段有非常多不同的值可以供MongoDB用来进行分割。

如果一个集合有生命周期,就可以选择这个生命周期为片键。

好片键
选择片键需要将访问模式也考虑进去,如果应用规律性地访问25GB数据,就希望所有分割和迁移发生在这25GB数据上,而不是随机访问数据以至于不断地有新数据从磁盘中复制到内存。
希望找到的片键有良好的数据局部性,但是又不会因太有局部性而导致热点出现。

1、准牲畜键加索引搜索键
许多应用访问新数据比老数据更频繁,所以在数据分片上大致按照时间排序,但是同时也要均匀分布,这样既能把我们再读写的数据保持在内存中,又可以是负载均衡地分散在集群中。

例如:有一个分析程序,用户会定期通过它访问过去一个月的数据,而我们希望能尽量保持数据易于使用,因此可以在{month:1,user:1}上分片,欺诈month是一个粗粒度的升序字段,即每个月它都会有一个更新更大的值,user适合作为第二个字段,因为我们经常查询某个特定用户的数据。

基于上面分析,可以概括出一个片键公式:
{coarseLocality:1,search:1}
其中coarseLocality字段用来控制数据局部化,search是数据上常用的检索字段

mongodb实战

mongodb管理与开发实战详解-深入云计算
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: