百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis Cluster 部署、在线扩容、缩容、迁移、集群管理实践笔记

mhr18 2024-11-18 14:30 34 浏览 0 评论

概述

Redis 分片集群是为了应对业务增长带来的数据增长, 实现在线动态横向扩缩容,集群中的每个分片主节点处理 16384 个哈希槽的一个子集; 为了稳定也可以进行高可用部署, 即将各分片节点启用一个或多个副本节点; 当分片主节点挂掉,其对应的副本节点自动提升为新主节点,当原主节点重新上线后,自动成为新主节点的副本节点; 当一对分片主从节点都故障时,整个集群不能正常工作,需要人工介入恢复启动故障节点

分片集群

1、创建一个有 3 个分片节点的集群

# 创建具有 3 个分片节点的集群、每个分片有 1 个副本
# redis-cli --cluster create 192.168.31.17:6384 192.168.31.18:6384 192.168.31.19:6384 --cluster-replicas 1

# 创建具有 3 个分片节点的集群, 每个分片默认无副本
redis-cli --cluster create 192.168.31.17:6384 192.168.31.18:6384 192.168.31.19:6384
> >>> Performing hash slots allocation on 3 nodes...
> Master[0] -> Slots 0 - 5460
> Master[1] -> Slots 5461 - 10922
> Master[2] -> Slots 10923 - 16383
> M: 1db08d1048b20b22dfbf5c5d724d95f46a843d29 192.168.31.17:6384
>    slots:[0-5460] (5461 slots) master
> M: 3f9d82efdf04bb5fcf3741de4ea9314925bbeefd 192.168.31.18:6384
>    slots:[5461-10922] (5462 slots) master
> M: 16a0c6947fcb7d498b7c96aa5b5a70491298e966 192.168.31.19:6384
>    slots:[10923-16383] (5461 slots) master
> Can I set the above configuration? (type 'yes' to accept): yes
> >>> Nodes configuration updated
> >>> Assign a different config epoch to each node
> >>> Sending CLUSTER MEET messages to join the cluster
> Waiting for the cluster to join
> ..
> >>> Performing Cluster Check (using node 192.168.31.17:6384)
> M: 1db08d1048b20b22dfbf5c5d724d95f46a843d29 192.168.31.17:6384
>    slots:[0-5460] (5461 slots) master
> M: 16a0c6947fcb7d498b7c96aa5b5a70491298e966 192.168.31.19:6384
>    slots:[10923-16383] (5461 slots) master
> M: 3f9d82efdf04bb5fcf3741de4ea9314925bbeefd 192.168.31.18:6384
>    slots:[5461-10922] (5462 slots) master
> [OK] All nodes agree about slots configuration.
> >>> Check for open slots...
> >>> Check slots coverage...
> [OK] All 16384 slots covered.

验证

1、查看指定 redis 节点状态(包括键数、内存使用量、请求数、连接数等)

redis-cli --stat -p 6384 -h 192.168.31.17
> ------- data ------ --------------------- load -------------------- - child -
> keys       mem      clients blocked requests            connections
> 30022      9.25M    2       0       30518 (+2)          59
> 30022      9.25M    2       0       30520 (+2)          59
> 30022      9.25M    2       0       30522 (+2)          59
> 30022      9.25M    2       0       30524 (+2)          59
> 30022      9.25M    2       0       30526 (+2)          59
> 30022      9.25M    2       0       30528 (+2)          59
> 30022      9.25M    2       0       30530 (+2)          59

2、查看各主节点哈希槽、键的分布情况, 以及副本数、键总数

redis-cli --cluster info 192.168.31.17:6384
> 192.168.31.18:6384 (79c19006...) -> 49888 keys | 5462 slots | 1 slaves.
> 192.168.31.17:6385 (3faafe60...) -> 50115 keys | 5461 slots | 1 slaves.
> 192.168.31.19:6384 (df7d9f8e...) -> 49995 keys | 5461 slots | 1 slaves.
> [OK] 149998 keys in 3 masters.
> 9.16 keys per slot on average.

集群管理

1、redis-cli 交互式命令行

redis-cli -p 6384 -h 192.168.31.17
# 查看集群节点信息
cluster nodes

# meet 添加节点, 任意节点执行即可
cluster meet 192.168.31.17 6385

# forget 根据节点 ID 删除节点, 需要在所有节点执行该命令
cluster forget 82d14741e161d07012783ae7c9bf1ef20ddc28a0

# 将当前 cluster 节点配置为指定主节点(1db08d1048b20b22dfbf5c5d724d95f46a843d29)的副本节点
cluster replicate 1db08d1048b20b22dfbf5c5d724d95f46a843d29

# 查看指定 master 节点(1db08d1048b20b22dfbf5c5d724d95f46a843d29)的副本节点
cluster replicas 1db08d1048b20b22dfbf5c5d724d95f46a843d29

cluster reset   # 重置当前节点集群状态文件 nodes.conf

2、redis-cli --cluster 子命令

# 在集群中所有节点上执行命令 client list
redis-cli --cluster call 192.168.31.17:6384 client list

# 将节点 192.168.31.17:6385 添加为新的主节点, 需要从其它主节点迁移部分槽位到该新主节点才能正常工作
redis-cli --cluster add-node 192.168.31.17:6385 192.168.31.17:6384

# 将节点 192.168.31.17:6385 添加为主节点(1db08d1048b20b22dfbf5c5d724d95f46a843d29)的从节点
redis-cli --cluster add-node 192.168.31.17:6385 192.168.31.17:6384 --cluster-slave --cluster-master-id 1db08d1048b20b22dfbf5c5d724d95f46a843d29

# 删除节点 82d14741e161d07012783ae7c9bf1ef20ddc28a0 且关闭该节点
redis-cli --cluster del-node 192.168.31.17:6384 82d14741e161d07012783ae7c9bf1ef20ddc28a0

# 从指定节点迁移 1024 个槽位到目标节点 073ad3a6dfe64289be66c6d8e302b29afc4b0ec7
redis-cli --cluster reshard 192.168.31.17:6385 --cluster-from 1db08d1048b20b22dfbf5c5d724d95f46a843d29 --cluster-to 073ad3a6dfe64289be66c6d8e302b29afc4b0ec7 --cluster-slots 1024

# 使用如下命令, 进入交互式输入对应参数值进行节点间的槽位迁移
redis-cli --cluster reshard 192.168.31.17:6384

# 当各节点槽位不均衡时,执行该命令、自动均衡各节点槽位 slots
redis-cli --cluster rebalance 192.168.31.17:6384

扩容

1、集群主节点扩容, 由 3 个主节点扩展到 5 个主节点

// 添加新节点 192.168.31.{18,19}:6386
redis-cli --cluster add-node 192.168.31.18:6386 192.168.31.17:6384
redis-cli --cluster add-node 192.168.31.19:6386 192.168.31.17:6384
// 自动平衡集群各主节点哈希槽的分布
redis-cli --cluster rebalance 192.168.31.17:6384 --cluster-use-empty-masters
redis-cli --cluster info 192.168.31.17:6384
> 192.168.31.18:6386 (c64357f2...) -> 29894 keys | 3278 slots | 0 slaves.
> 192.168.31.18:6384 (79c19006...) -> 29927 keys | 3276 slots | 1 slaves.
> 192.168.31.17:6385 (3faafe60...) -> 29835 keys | 3276 slots | 1 slaves.
> 192.168.31.19:6384 (df7d9f8e...) -> 30083 keys | 3276 slots | 1 slaves.
> 192.168.31.19:6386 (a0f71de7...) -> 30259 keys | 3278 slots | 0 slaves.
> [OK] 149998 keys in 5 masters.
> 9.16 keys per slot on average.

缩容

1、集群主节点扩容, 由 5 个主节点扩展到 3 个主节点

// 迁移节点 192.168.31.18:6386 的哈希槽
redis-cli --cluster reshard 192.168.31.17:6384 \
--cluster-from c64357f288902d1209fdf91f4804bf13b2a59fcf \
--cluster-to  79c19006ae3dcd12522090ddcc2b5b917b0feb2a \
--cluster-slots 3278 \
--cluster-yes

// 迁移节点 192.168.31.19:6386 的哈希槽
redis-cli --cluster reshard 192.168.31.17:6384 \
--cluster-from a0f71de78c2355f99de2b4c19796afb02e23c623 \
--cluster-to  df7d9f8e2d7dbad37bdd1094c2770d1feabbd228 \
--cluster-slots 3278 \
--cluster-yes

// 查看各主节点哈希槽、键的分布情况
redis-cli --cluster info 192.168.31.17:6384
> 192.168.31.18:6386 (c64357f2...) -> 0 keys | 0 slots | 0 slaves.
> 192.168.31.18:6384 (79c19006...) -> 59821 keys | 6554 slots | 1 slaves.
> 192.168.31.17:6385 (3faafe60...) -> 29835 keys | 3276 slots | 1 slaves.
> 192.168.31.19:6384 (df7d9f8e...) -> 60342 keys | 6554 slots | 1 slaves.
> 192.168.31.19:6386 (a0f71de7...) -> 0 keys | 0 slots | 0 slaves.
> [OK] 149998 keys in 5 masters.
> 9.16 keys per slot on average.

// 自动平衡集群各主节点哈希槽的分布
redis-cli --cluster rebalance 192.168.31.17:6384

// 删除节点 192.168.31.{18,19}:6386
redis-cli --cluster del-node 192.168.31.17:6384 c64357f288902d1209fdf91f4804bf13b2a59fcf
redis-cli --cluster del-node 192.168.31.17:6384 a0f71de78c2355f99de2b4c19796afb02e23c623

// 查看各主节点哈希槽、键的分布情况
redis-cli --cluster info 192.168.31.17:6384
> 192.168.31.18:6384 (79c19006...) -> 49762 keys | 5461 slots | 1 slaves.
> 192.168.31.17:6385 (3faafe60...) -> 50060 keys | 5462 slots | 1 slaves.
> 192.168.31.19:6384 (df7d9f8e...) -> 50176 keys | 5461 slots | 1 slaves.
> [OK] 149998 keys in 3 masters.
> 9.16 keys per slot on average.

迁移

Redis-shake 是一个用于在两个 Redis 之间同步数据的工具,支持 Redis Cluster 的在线迁移与离线迁移(备份文件导入) 支持解析、恢复、备份、同步四个功能

1、在线迁移

首次全量同步,然后进行增量的拉取(通过 psync 命令)

# 创建迁移目标 redis 集群
redis-cli --cluster create 192.168.31.17:6386 192.168.31.18:6386 192.168.31.19:6386

# cat redis-shake.conf 源及目标端主要配置项, 其它配置项默认即可
source.type: cluster
# master 可改为 slave, 表示从副本同步数据到目标端, 192.168.31.19 为任意源端 redis 节点
source.address: master@192.168.31.19:6384
target.type: cluster
target.address: master@192.168.31.19:6386

./redis-shake -type sync -conf redis-shake.conf

2、离线迁移

适用于源实例与目标实例的网络无法连通的场景,或源端实例部署在其他云厂商 Redis 服务中,无法实现在线迁移

# cat redis-shake.conf 源及目标端主要配置项, 其它配置项默认即可
source.address: master@192.168.31.19:6384
# restore 导入数据时指定的备份文件
source.rdb.input: local_dump.0;local_dump.1;local_dump.2
target.type: cluster
target.address: master@192.168.31.19:6386

备份: ./redis-shake -type dump -conf redis-shake.conf

恢复: ./redis-shake -type restore -conf redis-shake.conf

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: