Redis集群

13 篇文章 0 订阅

4、Redis集群

4.1、背景

随着业务的发展,单个Redis节点已经无法满足大量数据和请求的需求,并发量太大,单个节点已经达到瓶颈,且单个节点的性能也逐渐降低,此时由于集群的出现,刚好解决了这些问题。

4.2、何为集群

Redis集群是一种高可用性、分布式的Redis部署方式,它将多个Redis节点组成一个逻辑上统一的集群,用于提供可扩展性、负载均衡和故障容错等功能。

在Redis集群中,数据被分片(sharding)存储在不同的节点上,并通过内置的数据分布算法将数据均匀地分配到各个节点上。每个节点都可以独立处理部分数据集和请求,从而保证系统的吞吐量和扩展性。

在Redis集群中,节点分为两种角色:

  1. 主节点(master):负责存储数据分片的主份,并处理读写请求。
  2. 从节点(slave):通过复制主节点的数据,提供读服务,并在主节点发生故障时,可以升级为新的主节点。

Redis集群使用的是无中心架构,不依赖于中心协调节点,每个节点都通过gossip协议进行相互通信,共同维护集群的状态和拓扑信息。

4.3 、集群特点

  1. 数据自动分片:集群自动将数据分布到不同的节点上,实现数据的均衡存储和负载均衡。
  2. 自动故障转移:当主节点发生故障时,集群会自动进行故障检测,并将从节点升级为新的主节点,以保证系统的可用性。
  3. 内部通信协议:集群使用Gossip协议进行节点之间的通信和状态更新,确保集群的一致性和高效性。
  4. 客户端路由:客户端可以通过集群提供的路由机制,自动将请求发送到正确的节点上,实现透明访问。
  5. 负载均衡:在Redis集群中,数据和请求会自动分布到不同的节点上,实现负载均衡。这样可以避免单个节点过载,提高系统的稳定性和性能。
  6. 扩展性好:通过使用Redis集群,可以便利地扩展系统的容量和性能,将数据和请求分布在多个节点上,提高整体系统的吞吐量和承载能力。
  7. 高可用性:通过Redis集群,可以将数据分布到多个节点上,实现数据的冗余备份和容错能力。当部分节点不可用时,集群仍然可以继续提供服务,保证系统的可用性。

4.4、集群搭建

采用简单的集群搭建:三主三从,即每个主节点(Master)下面挂一个从节点(slave)

真实成产环境中建议主机和从机不要放在同一网段同一服务器下面

角色地址端口
Master(主机)192.168.12.96379
Master(主机)192.168.12.96384
Master(主机)192.168.12.96385
Slave(从机)192.168.12.96380
Slave(从机)192.168.12.96381
Slave(从机)192.168.12.96383

在这里插入图片描述

1.为了方便统一管理,建议新建一个目录,把配置文件都放在同一个文件夹下面

mkdir ccluster
chmod 777 cluster
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9 # 方便演示,停止所有的redis

2.复制原始的redis.conf配置文件到刚才创建的目录下

cp /opt/redis-6.2.12/redis.conf   /opt/redis-6.2.12/cluster/

3.创建msater1(端口:6379)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建master的配置文件 redis-6379.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6379.log
##端口
port 6379
##rdb文件
dbfilename dump_6379.rdb
#pid文件
pidfile /var/run/redis_6379.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6379.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

4.创建msater2(端口:6384)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建master的配置文件 redis-6384.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6384.log
##端口
port 6384
##rdb文件
dbfilename dump_6384.rdb
#pid文件
pidfile /var/run/redis_6384.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6384.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

5.创建msater3(端口:6385)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建master的配置文件 redis-6385.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6385.log
##端口
port 6385
##rdb文件
dbfilename dump_6385.rdb
#pid文件
pidfile /var/run/redis_6385.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6385.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

6.创建slave1(端口:6380)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建slave的配置文件 redis-6380.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6380.log
##端口
port 6380
##rdb文件
dbfilename dump_6380.rdb
#pid文件
pidfile /var/run/redis_6380.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6380.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

7.创建slave2(端口:6381)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建slave的配置文件 redis-6381.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6381.log
##端口
port 6381
##rdb文件
dbfilename dump_6381.rdb
#pid文件
pidfile /var/run/redis_6381.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6381.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

8.创建slave3(端口:6383)的配置文件

在/opt/redis-6.2.12/cluster/目录下创建slave的配置文件 redis-6383.conf

#复用原始的配置文件
include /opt/redis-6.2.12/cluster/redis.conf
#后台运行
daemonize yes
#IP地址
bind 127.0.0.1
#配置密码
#requirepass 123456
dir /opt/redis-6.2.12/cluster/
logfile /opt/redis-6.2.12/cluster/6383.log
##端口
port 6383
##rdb文件
dbfilename dump_6383.rdb
#pid文件
pidfile /var/run/redis_6383.pid
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6383.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 60000

配置文件中一定不能设置密码,否则在创建集群时会报错:[ERR] Node 127.0.0.1:6379 NOAUTH Authentication required.

9.启动maste和slave

# 方便演示,停止所有的redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
redis-server  /opt/redis-6.2.12/cluster/redis-6379.conf

redis-server  /opt/redis-6.2.12/cluster/redis-6384.conf

redis-server  /opt/redis-6.2.12/cluster/redis-6385.conf

redis-server  /opt/redis-6.2.12/cluster/redis-6380.conf

redis-server  /opt/redis-6.2.12/cluster/redis-6381.conf

redis-server  /opt/redis-6.2.12/cluster/redis-6383.conf

10.查看是否启动

ps -ef |grep redis

在这里插入图片描述

11.合体(组成集群)

redis-cli --cluster create --cluster-replicas 1
127.0.0.1:6379 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6383
合体的命令后面会跟上所有节点的ip:port列表,多个之间用空格隔开,注意ip 不要写127.0.0.1 ,要写真实ip
--cluster-replicas 1:表示采用最简单的方式配置集群,即每个master 配1个slave ,6个节点就形成了3主3从

在这里插入图片描述

在这里插入图片描述

12.连接集群节点,查看信息

#连接集群中的任意一个节点
redis-cli -h 127.0.0.1 -p 6379 -c
#查看集群信息
cluster nodes

后面的参数 -c代表集群

在这里插入图片描述

从这里也可以看出该节点的信息

在这里插入图片描述

4.5 、何为槽(slots)

在Redis集群中,槽(slot)是指将数据分片存储和管理的最小单位。Redis集群使用哈希槽分片技术,将数据分散存储在不同的节点上,每个节点负责管理一部分槽。

具体来说,Redis集群将整个数据key空间分成16384个槽,每个槽可以存储一个或多个数据key。当数据被写入或读取时,Redis根据key的哈希值将其映射到对应的槽上,然后再将槽分配给不同的节点进行存储和处理。

在这里插入图片描述

节点槽位范围
master1( 端口:6379)[0-5460] ,插槽的位置从0开始的,0表示第1个插槽
master1( 端口:6384)[5460-10922]
master1( 端口:6385)[10923-16383]
slave(端口:6380) slave(端口:6381) slave(端口:6383)从节点没有槽位,slave 是用来对master 做替补的, 即当主节点挂了,变成主节点(反客为主)

即数据库中的每个key 都属于16384个slots中的其中1个,当通过key 读写数据的时候,redis 需要先根据key 计算出key 对应的slots,然后根据slots和master 的映射关系找到对应的redis 节点,key 对应的数据就在这个节点上面。

集群中使用公式 CRC16(key)%16384 计算key 属于哪个槽

4.6、槽(slots)的作用

通过使用槽的分片机制,Redis集群实现了数据的分布式存储和负载均衡。每个节点负责管理一部分槽,可以独立地进行数据存储和处理,从而提高系统的吞吐量和扩展性。

在Redis集群中,槽有以下特性:

  1. 槽的分配和迁移:当集群中有新的节点加入或有节点离开时,槽的分配和迁移会自动进行。Redis集群使用特定的算法(比如哈希槽映射)来决定槽的分配和迁移策略。

  2. 主从复制关系:每个槽都有一个主节点,同时可以有零个或多个从节点(副本)。主节点负责处理该槽的写入和读取请求,并通过复制机制将数据同步到从节点。

  3. 槽的状态:槽有三种状态:未指派(unassigned)、指派给主节点(assigned)和指派给从节点(migrating)。这些状态变化主要用于集群管理和槽的迁移操作。

通过槽的分片机制,Redis集群实现了数据的分布和负载均衡,提高了系统的性能和可扩展性。同时,槽的自动分配和迁移使得集群在节点动态变化时能够自适应地进行资源分配和重新平衡。

4.7、 验证槽(slot)

1.在 配置集群模式的情况下, 每次录入、查询键值,redis 都会计算key 对应的插槽,如果不是当前redis 节点的插槽,且没有采用集群的方式连接,即在连接命令后没有加-c,那么redis 会报错,并告知应前往的redis 实例地址和端口,效果如下

在这里插入图片描述

此时如果加上 -c 就会自动转发

在这里插入图片描述

2.分组

不在同一个slot下面,不能使用mset mget

在这里插入图片描述

如果想使用,可以加上组的概念,及{}

在这里插入图片描述
Reid哨兵模式:元婴之境

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值