有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在绝地武士中实现负载平衡?

我想把绝地武士用于Redis集群或者仅仅用于Redis服务器。我想知道如何为读取操作启用循环。无论我将如何使用Redis群集或带有Sentinel的Redis服务器。我将有几个主人,每个主人都有自己的奴隶。如何在特定哈希槽(或特定碎片)的所有从属设备之间分配读取操作


共 (1) 个答案

  1. # 1 楼答案

    负载平衡是分布式系统中一个非常重要的问题。一个需要考虑的问题是定义负载平衡的含义

    在三个透镜中,如果只考虑不均匀载荷分布的内在因素,则可以检查IMKVS中的负载平衡机制:

    1. 基于关键流行度的负载平衡:调用特定项的频率似乎与IMKVS节点和系统的性能有关

    2. 基于密钥分配的负载平衡:在许多系统中,可用节点中的密钥分配本质上是一个负载平衡挑战。孤立于前一个节点以及基础节点的功能来检查问题可能会有风险,但是从实现的角度来看,它要简单得多,即使仅仅基于统计数据

    3. 基于查询量的负载平衡:在一些负载平衡部署中,从IMKVS部署以及从节点并发请求的密钥数量似乎是一个重要的度量

    因此,总而言之,负载平衡问题的调查至少需要检查以下因素:

    • 传入查询的频率

    • 传入查询的数量

    • 钥匙在系统中的分配方式

    • 键长度和值长度

    实验

    根据我的实验:

    • 获取一个特定密钥的响应时间(RT)几乎没有改变,如下所示: 节点中更改的密钥数
    • RT快速增长,钥匙长度增加
    • 值的卷之间的响应时间差为 不重要,因此值大小不影响RT
    • RT的增长率与客户端调用的数量成正比

    密钥的分布在负载平衡因素中起着重要作用。因此,在上一个实验中,我的目标是观察在Redis集群中,通过密钥从一个节点迁移到另一个节点,响应时间是如何变化的。出于实验的需要,我在一个主节点(M1)中加载了33000,在另一个主节点(M2)中加载了0。我在M1中进行了4次并发客户端调用,在时间7开始迁移,在时间36停止迁移

    enter image description here

    我观察到4次并发客户端调用的RT平均为25毫秒。在迁移过程开始时,响应时间突然增加,而在迁移过程结束时,我们注意到响应时间减少了9毫秒。这一改进表明速度提高了3倍。这些尖峰是由于 迁移命令的开销。此命令实际上执行DUMP+DEL 源实例中的操作,以及目标实例中的还原操作。因此,很明显,随着密钥从一个重载节点迁移到另一个节点 另一方面,响应时间显著缩短

    综上所述,很明显,随着读取请求在节点之间的分布,无法确定Redis中是否存在负载分布(平衡),因为结果显示:

    • 关键的受欢迎程度和价值量等因素似乎影响不大 效果

    • 密钥分布和密钥长度是影响负载的因素 平衡问题并影响群集的RTs

    • RT可以通过将密钥从一个节点迁移到另一个节点来减少,例如 这样,集群中的每个节点都有相同数量的密钥

    因此,您需要创建一个结合所有这些因素的机制。您可以从一个算法开始,该算法在节点之间分配密钥

    算法步骤如下:

    1. 找到大师的人群

    2. 获取他们持有的钥匙总数

    3. 对于每个主节点,存储主机名,端口和键数

    4. 计算每个主机必须持有的密钥,以便均衡密钥分布(集群总密钥/主机数量)

    5. 查找哪些主节点必须接受或提供密钥以及它们必须接受/提供的密钥总数

    6. 根据主节点分别接收或发送密钥,将主节点描述为源节点或目标节点

    7. 开始从源节点迁移到目标节点,首先是hashslot,然后是相关的键,然后迭代,直到所有主节点具有相同数量的键

    然后你可以创建下一个算法来创建一个提供LB的机制来最小化RT

    注意:我将在半个月的时间里在我的论文中添加更多的信息,以及我的算法实现到Github的链接

    文件链接: https://www.researchgate.net/publication/309732099_Load_Balancing_in_In-Memory_Key-Value_Stores_for_Response_Time_Minimization