java如何在绝地武士中实现负载平衡?
我想把绝地武士用于Redis集群或者仅仅用于Redis服务器。我想知道如何为读取操作启用循环。无论我将如何使用Redis群集或带有Sentinel的Redis服务器。我将有几个主人,每个主人都有自己的奴隶。如何在特定哈希槽(或特定碎片)的所有从属设备之间分配读取操作
你可以在下面搜索框中键入要查询的问题!
我想把绝地武士用于Redis集群或者仅仅用于Redis服务器。我想知道如何为读取操作启用循环。无论我将如何使用Redis群集或带有Sentinel的Redis服务器。我将有几个主人,每个主人都有自己的奴隶。如何在特定哈希槽(或特定碎片)的所有从属设备之间分配读取操作
# 1 楼答案
负载平衡是分布式系统中一个非常重要的问题。一个需要考虑的问题是定义负载平衡的含义
在三个透镜中,如果只考虑不均匀载荷分布的内在因素,则可以检查IMKVS中的负载平衡机制:
基于关键流行度的负载平衡:调用特定项的频率似乎与IMKVS节点和系统的性能有关
基于密钥分配的负载平衡:在许多系统中,可用节点中的密钥分配本质上是一个负载平衡挑战。孤立于前一个节点以及基础节点的功能来检查问题可能会有风险,但是从实现的角度来看,它要简单得多,即使仅仅基于统计数据
基于查询量的负载平衡:在一些负载平衡部署中,从IMKVS部署以及从节点并发请求的密钥数量似乎是一个重要的度量
因此,总而言之,负载平衡问题的调查至少需要检查以下因素:
传入查询的频率
传入查询的数量
钥匙在系统中的分配方式
键长度和值长度
实验
根据我的实验:
密钥的分布在负载平衡因素中起着重要作用。因此,在上一个实验中,我的目标是观察在Redis集群中,通过密钥从一个节点迁移到另一个节点,响应时间是如何变化的。出于实验的需要,我在一个主节点(M1)中加载了33000,在另一个主节点(M2)中加载了0。我在M1中进行了4次并发客户端调用,在时间7开始迁移,在时间36停止迁移
我观察到4次并发客户端调用的RT平均为25毫秒。在迁移过程开始时,响应时间突然增加,而在迁移过程结束时,我们注意到响应时间减少了9毫秒。这一改进表明速度提高了3倍。这些尖峰是由于 迁移命令的开销。此命令实际上执行DUMP+DEL 源实例中的操作,以及目标实例中的还原操作。因此,很明显,随着密钥从一个重载节点迁移到另一个节点 另一方面,响应时间显著缩短
综上所述,很明显,随着读取请求在节点之间的分布,无法确定Redis中是否存在负载分布(平衡),因为结果显示:
关键的受欢迎程度和价值量等因素似乎影响不大 效果
密钥分布和密钥长度是影响负载的因素 平衡问题并影响群集的RTs
因此,您需要创建一个结合所有这些因素的机制。您可以从一个算法开始,该算法在节点之间分配密钥
算法步骤如下:
找到大师的人群
获取他们持有的钥匙总数
对于每个主节点,存储主机名,端口和键数
计算每个主机必须持有的密钥,以便均衡密钥分布(集群总密钥/主机数量)
查找哪些主节点必须接受或提供密钥以及它们必须接受/提供的密钥总数
根据主节点分别接收或发送密钥,将主节点描述为源节点或目标节点
开始从源节点迁移到目标节点,首先是hashslot,然后是相关的键,然后迭代,直到所有主节点具有相同数量的键
然后你可以创建下一个算法来创建一个提供LB的机制来最小化RT
注意:我将在半个月的时间里在我的论文中添加更多的信息,以及我的算法实现到Github的链接
文件链接: https://www.researchgate.net/publication/309732099_Load_Balancing_in_In-Memory_Key-Value_Stores_for_Response_Time_Minimization