前言
hadoop、elasticsearch、redis cluster等系统都是基于分布式的系统架构,对于这些系统来说他们的数据分片存储 、多副本冗余、宕机感知、自动副本迁移、多余副本删除,这套机制都是类似的。
分布式存储的前生今世
- 假如数据库里有一张特别大的表,里面有几十亿,甚至上百亿的数据。如果用MySQL之类的数据库,单台数据库服务器上的磁盘可能都不够放这一张表的数据!
- 一台数据库服务器放不下,可以搞多台机器,把数据平均分到多台服务器,这样每台机器都可以轻松加愉快的放下这么多数据了。
- 所以说,把一个超大的数据集拆分成多片,给放到多台机器上去,这就是所谓的分布式存储。
分布式存储系统
- 分布式存储系统,负责把一个超大数据集拆分成多块,然后放到多台机器上来存储,接着统一管理这些分散在多台机器上存储的数据的一套系统。
- 分布式存储系统的角色有两种进程。
- 一个进程是Master节点,在一台机器上,负责统一管控分散在多台机器上的数据。(调度、元数据)
- 另外一批进程叫做Slave节点,每台机器上都有一个Slave节点,负责管理那台机器上的数据,跟Master节点进行通信。
分布式存储系统出现的问题
- 分布式存储系统某台机器宕机了如何处理?
- 如果机器宕机就会出现数据丢失的情况,所以必须做一个数据副本的策略。
- 给每一台机器上的数据做2个副本的冗余,放在别的机器上,然后万一某一台机器宕机,就可以在其他机器上找到他的副本。
- Master节点如何感知到数据副本消失?
- 每台机器上负责管理数据的Slave节点,都每隔几秒给Master节点发送一个心跳。
- 一旦Master节点发现一段时间没收到某个Slave节点发送过来的心跳,此时就会认为这个Slave节点所在机器宕机了,那台机器上的数据副本都丢失了,然后Master节点就不会告诉别人去读那个丢失的数据副本。
- 复制副本保持足够副本数量
- 因为我们预设的是每个数据分片都得有3个副本的。此时如何给这个数据分片增加1个副本呢?
- Master节点一旦感知到某台机器宕机,就能感知到某个数据分片的副本数量不足了。
- 此时,就会生成一个副本复制的任务,挑选另外一台机器来从有副本的机器去复制一个副本。
- 当机器4发送心跳过去的时候,Master节点就通过心跳响应把这个复制任务下发给机器4,让机器4从其他复制一个副本好了。
- 删除多余副本
- 一旦Master节点感知到宕机的机器复活,会发现副本数量过多,此时会生成一个删除副本任务。
- 在机器发送心跳的时候,下发一个删除副本的指令,让机器删除自己本地多余的副本就可以了。这样,就可以保持副本数量只有3个。