如何在 Jedis 中启用负载平衡?
How to enable load balance in Jedis?
我想将 Jedis 用于 Redis 集群或仅用于 Redis 服务器。我想知道如何为读取操作启用 Round Robin。不管我将使用 Redis 集群还是带有 Sentinel 的 Redis 服务器。我会有几个主人,每个主人都会有自己的奴隶。如何在特定哈希槽(或特定分片)的所有从属之间分配读取操作?
负载均衡是分布式系统中一个非常重要的问题。一个考虑因素是定义负载平衡的含义。
如果我们只考虑负载分布不均的内在因素,那么可以从三个角度检查 IMKVS 中的负载平衡机制:
基于key popularity的负载均衡:特定item被调用的频率似乎与IMKVS节点和系统的性能有关
基于密钥分布的负载平衡:在许多系统中,可用节点中密钥的分布本质上构成了负载平衡的挑战。独立于之前的问题以及底层节点的能力来检查问题可能存在风险,但在实施方面要简单得多,即使仅基于统计数据。
基于查询量的负载平衡:从 IMKVS 部署并因此从节点同时请求的密钥数量似乎是某些负载平衡部署中感兴趣的指标。
总而言之,负载均衡问题的调查至少需要检查这些因素:
传入查询的频率
传入查询量
密钥在系统中的分布方式
键长度和值长度
实验
根据我的实验:
- 获取一个特定密钥的响应时间 (RT) 几乎没有变化,因为
节点中更改的键数。
- RT 增长迅速,密钥长度增加。
- 值的体积之间的响应时间差为
微不足道,因此值大小不影响 RT。
- RT的增长率与客户端调用量成正比。
键的分布在负载平衡因素中起着重要作用。因此,在上一个实验中,我的目的是观察响应时间如何通过键从 Redis 集群中的一个节点迁移到另一个节点而发生变化。为了实验的需要,我在一个主节点 (M1) 中加载了 33000,在另一个主节点 (M2) 中加载了 0。我在 M1 中进行了 4 个并发客户端调用,我在时间 7 开始迁移并在时间 36 停止。
我观察到 4 个并发客户端调用的 RT 平均为 25 毫秒。在迁移过程开始时,响应时间突然增加,而在过程结束时,我们注意到响应时间减少了 9 毫秒的数量级。这一改进表明速度提高了 3 倍。尖峰是由于
迁移命令的开销。这个命令实际上执行了一个 DUMP+DEL
源实例中的操作,以及目标实例中的 RESTORE 操作。因此,很明显,随着密钥从一个重负载节点迁移到
另一个响应时间显着减少。
从上面可以清楚地看出,随着读取请求在节点之间的分布,你不能确定你在Redis中会有负载分布(平衡),因为结果表明:
关键流行度和价值量等因素似乎影响较小
效果
密钥分布和密钥长度是影响负载的因素
平衡问题并影响集群的 RTs
- RT 可以通过将密钥从一个节点迁移到另一个节点来减少,在
这样集群中的每个节点都有相同数量的键
因此,您需要创建一种结合所有这些因素的机制。您可以从在节点之间分发密钥的算法开始。
算法步骤如下:
求群雄
获取他们持有的key总数
为每个主节点存储主机名、端口和密钥数量
计算每个master必须持有的key,使key的分布均衡(集群key总数/master数量)
查找哪些主节点必须获取或提供密钥以及它们必须获取的密钥总数give/take
根据主节点是接收密钥还是分发密钥,分别将主节点表征为源节点或目标节点
开始从源节点迁移到目标节点,首先是hashslots,然后是相关的key,然后迭代直到所有master拥有相同数量的key
然后您可以创建下一个算法以创建提供 LB 的机制以最小化 RT。
注意:我将在半个月内在我的论文中添加更多信息,以及 link 到 Github 我的算法实现。
我想将 Jedis 用于 Redis 集群或仅用于 Redis 服务器。我想知道如何为读取操作启用 Round Robin。不管我将使用 Redis 集群还是带有 Sentinel 的 Redis 服务器。我会有几个主人,每个主人都会有自己的奴隶。如何在特定哈希槽(或特定分片)的所有从属之间分配读取操作?
负载均衡是分布式系统中一个非常重要的问题。一个考虑因素是定义负载平衡的含义。
如果我们只考虑负载分布不均的内在因素,那么可以从三个角度检查 IMKVS 中的负载平衡机制:
基于key popularity的负载均衡:特定item被调用的频率似乎与IMKVS节点和系统的性能有关
基于密钥分布的负载平衡:在许多系统中,可用节点中密钥的分布本质上构成了负载平衡的挑战。独立于之前的问题以及底层节点的能力来检查问题可能存在风险,但在实施方面要简单得多,即使仅基于统计数据。
基于查询量的负载平衡:从 IMKVS 部署并因此从节点同时请求的密钥数量似乎是某些负载平衡部署中感兴趣的指标。
总而言之,负载均衡问题的调查至少需要检查这些因素:
传入查询的频率
传入查询量
密钥在系统中的分布方式
键长度和值长度
实验
根据我的实验:
- 获取一个特定密钥的响应时间 (RT) 几乎没有变化,因为 节点中更改的键数。
- RT 增长迅速,密钥长度增加。
- 值的体积之间的响应时间差为 微不足道,因此值大小不影响 RT。
- RT的增长率与客户端调用量成正比。
键的分布在负载平衡因素中起着重要作用。因此,在上一个实验中,我的目的是观察响应时间如何通过键从 Redis 集群中的一个节点迁移到另一个节点而发生变化。为了实验的需要,我在一个主节点 (M1) 中加载了 33000,在另一个主节点 (M2) 中加载了 0。我在 M1 中进行了 4 个并发客户端调用,我在时间 7 开始迁移并在时间 36 停止。
我观察到 4 个并发客户端调用的 RT 平均为 25 毫秒。在迁移过程开始时,响应时间突然增加,而在过程结束时,我们注意到响应时间减少了 9 毫秒的数量级。这一改进表明速度提高了 3 倍。尖峰是由于 迁移命令的开销。这个命令实际上执行了一个 DUMP+DEL 源实例中的操作,以及目标实例中的 RESTORE 操作。因此,很明显,随着密钥从一个重负载节点迁移到 另一个响应时间显着减少。
从上面可以清楚地看出,随着读取请求在节点之间的分布,你不能确定你在Redis中会有负载分布(平衡),因为结果表明:
关键流行度和价值量等因素似乎影响较小 效果
密钥分布和密钥长度是影响负载的因素 平衡问题并影响集群的 RTs
- RT 可以通过将密钥从一个节点迁移到另一个节点来减少,在 这样集群中的每个节点都有相同数量的键
因此,您需要创建一种结合所有这些因素的机制。您可以从在节点之间分发密钥的算法开始。
算法步骤如下:
求群雄
获取他们持有的key总数
为每个主节点存储主机名、端口和密钥数量
计算每个master必须持有的key,使key的分布均衡(集群key总数/master数量)
查找哪些主节点必须获取或提供密钥以及它们必须获取的密钥总数give/take
根据主节点是接收密钥还是分发密钥,分别将主节点表征为源节点或目标节点
开始从源节点迁移到目标节点,首先是hashslots,然后是相关的key,然后迭代直到所有master拥有相同数量的key
然后您可以创建下一个算法以创建提供 LB 的机制以最小化 RT。
注意:我将在半个月内在我的论文中添加更多信息,以及 link 到 Github 我的算法实现。