可以从两方面来理解分布式存储:用户侧和实现侧。因为在软件领域有个经典的拆解问题的角度:接口和实现分离。

java 分布式缓存原理 java分布式存储_分布式系统

从用户方面看,单个应用的数据越来越多,低成本的商用单机存储难以满足需求。增加单机存储容量是一种思路,但成本会成倍增加,而且总是有上限的。另一种思路就是集合很多机器对外提供服务。最传统的接口是文件系统和数据库,但其接口都较为复杂,因此一开始分布式存储都寻求简化接口,以将精力放在解决分布式系统的问题上。比如裁剪的文件系统GFS,比如对象存储S3。随着分布式系统实践越来越多,可以支持更复杂的接口实现,最近趋势是提供更丰富的接口以满足不同场景需求,比如满足缓存的kv,满足通用需求的分布式文件系统,满足关系存储的NewSQL。

从实现侧来说,数据如何分散到多机上去?最基本的分布式解决办法是将数据分片(partition),使得一个分片能被任何单机存下。当然在实现中,分片一般会更小。随着数据越来越多,分片会越来越多,需要的机器也就越来越多。但硬件有良品率和老化问题,概率虽然不大,但在大机器量的情况下就会成为问题。为了保障数据不丢,需要将每个分片做冗余处理,包括EC编码(纠删码)和多副本(replication)。多副本数据如何做同步,这又会引出分布式系统中经典的一致性问题。再展开就比较晦涩了,有兴趣可以探讨。

总结来说,从底层实现来看,分布式存储解决如何将数据存到多台机器上,并且提供可用性,可靠性和一致性等问题,近年来有很多实践经验,也慢慢沉淀出来了一些模式。以这些通用实现为底座,可以包装出不同的用户接口,比如文件系统,关系型数据库,对象存储等等。

如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1160405674,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!