分布式系统-无状态

分布式系统的一个难点,便是它保存的数据,要保证是无状态的。

要做到这一点,有三个思路。一是每个系统节点,分别保存一份完整的数据;二是每个系统节点,分别保存一部分数据,也就是将数据切片;三是思路一和思路二结合使用。

每个系统节点保存一份完整的数据,好处在于保证了整个分布式系统的高可用,缺点便是系统数据容量有瓶颈。

切片,好处则在于突破了单节点容量瓶颈的限制,缺点便是节点异常后,需要做数据迁移,增加了系统复杂度。

那是不是按照思路三,将两者结合,就完美了呢?并非如此,世上绝无完美的方案,任何方案都有它的缺点和优点。实际中,需要从系统的设计基础假定出发,来选择最合适的技术方案。

接下来,我通过几个常用的系统组件,来说一说这个事。

mysql是分布式系统吗?

有人会说,mysql有主备,还有主从,应该是分布式系统。其实,从设计上来讲,mysql不算分布式系统,它的设计就是单点系统。只是为了保证高可用,所以引入了主备的方案。

为了降低主库的压力,又引入了主从的方案。

一般来说,mysql的主备,都是一主一备,但有些特别核心的系统,也会采用一主多备的设计。mysql主备,需要一个HA系统,HA系统直面client,负责转发请求、主库监控以及主备切换。

mysql主从,则一般在client端做负载分发或者加一层proxy系统,负责分发请求。

redis如何通过设计保证数据是无状态的?

redis是一个基于内存的KV数据库,由于单点有数据瓶颈的问题,redis演变为了分布式数据库,通过切片集群的思路,将数据分散保存在不同节点。具体的方案,便是redis cluster。

这个方案,将整个redis集群,分隔成16384个hash槽,然后每个节点,负责一部分hash槽。保存数据时,则根据key,计算出应该保存在哪一个hash槽中,也就知道了对应的节点。

当然client确定具体节点这个事,细节还是很多的,比如redis集群扩容缩容、数据重洗等,有兴趣可以阅读如下链接:https://time.geekbang.org/column/article/276545

通过这样的设计,就保证了redis的数据是无状态的。

posted @ 2024-02-20 23:27  天NULL  阅读(55)  评论(0)    收藏  举报