背景
随着数据量的与日俱增,单机的性能已经无法满足大数据的场景,当一个业务的所有数据没法存储在一台机器上时,对数据集在多个节点之间进行分布式存储就变得尤为重要。
通常来说,有两种基本的技术可以应用于数据分布式存储,它可以将数据拆分到多个节点上,以允许更多的并行处理,还可以复制或缓存在不同的节点,以提高客户端和服务器之间的通讯效率和容错能力。
分区
分区是将数据级划分为更小的不同独立集,每个分区都是数据的子集,分区技术可以限制在同一分区内的数据量和数据相关性。
通常我们会根据对业务数据集的主要访问模式来定义分区,从而处理具有独立分区特性的数据集。例如,对于某一个电商app的销售订单,由于用户存在天然的地域性,我们就可以使用地域属性将订单数据进行分区存储,每个地域的数据量较全量而言就更加可控,查询或操作该地域的订单就只需要处理该地域的子集数据。
复制
复制是指在多台机器上复制相同的数据,这就可以让更多的机器参与计算。复制是通过创建额外的冗余数据副本来提高可用性,即使节点发生故障时也不会造成数据丢失,避免了分区的单点故障。
但另一方面,复制也会带来很多新的问题,例如
1、节点之间需要带宽进行数据同步
2、同步存在数据延迟,需要以某种方式保持一致性
在分布式数据库领域,分区和复制技术经常结合使用,来提升数据处理效率和服务的可用性。典型的例子就是Kafka的数据存储模型
每个Broker所在的节点都只会存储一个Topic的部分数据,并由该Broker作为主节点来处理这部分的数据操作,这就是分区技术的体现。
同时,一个Topic的part部分数据会复制到多个不同的从节点上,避免单个Broker宕机造成的数据丢失,这就是复制技术的体现。