Redis集群指定主从关系及动态增删节点

集群创建

我们常用以下命令创建集群:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

这样就创建了一个具有3个主节点和3个从节点的集群。

其中,我们虽然指定了每个主节点都有一个从节点,但哪个是7000的从节点,却是随机分配的,直到集群创建完毕,才能确定是7003、7004还是7005。

但是,有时候,当我们只有3台物理节点时,就想要指定主从关系,从而保证高可用。

而指定主从关系,就需要手动操作了。

指定主从

思路如下:

  1. 先创建具有三个主节点的集群,没有从节点
  2. 使用添加节点的命令添加从节点,这样就可以在添加时指定它们的主节点,建立主从对应关系

具体如下:

  1. 使用以下命令创建主节点:redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0
  2. 增加从节点:

redis-cli --cluster add-node 127.0.0.1:7003 127.0.0.1:7000 --cluster-slave --cluster-master-id ***************

其中:

  • slave 表示要添加从节点
  • cluster-master-id 要添加到哪一个主节点,id是*****
  • 127.0.0.1:7003 要添加的从节点
  • 127.0.0.1:7000 原集群中任意节点

ok,这样添加完后得到的就是指定的想要的节点架构。

动态增删节点

  1. 增加主节点

redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7000

其中:

  • 127.0.0.1:7008 要向集群添加新的节点
  • 127.0.0.1:7000 原集群中任意节点

这里,节点已经加入集群,但:

  • 由于它还没有分配到 hash slots,所以它还没有数据
  • 由于它是还没有 hash slots的主节点,所以它不会参与到从节点升级到主节点的选举中

此时,执行 resharding 指令来为它分配 hash slots,这会进入交互式命令行,由用户输入相关信息:

redis-cli --cluster reshard 127.0.0.1:7000

只需要指定一个节点,redis会自动发现其他节点。

  • How many slots do you want to move (from 1 to 16384)?
  • target node id?
  • from what nodes you want to take those keys?

第一个问题需要需要填写,如1000.
第二个问题可以通过命令查看:redis-cli -p 7000 cluster nodes | grep myself
第三个问题:all,这样会从每个节点上移动一部分 hash slots到新节点

然后开始迁移,每迁移一个key就会输出一个点。

待所有迁移完成后,执行下面的指令查看集群是否正常:

redis-cli --cluster check 127.0.0.1:7000

  1. 增加从节点

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave

该指令与增加主节点语法一致,与添加主节点不同的是,显式指定了是从节点。

这会为该从节点随机分配一个主节点,优先从那些从节点数目最少的主节点中选取。

如果要在添加从节点时就为其指定主节点,需要指定master-id,执行下面的指令(需要替换为真实的id):

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

另一种添加从节点的方式是添加一个空的主节点,然后把该节点指定为某个主节点的从节点:

cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

  1. 删除节点

注意,只能删除从节点或者空的主节点,指令如下:

redis-cli --cluster del-node 127.0.0.1:7000 <node-id>

其中:

  • 127.0.0.1:7000为集群中任意节点
  • node-id为要删除的节点的id

如果想删除有数据的主节点,必须先执行 resharding 把它的数据分配到其他节点后再删除。

参考

Redis 集群教程

### 如何在 Redis 中查看集群主从关系 为了验证 Redis 集群中的主从关系,可以利用 `redis-cli` 工具执行特定命令来获取当前节点状态以及它们之间的角色分配。以下是具体方法: #### 使用 `CLUSTER NODES` 命令 通过运行以下命令,可以获得关于集群中所有节点的信息,包括其 ID、IP 地址、端口号、状态以及主从关系。 ```bash redis-cli -h <host> -p <port> cluster nodes ``` 其中 `<host>` 是 Redis 主机地址,`<port>` 是对应的端口。该命令会返回详细的节点列表,每条记录包含如下字段: - **Node ID**: 节点唯一标识符。 - **Address**: IP 地址和端口号。 - **Flags**: 描述节点的角色(如 master 或 slave),以及其他标志位。 - **Status**: 表明节点是否在线及其健康状况。 - **Slots**: 当前节点管理的槽范围。 - **Connected Since**: 连接时间戳。 - **Handshake Status**: 是否完成握手协议。 例如,在输出结果中看到某一行标记有 `master` 字样,则表示这是一个主节点;如果标注为 `slave` 并附带一个主节点ID,则表明这是某个主节点的副本[^4]。 #### 查询单个实例的角色 除了全局视角外,还可以针对单一实例查询它的身份属性。登录到目标机器上的任意 Redis 实例后输入: ```bash INFO replication ``` 这将展示有关复制过程的各项统计指标,其中包括但不限于: - **role**: 显示当前实例扮演的是 'master' (主人翁), 'slave'(仆役)还是其他特殊情形. - 关于同步延迟的数据等等. 当 role 属性显示为 "slave" 时,还会额外报告其所追随的那个 master 的信息,比如主机名或者 ip 地址加上端口号码[^5]. 以上两种方式都可以有效地帮助管理员理解并监控整个 Redis Cluster 架构下的主从分布情况. ### 注意事项 尽管上述手段能够满足日常运维需求,但在实际生产环境中可能还需要考虑更多因素,例如网络分区情况下部分节点不可达等问题的影响分析.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值