问题描述
我正在尝试深入了解分布式缓存。
比如说,我有 1、2 和 3 个分布式缓存。
假设进程一,p1,尝试将键“K1”和值“Value1”写入缓存。算法根据key决定写哪个缓存,K1写1。K1上的读请求有没有可能去分区号2或3。或者理想情况下,为了分区缓存正常工作,请求对 Key 的读取、写入和更新应始终转到特定分区(在这种情况下,对于 K1,所有请求都应始终转到分区 1?)
解决方法
取决于分布式缓存服务和配置的操作模式
在独立模式下配置服务器的分发感知客户端
- 客户端是此配置中的分发感知代理
- 使用服务器端点列表初始化客户端
- 使用散列策略初始化客户端(最好在所有客户端中使用相同的散列策略,以有效地检索另一个客户端设置的密钥)
- 服务器仅充当键/值
- 为了存储键值对,客户端将(按照策略)对键进行哈希处理,并将请求转发到相应的服务器进行存储
- 如果服务器不可用,客户端可以选择回退哈希策略来选择不同的服务器(这可以尝试直到最后一个服务器)。在这种情况下,不同服务器上的值的协调可能会导致网络分区情况下的数据不一致。
- 或者如果服务器不可用,客户端可以简单地不存储在缓存中并返回错误
从设置的角度来看,这可能很简单,但从扩展和调试的角度来看,这会有点困难。
集群模式的服务器和客户端作为代理
- 服务器是此配置中的分发感知代理
- 服务器设置为仲裁,每个服务器都知道所有其他服务器
- 服务器使用一些一致的散列策略进行初始化,以在节点故障时处理负载和有效恢复
- 每个服务器都知道分配给其他每个服务器的密钥分区,因此可以转发请求
- 客户端配置了一组服务器
- 客户端可以调用任何服务器,服务器集群负责将请求委托给正确的服务器并将响应返回给客户端
这种组合的变体可以在客户端和服务器中混合分发感知。但通常倾向于将逻辑保留在一侧,以便在出现问题时进行高效调试
共识
或者,如果您正在寻找数据量低(可以具有高读取和低写入)的共识系统,那么请查看
- 基于 ZAB 的设计(动物园管理员)
- 基于 Raft 的设计 (etcd)
- 基于 Paxos 的设计(Google 的分布式共识系统可能基于 Paxos)