redis 集群配置

news2025/2/26 6:18:50

1 . 存在的问题

  1. 单台redis容量限制,如何进行扩容?继续加内存、加硬件么?
  2. 单台redis并发写量太大有性能瓶颈,如何解决?
  3. redis3.0中提供了集群可以解决这些问题。

2 . 什么是集群

redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节 点存储总数据的1/N。

如下图:由3台master和3台slave组成的redis集群,每台master承接客户端三分之一请求和写入的数
据,当master挂掉后,slave会自动替代master,做到高可用。
在这里插入图片描述

3 . 集群如何配置?

3.1 需求:

配置3主3从集群 下面我们来配置一个3主3从的集群,每个主下面挂一个slave,master挂掉后,slave会被提升为 master。

为了方便,我们在一台机器上进行模拟,我的机器ip是:192.168.200.129,通过端口来区分6个不同的 节点,配置信息如下
在这里插入图片描述

3.2 创建案例工作目录:cluster

执行下面命令创建 /opt/cluster 目录,本次所有操作,均在 cluster 目录进行。

# 方便演示,停止所有的redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
mkdir /opt/cluster
cd /opt/cluster/
3.3 将redis.conf复制到cluster目录

redis.conf 是redis默认配置文件

cp /opt/redis-6.2.1/redis.conf /opt/cluster/
3.4 创建master1的配置文件:redis-6379.conf

在/opt/cluster目录创建 redis-6379.conf 文件,内容如下,注192.168.200.129 是这个测试机器的 ip,大家需要替换为自己的

include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile "./6379.log"
#开启集群设置
cluster-enabled yes
#设置节点配置文件
cluster-config-file node-6379.conf
#设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
// An highlighted block
var foo = 'bar';
3.5 创建master2的配置文件:redis-6380.conf

在/opt/cluster目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,只是将6379换成 6380了

include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile "./6380.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6380.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
3.6 创建master3的配置文件:redis-6381.conf

在/opt/cluster目录创建 redis-6381.conf 文件,内容如下

include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile "./6381.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6381.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
3.7 创建slave1的配置文件:redis-6389.conf

在/opt/cluster目录创建 redis-6389.conf 文件,内容如下

include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6389
dbfilename dump_6389.rdb
pidfile /var/run/redis_6389.pid
logfile "./6389.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6389.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
3.8 创建slave2的配置文件:redis-6390.conf

在/opt/cluster目录创建 redis-6390.conf 文件,内容如下

// An highlighted block
include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6390
dbfilename dump_6390.rdb
pidfile /var/run/redis_6390.pid
logfile "./6390.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6390.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
3.9 创建slave3的配置文件:redis-6391.conf

在/opt/cluster目录创建 redis-6391.conf 文件,内容如下

include /opt/cluster/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/cluster/
port 6391
dbfilename dump_6391.rdb
pidfile /var/run/redis_6391.pid
logfile "./6391.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6391.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

4 . 启动master、slave1、slave2

# 方便演示,停止所有的redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
# 下面启动6个redis
redis-server /opt/cluster/redis-6379.conf
redis-server /opt/cluster/redis-6380.conf
redis-server /opt/cluster/redis-6381.conf
redis-server /opt/cluster/redis-6389.conf
redis-server /opt/cluster/redis-6390.conf
redis-server /opt/cluster/redis-6391.conf

5 . 查看6个redis的启动情况

ps -ef | grep redis

在这里插入图片描述

6 . 确保node-xxxx.conf文件已正常生成

稍后我们会将6个实例合并到一个集群,在组合之前,我们要确保6个redis实例启动后,nodesxxxx.conf文件都生成正常,如下,
/opt/cluster 目录中确实都生成成功了
在这里插入图片描述

7 . 将6个节点合成一个集群

执行下面命令,将6个redis合体

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

执行过程如下,期间会让我们确定是否同样这样的分配方式,输入:yes,然后等几秒,集群合体成功

[root@hspEdu01 src]# redis-cli --cluster create --cluster-replicas 1
192.168.200.129:6379 192.168.200.129:6380 192.168.200.129:6381
192.168.200.129:6389 192.168.200.129:6390 192.168.200.129:6391
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.200.129:6390 to 192.168.200.129:6379
Adding replica 192.168.200.129:6391 to 192.168.200.129:6380
Adding replica 192.168.200.129:6389 to 192.168.200.129:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ccf3abb791e026380ad3ad2a166aa788df738437 192.168.200.129:6379
slots:[0-5460] (5461 slots) master
M: 3c372392d5a91dad64a6febadfe9524ea2cbd8c0 192.168.200.129:6380
slots:[5461-10922] (5462 slots) master
M: 2c905be9c975be367bd66c962167beca1ef66af3 192.168.200.129:6381
slots:[10923-16383] (5461 slots) master
S: 4a0f860081b969162767aac26801994de54d80a5 192.168.200.129:6389
replicates ccf3abb791e026380ad3ad2a166aa788df738437
S: 62c9f37a362459c212e8af6dd744b6562f5fe6a7 192.168.200.129:6390
replicates 3c372392d5a91dad64a6febadfe9524ea2cbd8c0
S: a2f89efc09681520f9d9502707b18e1f46a40b90 192.168.200.129:6391
replicates 2c905be9c975be367bd66c962167beca1ef66af3
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.200.129:6379)
M: ccf3abb791e026380ad3ad2a166aa788df738437 192.168.200.129:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 2c905be9c975be367bd66c962167beca1ef66af3 192.168.200.129:6381
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 62c9f37a362459c212e8af6dd744b6562f5fe6a7 192.168.200.129:6390
slots: (0 slots) slave
replicates 3c372392d5a91dad64a6febadfe9524ea2cbd8c0
M: 3c372392d5a91dad64a6febadfe9524ea2cbd8c0 192.168.200.129:6380
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 4a0f860081b969162767aac26801994de54d80a5 192.168.200.129:6389
slots: (0 slots) slave
replicates ccf3abb791e026380ad3ad2a166aa788df738437
S: a2f89efc09681520f9d9502707b18e1f46a40b90 192.168.200.129:6391
slots: (0 slots) slave
replicates 2c905be9c975be367bd66c962167beca1ef66af3
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

8 . 连接集群节点,查看集群信息:cluster nodes

需要使用 redis-cli -c 命令连接集群中6个节点中任何一个节点都可以,注意和之前的连接参数有点不 同 redis-cli
命令后面多了一个 -c 参数,表示采用集群的方式连接,连上以后,然后使用 cluster nodes 可以查看集群节点信息,如下

192.168.200.129:6379> cluster nodes
2c905be9c975be367bd66c962167beca1ef66af3 192.168.200.129:6381@16381 master - 0
1650194157604 3 connected 10923-16383
62c9f37a362459c212e8af6dd744b6562f5fe6a7 192.168.200.129:6390@16390 slave
3c372392d5a91dad64a6febadfe9524ea2cbd8c0 0 1650194158611 2 connected
3c372392d5a91dad64a6febadfe9524ea2cbd8c0 192.168.200.129:6380@16380 master - 0
1650194158000 2 connected 5461-10922
4a0f860081b969162767aac26801994de54d80a5 192.168.200.129:6389@16389 slave
ccf3abb791e026380ad3ad2a166aa788df738437 0 1650194156000 1 connected
ccf3abb791e026380ad3ad2a166aa788df738437 192.168.200.129:6379@16379
myself,master - 0 1650194157000 1 connected 0-5460
a2f89efc09681520f9d9502707b18e1f46a40b90 192.168.200.129:6391@16391 slave
2c905be9c975be367bd66c962167beca1ef66af3 0 1650194159617 3 connected
192.168.200.129:6379>

如下图,对 cluster nodes 的结果做下解释,先看下红字的注释,集群中的每个节点都会生成一个ID,
这个ID信息会被写到node-xxxx.conf文件中,为什么要生成id呢?
因为节点的ip和端口可能会发生变化,但是节点的ID是不会变的,其他节点可以通过其他节点的ID来认 识各个节点

。

9 . 验证集群数据的读写操作

如下,我们连接 6379 这个节点,然后执行一个set操作,效果如下,写入成功

[root@hspEdu01 cluster]# redis-cli -c -h 192.168.200.129 -p 6379
192.168.200.129:6379> set name ready
-> Redirected to slot [5798] located at 192.168.200.129:6380
OK
192.168.200.129:6380>

大家可能注意到了,我们明明在 6379 上操作的,但是请求被转发到了6380这个节点去处理了,这里就
是我们后面要说的slot的知识了,先向后看。

10 . redis集群如何分配这6个节点?

  1. 一个集群至少有3个主节点,因为新master的选举需要大于半数的集群master节点同意才能选举成功,
  2. 如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。
  3. 选项–cluster-replicas 1表示我们希望为集群中的每个主节点创建一个从节点。
  4. 分配原则尽量保证每个主库运行在不同的ip,每个主库和从库不在一个ip上,这样才能做到高可用。

11 . 什么是slots(槽)

如下图,咱们再来看看集群合并的过程中输出的一些信息
在这里插入图片描述

Redis集群内部划分了16384个slots(插槽),合并的时候,会将每个slots映射到一个master上面,比
如上面3个master和slots的关系如下:
在这里插入图片描述

而数据库中的每个key都属于16384个slots中的其中1个,当通过key读写数据的时候,redis需要先根据
key计算出key对应的slots,然后根据slots和master的映射关系找到对应的redis节点,key对应的数据 就在这个节点上面。
集群中使用公式 CRC16(key)%16384 计算key属于哪个槽

12 . 在集群中录入值

在 redis-cli 每次录入、查询键值,redis都会计算key对应的插槽,如果不是当前redis节点的插槽,
redis会报错,并告知应前往的redis实例地址和端口,效果如下,我们连接了6379这个实例来操作k1,
这个节点发现k1的槽位在6381上面,返回了错误信息,怎么办呢?

[root@hspEdu01 cluster]# redis-cli -h 192.168.200.129 -p 6379
192.168.200.129:6379> set k1 v1
(error) MOVED 12706 192.168.200.129:6381

使用redis-cli客户端提供了-c参数可以解决这个问题,表示以集群方式执行,执行命令的时候当前节点处
理不了的时候,会自动将请求重定向到目标节点,效果如下,被重定向到6381了

[root@hspEdu01 cluster]# redis-cli -c -h 192.168.200.129 -p 6379
192.168.200.129:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.200.129:6381
OK
192.168.200.129:6381>

同样,执行get会被重定向,效果如下

[root@hspEdu01 cluster]# redis-cli -c -h 192.168.200.129 -p 6379
192.168.200.129:6379> get k1
-> Redirected to slot [12706] located at 192.168.200.129:6381
"v1"
192.168.200.129:6381>

不在一个slot下面,不能使用mget、mset等多键操作,效果如

192.168.200.129:6381> mset k1 v1 k2 v2
(error) CROSSSLOT Keys in request don't hash to the same slot
192.168.200.129:6381> mget k1 k2
(error) CROSSSLOT Keys in request don't hash to the same slot

可以通过{}来定义组的概念,从而使key中{}内相同的键值放到一个slot中去,效果如下

192.168.200.129:6381> mset k1{g1} v1 k2{g1} v2 k3{g1} v3
OK
192.168.200.129:6381> mget k1{g1} k2{g1} k3{g1}
1) "v1"
2) "v2"
3) "v3"

13 . slot相关的一些命令

cluster keyslot :计算key对应的slot
cluster coutkeysinslot :获取slot槽位中key的个数
cluster getkeysinslot 返回count个slot槽中的键

192.168.200.129:6381> cluster keyslot k1{g1}
(integer) 13519
192.168.200.129:6381> cluster countkeysinslot 13519
(integer) 3
192.168.200.129:6381> cluster getkeysinslot 13519 3
1) "k1{g1}"
2) "k2{g1}"
3) "k3{g1}"

14 . 故障恢复

如果主节点下线,从节点是否能够提升为主节点?注意:要等15秒
下面我们来试试,如下,连接master1,然后将master1停掉

[root@hspEdu01 cluster]# redis-cli -c -h 192.168.200.129 -p 6379
192.168.200.129:6379> shutdown
not connected>

执行下面命令,连接master1,看下集群节点的信息

redis-cli -c -h 192.168.200.129 -p 6380
cluster nodes

输出如下,可以看到slave1(6389)确实变成master了,而它原来的master:master1(6379)下线 了

在这里插入图片描述

下面我们再来启动6379,然后再看看集群变成什么样了,命令如下

[root@hspEdu01 cluster]# redis-server /opt/cluster/redis-6379.conf
[root@hspEdu01 cluster]# redis-cli -c -h 192.168.200.129 -p 6379
192.168.200.129:6379> cluster nodes

执行结果如下,6379变成slave了,挂在了6389下面了

在这里插入图片描述

如果某一段插槽的主从都宕机了,redis服务是否还能继续?
这个时候要看 cluster-require-full-coverage 参数的值了

yes(默认值):整个集群都都无法提供服务了
no:宕机的这部分槽位数据全部不能使用,其他槽位正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Whisper 从0安装教程 windows

这里写自定义目录标题 Whisper 从0安装教程 windows安装过程安装python3.11安装Anaconda在Anaconda里面安装whisper安装 ffmpeg第一次运行whisper检查GPU 一些弯路 Whisper 从0安装教程 windows 因为需要把语音变成文字稿,问了做语言相关的朋友,决定使用…

基于51单片机的智能手机充电器设计

**单片机设计介绍,1660【毕设课设】基于51单片机和MAX1898的智能手机充电器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 51单片机智能手机充电器设计介绍 51单片机智能手机充电器是一种可以实现智能快速充电的…

stm32中断

目录 简介 什么是NVIC 中断优先级 EXTI 简介 总结 hal库初始化代码 标准库初始化代码 简介 什么是中断?正常情况下,微处理器根据代码内容,按顺序执行指令。执行过程中,如果遇到其它紧急的事件需要处理,则先暂停当…

CodeWhisperer 初体验-手把手教导 给你飞一般的体验!

文章作者:燛衣 CodeWhisperer 有以下几个主要用途: 解决编程问题:CodeWhisperer 可以帮助您解决遇到的编程问题。您可以描述您的问题或需求,CodeWhisperer 将尽力提供相关的解决方案、代码示例或建议。无论您是遇到了语法错误、逻…

ardupilot开发 --- SLAM 篇

1. 视觉SLAM 1.1 深度相机的种类 结构光相机,如 Kinect1.0、RealSenseTOF相机,如 Kinect2.0双目相机,如 ZED详细参考:https://zhuanlan.zhihu.com/p/282776636 1.2 视觉SLAM算法 2D slam 与3D slam 应用场景有哪些不同&#x…

高通财报分析:恶劣环境将导致高通股价在财报后大幅下跌

来源:猛兽财经 作者:猛兽财经 总结: (1)根据我们的分析,高通(QCOM)的股价在上个季度下跌了近16%,预计在本季度财报后还将继续下跌。 (2)在恶劣的环境下,高通…

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法

西门子精智触摸屏使用U盘下载程序时报错“出现严重错误,必须关机”处理办法 如下图所示,精智触摸屏使用U盘下载程序时报错: Application CTLPNL. EXE encountered a serious error and must shut down 出现这种情况时,可以尝试从以下几方面进行逐个排查: 断电重启,更换U盘…

知了汇智2024届“天府人才·校招行”启动,这些岗位急招...

知了汇智作为数字经济新业态下的产教融合服务型平台机构,大力构建企业与高校的交流平台,旗下全资子公司成都知聊人才服务有限公司,致力于为企业提供数字技术、数字营销方面的人才招聘、人才输送、人才定制等服务;为求职者提供个人…

三氧化二铁纳米片

(西)三氧化二铁纳米片 (安)名称:三氧化二铁纳米片 (瑞)CAS:1309-37-1 (禧)分子式:Fe2O3 (生)外观:白色粉末…

怎么让照片内存变小?三个方法轻松搞定!

让照片内存变小可以节省存储空间、提高传输速度、优化图片质量和降低流量消耗等,对于设备性能和用户体验都有积极的影响。下面介绍了三种简单有效的方法,一起来看看吧~ 方法一:通过嗨格式压缩大师压缩照片让内存变小 通过压缩照片&#xff0…

avi怎么转mp4?

avi怎么转mp4?如今市面上涌现了各种多样的视频格式,其中AVI作为一种音频视频交错格式,虽然使用较少但相对常见。它的优点在于占用空间较小,但画面质量并不是很出色。然而,AVI格式也存在一个明显的缺点,即兼…

企业软文推广的时机有哪些?媒介盒子告诉你

软文成本低、效果持续,能够为企业带来品牌曝光,实现品牌增值,但是企业也不是每时每刻都需要进行软文推广,接下来媒介盒子就告诉大家,企业进行软文推广的时机有哪些? 一、 为新品造势 一般企业发布新品时就…

基于区域边缘控制器的智慧管廊安全监测方案

区域边缘控制器是一种集成了PLC、网关、数据采集、协议兼容、多设备联动控制等丰富功能的智能设备,基于高性能工业级处理器,内置边缘计算策略和设备控制逻辑,从而代替PLC,实现对边缘物联网设备的智能自主感知和控制,适…

python实现MC协议(SLMP 3E帧)的TCP服务端(篇一)

python实现MC协议(SLMP 3E帧)的TCP服务端是一件稍微麻烦点的事情。它不像modbusTCP那样,可以使用现成的pymodbus模块去实现。但是,我们可以根据协议帧进行组包,自己去实现帧的格式,而这一切可以基于socket模…

高压放大器在电火花加工中的作用是什么

高压放大器在电火花加工中扮演着至关重要的角色。下面安泰电子将详细介绍高压放大器在电火花加工中的作用。 电火花加工是一种精密加工技术,广泛应用于制造业的模具制造、航空航天、汽车零部件等领域。它通过在工件表面产生高频电火花放电的方式,实现对材…

设计模式(22)享元模式

一、介绍: 1、定义:享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 2、…

vue3中解析地址(address-parse插件的使用)

1.安装 npm install address-parse --save 2.使用 // 引入address-parse import AddressParse, { AREA, Utils } from "address-parse";const adressValue ref([])const getResolutionContent () > {const [result] AddressParse.parse(EnterpriseSalesDetai…

Android APT的使用

Apt 介绍 APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation,根据注解自动生成代码。 Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annot…

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题 前言1. 新建项目2.配置maven依赖3.编写代码4.打jar包5.上传服务器6.代码中引用 前言 老版本编写UDF时,需要继承 org.apache.hadoop.hive.ql.exec.UDF类,然后直接实现evaluate()方法即可。 由于公司hive版本比较高(3.x&#x…

Linux入门指令和权限讲解

目录 一,Linux指令讲解 1. ls 指令(查看文件) 2. pwd命令(展现当前工作目录) 3. cd 指令(改变当前所处工作目录) 4. touch指令(创建文件) 5.mkdir指令(创…