如何理解分布式存储中的分片和副本两者之间的区别与联系?

如题,我初次接触分布式的存储部署方案,副本我的理解就是一主多从(在单个集群来讲)的概念,主节点承担写入操作,所有副本节点或称从库承担读操作。然后每个节点又可以进行分片存储?水平扩展到多台机子上?
是不是这意思?
我的理解还是很模糊的。希望哪个大神给我讲一下,讲清楚一点。

阅读 5.5k
4 个回答

不同的技术所说的“分片”可能并不是指的同样的东西,比如跟Oracle技术人员说“分片”,跟MongoDB技术人员说的“分片”就是两个不同的东西。我仅从MongoDB技术的角度做如下解释,注意这些内容对于其他技术不一定适用。
所谓分片,是把一份完整的数据按一定的条件划分成不同的几份,由不同的服务器来存储划分之后的内容,每份内容就叫做一个。这个划分条件在MongoDB中叫做片键。对于外界来说,显然不希望知道数据是从哪里来,分了多少片,因为对于应用来说,需要看到的是完整的一份数据,而不希望自己的业务逻辑中掺杂了”去哪里取这份数据”这样与业务无关的问题。所以在分片的同时,MongoDB提供了mongos作为对外接口,使得数据在物理上分开存储和处理,在逻辑上还是完整的一份。
有了分片将数据分布在不同的物理设备上,就引入了更多的设备为同一份数据服务。无论机率如何,每台设备都有一定的机会出现故障。假设每台机器出现故障的机会x%是一样的,随机参与服务的机器数量增多,整个集群出现故障的机会就会随着参与服务的设备数量n增加而增加,所以对于集群整体而言,出现故障的机率就是x% * n。也就是说,集群中的任何一个设备出现故障,整个集群就处于不健康的状态从而影响对外界的服务。这就是我们常说的

在分布式环境下故障是常态

为了解决这个问题就需要冗余,也就是这里所说的副本。它的目的在于,当集群中的一台设备出现问题的时候,会有一台跟他持有相同数据设备马上代替它的位置对外界提供服务,从而从外界看起来整个集群仍然是健康的。当然副本的存在同时也提供了一个额外的用处,就是读写分离。但是要记住读写分离只是副本的“副业”,它的“主业”是提供高可用。

解释到这里你应该已经了解分片和副本各自的用处了,那么先有谁再有谁的问题能够理解了吗?不妨自己尝试分析一下。

分片是本来一个实例存了234提供业务读写,现在分为三个实例分别存了2、3、4分别提供业务读写

副本是本来一个实例存了234提供业务读写,现在为这个实例加了若干从节点,每个从节点都存了234,原节点为主提供写服务,也可以提供读服务,其他从节点实时同步主节点数据,并提供读服务。

两者都是为了分担业务压力而来,分片的读写都分散了,副本分担读压力。

我的理解:分片指的是将数据分散存储到不同的节点;副本指的是对某个节点进行复制备份同时也提供读!

多谢楼上两位,但我还是不懂。。-_-~~
也就是说,多个分片组成一套完整的数据,分片跟mysql的分区是一个概念吗?幅本则身是是一个完整的数据?我这样理解对吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题