分布式存储系统设计的关键问题
本文介绍下分布式系统设计中的一些关键问题及解决思路:
数据的分布方式
副本的保存方式
副本的控制
节点状态监控
1)数据的分布方式
hash分布
用于key-value模型的存储系统中,数据库中的分表也能够使用这样的方式。
利用hash函数将对象散列到不同的机器。
长处:
散列型号,分布均匀,实现简单。
缺点
可扩展性(scalability)不强,添加新的机器会导致之前的映射所有失效。
按数据范围分布
用于key-value模型的存储系统中,数据库中的分表也能够使用这样的方式。
将数据分成不同的区间,分到不同的机器上。区间能够採用动态创建的方式。
长处:
数据拆分规则灵活,扩展性强
缺点:
元数据较多(维护数据分区和机器之间的相应关系),easy成为瓶颈。
按数据量分布
用于文件模型的存储系统。
分布过程中,保证个台机器上的数据量大体一致,即负载均衡方式。
长处:扩展性强
缺点:维护元数据(每一个文件分布在那台机器上)
一致性哈希
用于key-value模型的存储系统中
克服了hash分布的扩展性缺陷,广泛用于各种产品实现,如memcached, openstack swift等。
2)副本的保存方式
以机器为单位
副本以机器为单位,若干机器互为副本,副本之间的数据全然同样。
长处
实现简单
缺点
数据恢复效率不高(恢复源较少)。负载分布easy不均。
以数据段为单位
将数据拆分为合理的数据段,以数据段为单位进行副本保存。数据段的大小同样,有多种叫法:chunk, partition,segment等。
长处
恢复快,扩展性强
缺点
维护元数据,难于实现
3)副本控制
用来管理多副本之间的一致性问题,关系到系统的一致性模型。
中心化的副本控制
一个副本充其中心节点,控制其它副本,如primary-secondary方式。更新操作都要通过中心节点完毕,该方式的实现相对简单。
典型代表如GFS, mysql中的master-slave模式。
去中心化,个副本之间没有中心控制。
这样的方式的实现比較复杂,採用的不多,代表产品Dynamo。
4)节点状态监控
heartbeat
存在一个监控节点,其它节点定时向监控节点发送heartbeat信息。
lease机制
也能够採用lease机制实现状态监控。
fastdfs中的方法
1)数据的分布方式
按数据量分布,不同的组之间做负载均衡。
2)副本的保存方式
以机器为单位保存副本,互为副本的几台机器构成一个组。
3)副本控制
由tracker在组中选择一个storage作为中心节点(primary),其它的节点为从节点(secondary)。又中心节点负责向从节点同步数据。
4)节点状态监控
storage定时向tracker发送heatbeat信息,一旦规定的时间内没有收到心跳信息,将对应的节点下线。
參考文章
《分布式系统原理介绍》,刘杰