2 Node Redis HA



我有两个节点,我想在活动模式下以服务器的身份运行,并且具有HA功能,即如果一个人降低,另一个应该开始收到所有请求正在提高,两者都应接受所有请求。现在,由于Redis不允许使用同一哈希集的主动模式,并且我没有运行Sentinel的选项,因为我无法使用第三个节点,所以我的想法是在复制中运行两个节点,而我自己是否决定是否大师节点正在下降,并将奴隶推广到主人。有什么问题吗?当原始大师返回时,是否可以将其配置为从?

这听起来像是个好主意吗?除了Redis以外,我愿意接受建议。

通常运行两个节点从来都不是一个好主意,因为它势必会出现分裂的大脑问题:当两个节点之间的网络暂时降低一两个时刻时,两个节点不可避免地会认为彼此是离线的,并且会促进/保持自己为主人,并开始接受其他服务的请求。然后发生分裂的大脑。

,如果您对这种可能的情况还可以,那么您可以在脚本文件和Pacemaker(Pacemaker或Keepalived)的帮助下查看设置主奴隶。

通常,您必须通过一个预定义的规则告诉群集管理器,当两台机器在分裂大脑条件下重新加入时,这是您的首选主人。

当选主人时,执行脚本,基本上它会自行执行slaveof no one并在另一个节点上执行slaveof <new-master-ip> <port>

您可以在脚本文件中更进一步,并尝试将两个数据集合并在一起,但是这是否可以实现,完全取决于您在Redis中组织数据的方式以及您准备等待多长时间具有同步的所有数据。

我自己已经通过起搏器 corosync。

好的,与奴隶的部分解决方案:

您可以通过运行:

手动将奴隶提升为掌握。
SLAVEOF NO ONE

您可以通过运行来手动过渡大师到从:

SLAVEOF <HOST> <port>

应该禁用聚类。

如果您通过将复制品移到replicaof no one中,将复制品移到了在线上,则需要小心地将失败的主人带回新节点的副本,以免覆盖更多最新的数据。我不建议您手动执行此操作。您想最大程度地减少停机时间,因此自动故障转移是理想的

您提到向其他产品开放。查看具有所需的确切配置的KeyDB。它是REDIS的多线叉,它提供了您正在寻找的活动复制方案。在此处查看一个示例。

将两个节点作为彼此的副本运行,同时接受读取并同时写入(取决于前期代理配置)。如果一个失败了,另一个人将继续承担全部负载并已经同步。

关于分裂的大脑关注,KeyDB可以处理大脑之间的分裂大脑场景,以切断大师之间的联系,但继续写信。每个写入都有时间戳,并且在恢复连接时,每个主人将共享他们的新数据。最新的写作将获胜。这样可以防止过时的数据覆盖连接后编写的新数据。

我建议我至少拥有3个带有Sentinel设置的节点,以启用八卦/Quorum自动促进从属的自动促销时,当当前主节点降低时。

我相信可以使用两个节点创建一个带有下面命令的群集:

$ redis-cli --cluster create <ip-node1>:7000 <ip-node1>:7001 <ip-node2>:7000 <ip-node2>:7001 --cluster-replicas 1

解决分裂问题。您可以添加第三个节点,而无需数据:

$ cluster meet #IP_node3#:7000

$ cluster节点

我认为它有效。

python使用redis模块的示例,请注意我尚未测试,但我认为这应该有效:

import redis
import random
def get_redis_connection():
    # List of Redis nodes
    redis_nodes = [
        {'host': 'redis1.example.com', 'port': 6379},
        {'host': 'redis2.example.com', 'port': 6379}
    ]
    # Shuffle the nodes to distribute the load
    random.shuffle(redis_nodes)
    # Attempt connection to each node until successful or all fail
    for node in redis_nodes:
        try:
            r = redis.Redis(host=node['host'], port=node['port'])
            r.ping()  # Test the connection
            return r
        except redis.exceptions.ConnectionError:
            continue
    raise Exception("Failed to connect to any Redis node")
# Usage example
redis_connection = get_redis_connection()
redis_connection.get('key')

最新更新