Redis集群

定义

Redis集群是一个提供在多个Redis节点间共享数据的程序集,可以支持多个Master。
在这里插入图片描述

作用

Redis集群支持多个Master,每个Master又可以挂在多个Slave,并且由于集群自带哨兵的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能。
客户端与Redis的节点连接,不再需要连接集群中所有的节点,只需要任意连接集群中的一个可用节点即可
槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点,插槽和数据之间的关系。

集群的算法-分片-槽位slot

集群的密钥空间被分为16384个槽,有效地设置了16384个主节点的集群大小上限(但是建议最大节点大小为1000个节点)
哈希槽实质是一个数组,数组[0, 2 ^ 14 - 1]形成hash slot空间,解决均匀分配问题,在数据和节点之间又加入了一层,把这层称为哈希槽,用于管理数据和节点之间的关系,槽解决的粒度问题,相当于把粒度变大了,便于数据移动。

Redis集群的数据分片:

集群没有使用一致性hash,而是引入哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
在这里插入图片描述
集群中每个redis实例都被认为是整个数据的一个分片,使用redis集群时我们会将存储的数据分散到多台redis机器上。
最大的优势就是方便扩容缩容和数据分派查找。

slot槽位映射,业界的三种解决方案

哈希取余分区

每次数据变动导致节点有变动,映射关系需要重新进行计算。
在这里插入图片描述

一致性哈希算法

提出一致性Hash解决方案,为了当服务器个数发生变动的时候尽量减少影响客户端到服务器的映射关系。
步骤1:
算法构建一致性哈希环
在这里插入图片描述
步骤2:
redis服务器IP节点映射
在这里插入图片描述
步骤3:
key落到服务器落键规则

在这里插入图片描述
优点:
加入和删除节点只影响哈希环中顺时针方向相邻的节点,对其他节点无影响。
容错性:
在这里插入图片描述
扩展性:
在这里插入图片描述
缺点:
数据分布与节点位置相关,因为这些节点不是均匀分布在哈希环上,所以数据进行存储时达不到均匀分布。
在这里插入图片描述

哈希槽分区

在这里插入图片描述
在这里插入图片描述
为什么槽的数量是16384
CRC16算法产生的hash值有16bit,该算法产生65535个值,但为什么不用65535呢

在这里插入图片描述
redis集群不保证强一致性,在特定条件下,redis集群可能会丢掉一些被系统收到的写入请求命令。

集群环境案例步骤

三主三从
在这里插入图片描述

新建6个独立的redis实例服务

比如6381配置:

bind 0.0.0.0
daemonize yes
protected-mode no
port 6381
logfile "/myredis/cluster/cluster6381.log"
pidfile /myredis/cluster6381.pid
dir /myredis/cluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111
 
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000

6382配置:

bind 0.0.0.0
daemonize yes
protected-mode no
port 6382
logfile "/myredis/cluster/cluster6382.log"
pidfile /myredis/cluster6382.pid
dir /myredis/cluster
dbfilename dump6382.rdb
appendonly yes
appendfilename "appendonly6382.aof"
requirepass 111111
masterauth 111111
 
cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 5000

开启它们的服务,比如
redis-server /myredis/cluster/redisCluster6381.conf

构建主从关系命令

–cluster-replicas表示为每个master创建一个slave节点
redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.111.175:6381 192.168.111.175:6382 192.168.111.172:6383 192.168.111.172:6384 192.168.111.174:6385 192.168.111.174:6386
在这里插入图片描述
一切都ok,三主三从搞定
在这里插入图片描述

链接进入6381作为切入点,查看并检验集群状态

redis-cli -a 111111 6381
info replication
在这里插入图片描述
cluster nodes
查看集群信息
在这里插入图片描述
cluster info
在这里插入图片描述

三主三从redis集群读写

注意槽位的范围区间,需要路由到位
在这里插入图片描述
在这里插入图片描述
防止出现这种错误,加入参数-c,优化路由。
redis-cli -a 111111 -p 6381 -c
在这里插入图片描述
查看某个key该属于对应的槽位值CLUSTER KEYSLOT键名称
cluster keyslot k1
在这里插入图片描述

主从切换迁移案例

主6381和从机切换,先停止主机6381,6381主机停了,对应的真实从机上位。
6381原来的主机回来了,是否会上位?
恢复前:
在这里插入图片描述
恢复后:
6381不会上位并从节点形式回归
在这里插入图片描述
集群不保证数据一致性百分之百OK,一定会有数据丢失情况。
上面一换后6381和6384主从对调了,该怎么给它调回来?
重新登录6381机器后,使用命令CLUSTER FAILOVER
在这里插入图片描述

主从扩容案例

首先新建6387和6388两个服务实例配置文件+新建后启动:
vim /myredis/cluster/redisCluster6387.conf

bind 0.0.0.0
daemonize yes
protected-mode no
port 6387
logfile "/myredis/cluster/cluster6387.log"
pidfile /myredis/cluster6387.pid
dir /myredis/cluster
dbfilename dump6387.rdb
appendonly yes
appendfilename "appendonly6387.aof"
requirepass 111111
masterauth 111111

cluster-enabled yes
cluster-config-file nodes-6387.conf
cluster-node-timeout 5000

vim /myredis/cluster/redisCluster6388.conf


bind 0.0.0.0
daemonize yes
protected-mode no
port 6388
logfile "/myredis/cluster/cluster6388.log"
pidfile /myredis/cluster6388.pid
dir /myredis/cluster
dbfilename dump6388.rdb
appendonly yes
appendfilename "appendonly6388.aof"
requirepass 111111
masterauth 111111
 
cluster-enabled yes
cluster-config-file nodes-6388.conf
cluster-node-timeout 5000

启动这两个实例
将新增的6387节点作为master节点加入原集群:
redis-cli -a 111111 --cluster add-node 192.168.111.174:6387 192.168.111.175:6381
在这里插入图片描述
检查集群情况第一次:
redis-cli -a 111111 --cluster check 192.168.111.175:6381
在这里插入图片描述
重新分配槽号:
redis -cli -a 111111 --cluster reshard 192.168.111.175:6381
在这里插入图片描述
在这里插入图片描述
再检查一次:
在这里插入图片描述
为主节点6387分配从节点6388:
在这里插入图片描述
检查集群第三次:
在这里插入图片描述

主从缩容案例

目的:6387和6388下线
检查集群情况第一次,先获得从机6388的节点ID:
在这里插入图片描述
从集群中将4号从节点6388删除:
redis-cli -a 111111 --cluster del-node 192.168.111.174:6388 218e7b8b4f81be54ff173e4776b4f4faaf7c13da
在这里插入图片描述
将6387的槽清空,重新分配,本例将清出来的槽号都给6381
redis-cli -a 111111 --cluster reshard 192.168.111.175:6381
在这里插入图片描述
在这里插入图片描述
检查集群第二次:
在这里插入图片描述
删除6387:
在这里插入图片描述
检查集群情况第三次,6387/6388被彻底去除
在这里插入图片描述
在这里插入图片描述

集群常用命令和CRC16算法分析

不在同一个槽位下的键值无法使用mset,mget等多键操作,但可以通过{}来定义同一个组的概念,使key中{}内相同内容的键值对放到一个slot槽位去。
在这里插入图片描述
redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每一个节点负责一部分hash槽。
常用的命令有:
cluster-require-full-coverage yes
在这里插入图片描述
CLUSTER COUNTKEYSINSLOT 槽位数字编号
1表示该槽位被占用,0表示该槽位没占用
ClUSTER KEYSLOT 键名称
该键应该存在哪个槽位上

### Redis 集群的搭建与配置 #### 一、Redis 集群简介 Redis 是一种高性能的键值存储系统,支持多种数据结构操作。通过集群模式可以实现分布式存储和高可用性。Redis 集群允许多个 Redis 实例协同工作,提供更高的吞吐量和更强的数据持久化能力。 --- #### 二、环境准备 在开始之前,需确认以下条件已满足: - 所有服务器的操作系统版本一致(如 CentOS 7 或 Windows),并安装了相同版本的 Redis 软件。 - 已关闭防火墙或开放必要的端口(默认 Redis 使用 6379 及其衍生端口)。 - 每台服务器上至少有两个 Redis 实例运行,分别作为主节点和从节点[^1]。 --- #### 三、具体步骤 ##### 1. 下载并解压 Redis 文件 下载指定版本的 Redis 压缩包(如 Redis 6.2.5 或更高版本),将其解压到目标路径下。例如,在 Linux 中执行以下命令: ```bash wget http://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5.tar.gz cd redis-6.2.5 make ``` ##### 2. 创建多个实例目录 为每个 Redis 实例创建独立的工作目录,并复制 `redis.conf` 至对应文件夹中。例如: ```bash mkdir -p /service/redis/{6379,6380} cp redis.conf /service/redis/6379/ cp redis.conf /service/redis/6380/ ``` ##### 3. 修改配置文件 编辑每个实例下的 `redis.conf` 文件,设置不同的监听端口号和其他必要参数。以下是关键配置项: - 设置绑定 IP 地址:`bind 0.0.0.0` - 关闭保护模式:`protected-mode no` - 开启集群功能:`cluster-enabled yes` - 指定集群配置文件位置:`cluster-config-file nodes-{port}.conf` - 设定日志级别:`loglevel notice` ##### 4. 启动 Redis 实例 依次启动各个 Redis 实例。例如: ```bash redis-server /service/redis/6379/redis.conf redis-server /service/redis/6380/redis.conf ``` 如果是在多台物理机上部署,则需要远程登录每台机器重复上述过程[^2]。 ##### 5. 构建集群拓扑 利用 `redis-cli` 的集群管理工具完成初始化操作。假设当前存在六个节点分布在三台主机上,则可输入如下指令构建集群关系: ```bash redis-cli --cluster create \ 192.168.x.y:6379 192.168.x.z:6379 ... \ --replicas 1 ``` 其中 `--replicas` 参数表示每个主节点分配几个副本[^4]。 ##### 6. 验证集群状态 最后可以通过以下方式验证集群是否正常运作: ```bash redis-cli -c -h {任意IP} -p {任一口号} CLUSTER INFO CLUSTER NODES PING SET key value GET key ``` --- #### 四、注意事项 - 如果使用 Docker 容器来部署 Redis 集群,请确保容器间网络互通良好。 - 对于 Windows 平台上的开发测试场景,可通过批处理脚本来简化服务启动流程[^3]。 --- #### 五、示例代码片段 下面展示了一个简单的 Python 程序用于连接至 Redis 集群并向其中写入一条记录: ```python import redis r = redis.StrictRedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "6379"}], decode_responses=True) r.set('foo', 'bar') print(r.get('foo')) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙崎流河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值