MongoDB的分片

关于MongoDB的分片,我想从以下2个方面来进行简单分析:

1. 什么是MongoDB的分片

2. MongoDB的分片是如果工作的


分片:

对于单台数据库服务器的状态通常非常的简单On/Off,如果再添加一台数据库的服务器后,将数据分别存储到2台服务器上,则2个服务器之间则车上了难解难分的血缘关系。

这份关系也时刻在面临着各种挑战,

假设,其中一台机器停机,另外一个如何自处,你的应用程序是否能应对这种情况;

假设,2个服务器之间闹了别扭,彼此不通信了,

假设,2个服务器年纪大了,通信效率下降了,如何


随着更多的节点被添加到集群中,这类的问题会变得越来越多并且复杂多变,此时你可能也正在想,既然集群多个服务器会产生各种各样的挑战,那何不尝试使用单机服务器来替代集群,是的这就是集中式和分布式的争端所在。首先集中式的服务器价格昂贵,而此时我的目的可能只是需要存储大量的数据,或者访问频率很高,已经高于了单机服务器所能承担的上限,那么集群似乎是你目前为止最好的选择。


而在集群的使用过程中,将一个大型的数据集合分布到服务器的过程中,所采用的方法既是分片。


和你使用过的的其他任何分区方案相比,在分配数据的时候,MongoDB的最大区别在于他几乎能自动完成所有的事情。只要告诉mongodb要分配数据,而它既可以帮你去自动维护完成数据在不通服务器之间的均衡。


为什么要使用分片?

使用分片主要是为了完成3个简单的目标。

1. 让mongodb 产品简单化,对于客户的应用程序,它只要知道和他打交道的是一个mongod实例就好了。

为此mongodb自带了一个叫做mongos的专有路由进程。横亘在服务器和应用程序之间,


2. 保证集群的高可用(理想状态下,永远可用,可以读写)

任何集群永远都无法保证永远可用,但是在合理的条件下,永远都不应该出现用户无法读写的情况。在功能发生明显降级前,集群应当允许尽可能多的节点失效。

MongoDB通过多种途径来保证最长的正常运行时间。集群的每一部分可以并且应当在其他服务器上(最理想的情况是在数据中心)有冗余的进程进行,以便当一个进程/机器/数据中心坏掉了,其他副本自动接替坏掉的部分继续工作。


把数据从一台服务器迁移到另一个非常有趣的难题:在传输过程中如何保证对数据访问的持续性和一致性?MongoDB提供了一些非常漂亮的技巧,以后会单独介绍。


3.使集群易于扩展

当系统需要更多的空间或者是资源的时候,应当可以添加.MongoDB支持按需扩充系统容量。有关增加和删除容量的更多内容以后会介绍


二 分片是如何工作的

分片在集群中负责数据某一子集的一台或者多台服务器。举个例子,如果有一个集群存储了1,000,000份代表网站用户的文档,则一个分片可能包含其中200 000位用户的信息。

一个分片可以由一个或者多个服务器组成,去存储数据集中的某一个子集。若一个分片是由多台服务器组成的,则每台服务器都包含相同的数据集副本



为了使分片分配数据更加均匀,MongoDB会在不同分片间移动数据子集,它会根据片键(key)来决定移动哪些数据。

例如我们按照用户名username来划分用户集合。MongoDB使用基于区间的方法来进行划分(开区间/闭区间),按照区间值将数据分割成不同块,例如,['a','f')

mongodb中的分片多用【a,b)的方式来描述区间的范围,所以这会是最常见的形式。

比如:我们有一个username的区间['a','f'),那么‘a’,'char','esz'都可能属于此区间对应的集合,


2.1 分配数据: 将数据分配到分片(分片看起来很像关系数据库中的分区)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值