redis cluster-手动扩缩容

本文详细介绍Redis集群的垂直和水平扩容策略,包括配置调整、槽位迁移、读写操作处理及使用redis-cli工具进行节点添加与槽位重分配的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 垂直扩容

    1)redis-cli客户端连接上服务端

    2)修改配置config set maxmemory 10G

    3)配置持久化config rewrite

二.水平扩容-原生命令

1) 原有集群redis-10001 – – redis-10006对应6个节点,cluster slots获得集群信息如下:

172.24.29.164:10004> cluster slots
1) 1) (integer) 0
   2) (integer) 5460
   3) 1) "172.24.29.164"
      2) (integer) 10001
      3) "d5db6441763d6888551b8038393c33977a15f509"
   4) 1) "172.24.29.164"
      2) (integer) 10005
      3) "844a8cb32cd330891651f23c5876a6615f3127ad"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "172.24.29.164"
      2) (integer) 10002
      3) "bda0d2ab4927f5376cd240b233356c4909ed89fb"
   4) 1) "172.24.29.164"
      2) (integer) 10006
      3) "d027252ac021b215b7ef61eb3d309ff64ceda08d"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "172.24.29.164"
      2) (integer) 10003
      3) "68fa0c4db651b2c7fefec0e0d676360e6258cb38"
   4) 1) "172.24.29.164"
      2) (integer) 10004
      3) "163489c40568827cf8954682b6d9166aa223ce25"

 

2) 新启动 redis-10007和redis-10008两个redis实例,执行cluster meet命令,和现有集群握手,把redis-10008设为redis-10007的replicate

3)计划从redis-10001迁移槽位5到 redis-10007,通过cluster getkeysinslot 5 10 查询槽位5的keys

172.24.29.164:10001> cluster getkeysinslot 5 10
1) "11b930d0-a008-4436-a9bc-2284e9e998a7"
2) "3e0e5847-1089-407a-b304-e0e95033513c"
3) "be617cb5-a4a4-43b5-8f83-8b608369e47e"
4) "f64aa06f-692b-4689-a4ac-14150b02c4ae"

4)执行迁移分为以下几步1. 原节点准备迁出 2.目标节点准备导入 3.迁移key 4.通知迁移完成,每一步执行如下:

   1. 原节点准备迁出

172.24.29.164:10001> cluster setslot 5 MIGRATING 8eb574c8f01e3d36b969f04aad1afb8179e1f805
OK
172.24.29.164:10001> cluster nodes //为了突出重点,以下结果省略部分信息

d5db6441763d6888551b8038393c33977a15f509 172.24.29.164:10001@20001 myself,master - 0 1592402096000 7 connected 3-5460 [5->-8eb574c8f01e3d36b969f04aad1afb8179e1f805]

2.目标节点准备导入

172.24.29.164:10007> cluster setslot 5 importing d5db6441763d6888551b8038393c33977a15f509
OK
172.24.29.164:10007> cluster nodes  //为了突出重点,以下结果省略部分信息

8eb574c8f01e3d36b969f04aad1afb8179e1f805 172.24.29.164:10007@20007 myself,master - 0 1592402296000 9 connected 0-2 [5-<-d5db6441763d6888551b8038393c33977a15f509]

3.迁移 key

//迁移命令,多个key一起迁移
172.24.29.164:10001> migrate 172.24.29.164 10007 "" 0 1000 keys 11b930d0-a008-4436-a9bc-2284e9e998a7 3e0e5847-1089-407a-b304-e0e95033513c
OK
//迁移后查看2个节点的keys
172.24.29.164:10001> cluster getkeysinslot 5 10
1) "be617cb5-a4a4-43b5-8f83-8b608369e47e"
2) "f64aa06f-692b-4689-a4ac-14150b02c4ae"

172.24.29.164:10007> cluster getkeysinslot 5 10
1) "11b930d0-a008-4436-a9bc-2284e9e998a7"
2) "3e0e5847-1089-407a-b304-e0e95033513c"

//迁移命令,迁移一个key
172.24.29.164:10001> migrate 172.24.29.164 10007 be617cb5-a4a4-43b5-8f83-8b608369e47e 0 1000

 注意:迁移过程中,key的读写问题

读:

在10001上读,有数据则直接返回,无数据则返回ASK,如下

172.24.29.164:10001> get f64aa06f-692b-4689-a4ac-14150b02c4ae
"282101.7450073812"
172.24.29.164:10001> get be617cb5-a4a4-43b5-8f83-8b608369e47e
(error) ASK 5 172.24.29.164:10007

在10007上读,不论是否有,直接MOVE到10001,MOVE之后如上,如果想在10007上读写,需要先执行asking命令

//10007上读10001上有
172.24.29.164:10007> get f64aa06f-692b-4689-a4ac-14150b02c4ae
-> Redirected to slot [5] located at 172.24.29.164:10001
"282101.7450073812"
172.24.29.164:10001> 

//10007上读10001上没有=
172.24.29.164:10007> get 11b930d0-a008-4436-a9bc-2284e9e998a7
-> Redirected to slot [5] located at 172.24.29.164:10001
(error) ASK 5 172.24.29.164:10007
172.24.29.164:10001> 

//如果想在10007上读写,需要先执行asking命令,表示这次不需要MOVE,直接在该节点执行读写命令,如果读写的key在属于这个节点负责,直接执行
172.24.29.164:10007> asking
OK
172.24.29.164:10007> get f64aa06f-692b-4689-a4ac-14150b02c4ae
"111"

关于写,和读类似,10001判断该key是否在自己节点,在则处理,不在则ASK

4.迁移key完成,重新设置slot归属

172.24.29.164:10001> cluster setslot 5 node 8eb574c8f01e3d36b969f04aad1afb8179e1f805
OK
172.24.29.164:10007> cluster setslot 5 node 8eb574c8f01e3d36b969f04aad1afb8179e1f805
OK
//至此完成迁移

5.在10005节点查看slot所属

172.24.29.164:10005> cluster nodes
8eb574c8f01e3d36b969f04aad1afb8179e1f805 172.24.29.164:10007@20007 master - 0 1592446015028 11 connected 0-2 5 7
d5db6441763d6888551b8038393c33977a15f509 172.24.29.164:10001@20001 master - 0 1592446017000 7 connected 3-4 6 8-5460

 

三.水平扩容-redis-cli工具

1.启动新的两个redis实例,端口号10009,10010

2.通过redis-cli命令和集群握手

redis-cli --cluster add-node 172.24.29.164:10009 172.24.29.164:10001 //命令
>>> Adding node 172.24.29.164:10009 to cluster 172.24.29.164:10001 //输出过程及结果
>>> Performing Cluster Check (using node 172.24.29.164:10001)
M: d5db6441763d6888551b8038393c33977a15f509 172.24.29.164:10001
   slots:[3-4],[6],[8-5460] (5456 slots) master
   1 additional replica(s)
S: 8892437702d1896c83b6ad1919c9feb82bbf0c0f 172.24.29.164:10008
   slots: (0 slots) slave
   replicates 8eb574c8f01e3d36b969f04aad1afb8179e1f805
M: bda0d2ab4927f5376cd240b233356c4909ed89fb 172.24.29.164:10002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: d027252ac021b215b7ef61eb3d309ff64ceda08d 172.24.29.164:10006
   slots: (0 slots) slave
   replicates bda0d2ab4927f5376cd240b233356c4909ed89fb
S: 844a8cb32cd330891651f23c5876a6615f3127ad 172.24.29.164:10005
   slots: (0 slots) slave
   replicates d5db6441763d6888551b8038393c33977a15f509
S: 163489c40568827cf8954682b6d9166aa223ce25 172.24.29.164:10004
   slots: (0 slots) slave
   replicates 68fa0c4db651b2c7fefec0e0d676360e6258cb38
M: 8eb574c8f01e3d36b969f04aad1afb8179e1f805 172.24.29.164:10007
   slots:[0-2],[5],[7] (5 slots) master
   1 additional replica(s)
M: 68fa0c4db651b2c7fefec0e0d676360e6258cb38 172.24.29.164:10003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.24.29.164:10009 to make it join the cluster.
[OK] New node added correctly.

3.通过redis-cli把10010设为10009的从节点

redis-cli -h 172.24.29.164 -p 10010 cluster replicate fc7a8ebf805a821a17da7cbc1ad3a9197879e0df
OK

4.迁移槽位,reshard

 

redis-cli --cluster reshard 172.24.29.164:10001 
>>> Performing Cluster Check (using node 172.24.29.164:10001)
......
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000 //此处输入需要迁移的槽位数量
What is the receiving node ID? fc7a8ebf805a821a17da7cbc1ad3a9197879e0df  //此处输入要迁入的node-id
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all //此处输入输入节点,all则从其他所有节点输入

会车之后会显示迁移计划

Ready to move 1000 slots.
  Source nodes:
    M: d5db6441763d6888551b8038393c33977a15f509 172.24.29.164:10001
       slots:[3-4],[6],[8-5460] (5456 slots) master
       1 additional replica(s)
    M: bda0d2ab4927f5376cd240b233356c4909ed89fb 172.24.29.164:10002
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: 8eb574c8f01e3d36b969f04aad1afb8179e1f805 172.24.29.164:10007
       slots:[0-2],[5],[7] (5 slots) master
       1 additional replica(s)
    M: 68fa0c4db651b2c7fefec0e0d676360e6258cb38 172.24.29.164:10003
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
  Destination node:
    M: fc7a8ebf805a821a17da7cbc1ad3a9197879e0df 172.24.29.164:10009
       slots: (0 slots) master
       1 additional replica(s)
Resharding plan:
    Moving slot 5461 from bda0d2ab4927f5376cd240b233356c4909ed89fb
    Moving slot 5462 from bda0d2ab4927f5376cd240b233356c4909ed89fb
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes //输入yes回车开始执行迁移
Moving slot 5461 from 172.24.29.164:10002 to 172.24.29.164:10009: ....
Moving slot 5462 from 172.24.29.164:10002 to 172.24.29.164:10009: .
Moving slot 5463 from 172.24.29.164:10002 to 172.24.29.164:10009: ...
.......
一直等待迁移完成

 

<think>首先,用户的问题是关于Redis Cluster的扩容和缩容操作流程及注意事项。用户指定了具体实现步骤和需要注意的细节。我需要基于系统级指令来构建我的回答。 系统级指令: 1. 所有行内数学表达式必须使用 $...$ 格式。但在这个上下文中,数学表达式可能不常见,因为主题是Redis Cluster,涉及命令和配置。所以,我可能不需要使用数学表达式,除非有数值计算。 2. 独立公式必须使用 $$...$$ 格式并单独成段。同样,可能不适用。 3. LaTeX语法正确:确保所有LaTeX格式正确。 4. 使用中文回答:整个回答必须用中文。 5. 生成相关问题:在回答结束后,生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识:例如,[^1]。用户提供了几个引用,我需要引用它们。 用户提供的引用: - 引用[1]:讨论Redis Cluster的动态扩容。 - 引用[2]:添加新节点作为从节点的命令。 - 引用[3]:删除节点的命令。 - 引用[4]:创建新目录和复制配置文件的步骤。 - 引用[5]:迁移槽和数据的方法。 用户的问题焦点是扩容和缩容的操作流程及注意事项。 我的回答结构: - 结构清晰,逐步解决问题。 - 尽量保证真实可靠,基于标准Redis知识。 - 在引用相关段落时添加引用标识。 回答大纲: 1. **介绍Redis Cluster的扩容和缩容**:简要解释为什么需要扩容和缩容。 2. **扩容操作流程**: - 添加新节点。 - 将新节点加入集群。 - 迁移槽和数据。 3. **缩容操作流程**: - 迁移槽和数据出节点。 - 从集群中移除节点。 4. **注意事项**:关键点如数据迁移、槽均匀分布、集群健康检查等。 5. **生成相关问题**:在结尾添加相关问题。 使用引用: - 引用[1]:用于解释Redis Cluster的优势。 - 引用[2]:用于添加节点的命令。 - 引用[3]:用于删除节点的命令。 - 引用[4]:用于准备新节点的步骤。 - 引用[5]:用于数据迁移。 确保回答是中文。 最终输出格式: - 回答部分。 - §§相关问题§§ 部分。 现在,构建回答。</think>### Redis Cluster扩容和缩容操作流程及注意事项 Redis Cluster是一种分布式集群模式,支持动态扩容和缩容,通过分片(slot)机制实现数据自动分布和迁移。扩容指添加新节点以增加集群容量,缩容指移除节点以减少集群规模。以下我将基于标准Redis Cluster操作流程,详细介绍具体实现步骤和关键注意事项。操作主要使用Redis命令行工具(如`redis-cli`),并假设您已配置好基本集群环境。 #### 一、扩容操作流程 扩容涉及添加新节点(主节点或从节点)并迁移数据槽(slot),确保槽均匀分布。以下是具体步骤: 1. **准备新节点** 首先,创建新节点的配置文件和目录。例如,添加新节点7006和7007: ```bash mkdir 7006 7007 cp 7000/redis.conf 7006/redis.conf cp 7000/redis.conf 7007/redis.conf ``` 编辑配置文件(如`redis.conf`),修改端口、集群启用等参数,确保`cluster-enabled yes`。这为新节点提供基础环境[^4]。 2. **启动新节点并加入集群** 启动Redis实例: ```bash redis-server 7006/redis.conf redis-server 7007/redis.conf ``` 使用`redis-cli`将新节点加入集群: - 添加主节点: ```bash redis-cli --cluster add-node 新节点IP:端口 现有集群节点IP:端口 ``` 例如:`redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000` - 添加从节点(需指定主节点ID): ```bash redis-cli --cluster add-node 新节点IP:端口 现有集群节点IP:端口 --cluster-slave --cluster-master-id <主节点ID> ``` 例如:`redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 6164025849a8ff9297664fc835bc851af5004f61 -a密码` 此命令将新节点作为从节点附加到指定主节点,确保高可用[^2]。 3. **迁移数据槽** 新节点加入后,需迁移槽以实现数据均衡。使用`redis-cli --cluster reshard`命令: ```bash redis-cli --cluster reshard 现有集群节点IP:端口 --cluster-from <源节点ID> --cluster-to <目标节点ID> --cluster-slots <槽数> --cluster-yes ``` 例如:迁移100个槽从节点7000到新节点7006: `redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 源节点ID --cluster-to 新节点ID --cluster-slots 100 --cluster-yes` 工具会自动提示输入源节点和目标节点ID。迁移过程中,集群会保持可用,但建议在低峰期操作以减少性能影响[^5]。 为确保槽均匀分布,可使用`redis-cli --cluster rebalance`自动平衡槽。 4. **验证集群状态** 检查集群健康: ```bash redis-cli --cluster check 现有集群节点IP:端口 ``` 输出应显示所有节点状态正常,槽分布均匀。 #### 二、缩容操作流程 缩容需先迁移槽出节点,再移除节点,避免数据丢失。以下是具体步骤: 1. **迁移槽出目标节点** 使用`redis-cli --cluster reshard`将槽迁移到其他节点: ```bash redis-cli --cluster reshard 现有集群节点IP:端口 --cluster-from <目标节点ID> --cluster-to <其他节点ID> --cluster-slots <槽数> --cluster-yes ``` 例如:将节点7006的槽迁移到节点7000。重复此步骤,直到目标节点槽数为0。迁移完成后,检查槽分布:`redis-cli --cluster check`。 2. **移除节点** 确保目标节点无槽后,使用`del-node`命令移除: ```bash redis-cli --cluster del-node 现有集群节点IP:端口 <目标节点ID> ``` 例如:`redis-cli --cluster del-node 127.0.0.1:7000 cf9a0482286255e7aed399c489832e0384467dc9` 移除后,集群会自动更新拓扑[^3]。 3. **停止节点并清理** 停止Redis实例: ```bash redis-cli -p 7006 shutdown ``` 删除相关目录和配置文件。 #### 三、注意事项 - **数据迁移安全**:迁移槽时,确保集群健康(使用`redis-cli --cluster check`)。迁移过程可能阻塞操作,建议分批迁移(如每次100槽)并监控性能。如果迁移失败,数据可能不一致,需手动回滚[^5]。 - **槽均匀分布**:扩容后槽分布不均可能导致热点问题。使用`redis-cli --cluster rebalance`自动平衡槽,目标节点槽数差异不超过10%。 - **节点角色管理**:添加从节点时,必须指定有效主节点ID(可通过`CLUSTER NODES`命令获取)。移除节点前,确保它不是主节点(如有从节点,先处理从节点)。 - **集群规模限制**:Redis Cluster支持最多1000个节点,但实际中节点数过多影响性能。扩容时,新节点硬件配置应与现有节点一致。 - **网络和认证**:所有节点需互通,防火墙开放端口。使用`-a`参数处理密码认证(如引用[2]),避免连接失败。 - **备份与监控**:操作前备份集群数据(`SAVE`命令)。缩容后,检查内存和槽分布,确保无数据残留。 Redis Cluster通过动态分片实现横向扩展,解决了主从模式容量瓶颈的问题[^1]。如果您有具体配置或错误场景,可提供更多细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值