对特定键的请求可以进入分布式缓存中的不同缓存吗?

问题描述

我正在尝试深入了解分布式缓存。

比如说,我有 1、2 和 3 个分布式缓存。

假设进程一,p1,尝试将键“K1”和值“Value1”写入缓存。算法根据key决定写哪个缓存,K1写1。K1上的读请求有没有可能去分区号2或3。或者理想情况下,为了分区缓存正常工作,请求对 Key 的读取、写入和更新应始终转到特定分区(在这种情况下,对于 K1,所有请求都应始终转到分区 1?)

解决方法

取决于分布式缓存服务和配置的操作模式

在独立模式下配置服务器的分发感知客户端

  1. 客户端是此配置中的分发感知代理
  2. 使用服务器端点列表初始化客户端
  3. 使用散列策略初始化客户端(最好在所有客户端中使用相同的散列策略,以有效地检索另一个客户端设置的密钥)
  4. 服务器仅充当键/值
  5. 为了存储键值对,客户端将(按照策略)对键进行哈希处理,并将请求转发到相应的服务器进行存储
  6. 如果服务器不可用,客户端可以选择回退哈希策略来选择不同的服务器(这可以尝试直到最后一个服务器)。在这种情况下,不同服务器上的值的协调可能会导致网络分区情况下的数据不一致。
  7. 或者如果服务器不可用,客户端可以简单地不存储在缓存中并返回错误

从设置的角度来看,这可能很简单,但从扩展和调试的角度来看,这会有点困难。

集群模式的服务器和客户端作为代理

  1. 服务器是此配置中的分发感知代理
  2. 服务器设置为仲裁,每个服务器都知道所有其他服务器
  3. 服务器使用一些一致的散列策略进行初始化,以在节点故障时处理负载和有效恢复
  4. 每个服务器都知道分配给其他每个服务器的密钥分区,因此可以转发请求
  5. 客户端配置了一组服务器
  6. 客户端可以调用任何服务器,服务器集群负责将请求委托给正确的服务器并将响应返回给客户端

这种组合的变体可以在客户端和服务器中混合分发感知。但通常倾向于将逻辑保留在一侧,以便在出现问题时进行高效调试

共识

或者,如果您正在寻找数据量低(可以具有高读取和低写入)的共识系统,那么请查看

  1. 基于 ZAB 的设计(动物园管理员)
  2. 基于 Raft 的设计 (etcd)
  3. 基于 Paxos 的设计(Google 的分布式共识系统可能基于 Paxos)