Redis单机伪集群配置与搭建

news2024/12/24 21:18:21

目录

        1. 复制6个redis配置文件到当前目录下

2. 启动每个节点

3. 判断集群是否可用

4. 初始化集群

5. 查看集群信息

 6. 获取与插槽对应的节点

(1)手动重定向

(2)自动重定向

 7. 故障恢复


需求:配置一个三主三从的集群系统:

1. 复制6个redis配置文件到当前目录下:

 配置文件内容如下:

redis81.conf 对应的端口就是6381,节点的持久化文件为 nodes1.conf

redis82.conf 对应的端口就是6382,节点的持久化文件为 nodes2.conf

以此类推...

2. 启动每个节点:

redis-server redis81.conf
redis-server redis82.conf
redis-server redis83.conf
redis-server redis84.conf
redis-server redis85.conf
redis-server redis86.conf

3. 判断集群是否可用

 

4. 初始化集群:

下面启动命令中,create参数表示要初始化集群,--replicas 1 表示每个主数据库拥有从数据库的个数为1,所以集群共有3个主数据库和3个从数据库。

        根据Redis集群节点信息,我们可以看到已经形成了一个Redis集群,并且具有以下节点配置:

  • 节点 127.0.0.1:6381 是一个主节点,。它负责处理槽范围 0-5460 的数据。

  • 节点 127.0.0.1:6382 是另一个主节点,负责处理槽范围 5461-10922 的数据。

  • 节点 127.0.0.1:6383 是第三个主节点,负责处理槽范围 10923-16383 的数据。

  • 节点 127.0.0.1:6384 是节点 127.0.0.1:6382 的从节点,用于复制槽范围 5461-10922 的数据。

  • 节点 127.0.0.1:6385 是节点 127.0.0.1:6383 的从节点,用于复制槽范围 10923-16383 的数据。

  • 节点 127.0.0.1:6386 是节点 127.0.0.1:6381 的从节点,用于复制槽范围 0-5460 的数据。

整个集群中每个主节点都有一个从节点,因此形成了三主三从的Redis集群配置。

root@hecs-82704:~$ redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6385 to 127.0.0.1:6381
Adding replica 127.0.0.1:6386 to 127.0.0.1:6382
Adding replica 127.0.0.1:6384 to 127.0.0.1:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: c807089e5ee037e6bf919275f161da3ec6cec1be 127.0.0.1:6381
   slots:[0-5460] (5461 slots) master
M: 9b06856e087f824479cff69dad218b82d237054f 127.0.0.1:6382
   slots:[5461-10922] (5462 slots) master
M: af3d626cb2f1f15819c4e20a480db61138c6833d 127.0.0.1:6383
   slots:[10923-16383] (5461 slots) master
S: a72c753956ff4399e3771cd647f39a16811ee740 127.0.0.1:6384
   replicates 9b06856e087f824479cff69dad218b82d237054f
S: 8a12eb51f19a5dda12943e349449507c7933d2f0 127.0.0.1:6385
   replicates af3d626cb2f1f15819c4e20a480db61138c6833d
S: 0daac16150617f9328b66f4ae62c667adafb8f55 127.0.0.1:6386
   replicates c807089e5ee037e6bf919275f161da3ec6cec1be
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 127.0.0.1:6381)
M: c807089e5ee037e6bf919275f161da3ec6cec1be 127.0.0.1:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: af3d626cb2f1f15819c4e20a480db61138c6833d 127.0.0.1:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 9b06856e087f824479cff69dad218b82d237054f 127.0.0.1:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: a72c753956ff4399e3771cd647f39a16811ee740 127.0.0.1:6384
   slots: (0 slots) slave
   replicates 9b06856e087f824479cff69dad218b82d237054f
S: 8a12eb51f19a5dda12943e349449507c7933d2f0 127.0.0.1:6385
   slots: (0 slots) slave
   replicates af3d626cb2f1f15819c4e20a480db61138c6833d
S: 0daac16150617f9328b66f4ae62c667adafb8f55 127.0.0.1:6386
   slots: (0 slots) slave
   replicates c807089e5ee037e6bf919275f161da3ec6cec1be
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

        分配完成后,根据哈希槽算法会为每个主数据库分配插槽,分配插槽的过程其实就是分配哪些键由哪些节点负责。

关于插槽的分配:

        在一个集群中,所有的键会被分配给16384个插槽,而每个主数据库会负责处理其中的一部分插槽,如:

可以看到6381节点负责处理0~5460这5461个插槽,6382负责处理5641~10922这部分插槽..

5. 查看集群信息:

 6. 获取与插槽对应的节点

(1)手动重定向

        当客户端向集群中的任意一个节点发送命令后,该节点会判断相应的键是否在当前节点中,如果键在该节点中,就会像单机实例一样正常处理该命令;如果键不在该节点中,就会返回一个MOVE重定向请求,告诉客户端这个键目前由哪个节点负责,然后客户端将同样的请求向目标节点重新发送一次以获得结果,如插入一个 set name minmin

在6381节点插入:,会提示 name 这个键应该在 6382 的节点上插入:

 

在6382节点插入:

(2)自动重定向

 Redis命令行客户端提供了集群模式来支持自动重定向,使用 -c 参数来启用:

这里补充一个问题:

        对于redis集群的主从复制,当我们在主节点插入数据后,在该主节点对应的从节点去获取刚才插入的数据仍然会报重定向的错误,例如:

在6382节点上插入一条与学校相关的数据,键是 school,值是 CHD

然后到该节点对应的从节点去获取(6382节点的从节点是6386) ,会发现有重定向错误:

其实从库已经将主库的数据复制过去了,这是因为:Redis Cluster集群中的从节点,官方默认设置的是不分担读请求的、只作备份和故障转移用,当有请求读向从节点时,会被重定向到对应的主节点来处理

解决办法:

在get数据之前先使用命令readonly,这个readonly告诉 Redis Cluster 从节点客户端愿意读取可能过时的数据并且对写请求不感兴趣 

 

 7. 故障恢复

将主节点 6382 下线:

 查看集群的节点信息:

  1. 节点 127.0.0.1:6382 是一个主节点,状态显示为 master,fail,表示该节点是一个故障的主节点。
  2. 节点 127.0.0.1:6384 是一个从节点,从主节点 127.0.0.1:6382 复制槽范围 5461-10922 的数据。在主节点 127.0.0.1:6382 下线后,从节点 127.0.0.1:6384 成为了一个独立的主节点。

可以看到集群的故障恢复机制是生效的。

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

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

相关文章

为什么ConcurrentHashMap不允许插入null值而HashMap可以?

为什么ConcurrentHashMap不允许插入null值而HashMap可以? 文章目录 为什么ConcurrentHashMap不允许插入null值而HashMap可以?HashMap源码ConcurrentHashMap源码为什么ConcurrentHashMap需要加空值校验呢?二义性问题测试代码代码分析测试结果结…

纯css3实现水波纹从中心向四周扩散动画

纯css3实现水波纹从中心向四周扩散动画 效果可用于pc端或移动端,引导用户点击,间接带来一定的转化率 示例效果 示例代码 <template><div class"zanbtn-wrap"><div click"handleClick(https://pay.aikelaidev.cn/paypage/?merchant35bdYxSx7dCUr…

子网划分路由网卡

1."IPv4 CIDR" "IPv4 CIDR" 是与互联网协议地址&#xff08;IP address&#xff09;和网络的子网划分有关的概念。 - "IPv4" 代表 "Internet Protocol version 4"&#xff0c;也就是第四版互联网协议&#xff0c;这是互联网上最广泛使…

IPv4 与 IPv6:网络协议的差异和转换方法

在网络的世界里&#xff0c;IPv4 和 IPv6 这两个协议就像是两个不同的王国&#xff0c;各自拥有着独特的领土和规则。虽然它们都是为了互联网的发展而存在&#xff0c;但它们之间究竟有哪些差异&#xff0c;以及如何在这两个王国之间穿梭&#xff0c;仍然是很多网络小白们的困惑…

Spring使用注解存储Bean对象

文章目录 一. 配置扫描路径二. 使用注解储存Bean对象1. 使用五大类注解储存Bean2. 为什么要有五大类注解&#xff1f;3.4有关获取Bean参数的命名规则 三. 使用方法注解储存Bean对象1. 方法注解储存对象的用法2. Bean的重命名 在前一篇博客中&#xff08; Spring项目创建与Bean…

Excel中Vlookup

VLOOKUP($A:$A,Sheet3!$A:$D,COLUMN(Sheet3!B1),FALSE) ps: 1.按F4&#xff0c;锁定第一个和第二个参数 2.第二个参数&#xff0c;要选择全部范围(包括被查找列&#xff0c;以及查找内容) 2.第三个参数用column&#xff08;&#xff09;函数&#xff0c;第三列不要锁定 3.…

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

Alpha-GO打败⼈类的秘籍- 强化学习(Reinforcement Learning)

为了深⼊理解强化学习&#xff08;Reinforcement Learning&#xff0c;简称RL&#xff09;这⼀核⼼概念&#xff0c;我们从⼀个⽇常游戏的例⼦出发。在“贪吃蛇”这个经典游戏中&#xff0c;玩家需要掌控⼀条蛇&#xff0c;引导它吞吃屏幕上出现的各种果实。每次成功捕获果实&a…

CSS层叠

声明冲突 同一个样式&#xff0c;多次应用到同一个元素。 此时可以看到我们的a元素的样式和浏览器的默认样式发生了冲突 层叠 解决声明冲突的过程&#xff0c;浏览器会自动处理&#xff08;权重计算&#xff09;&#xff0c;权重大的获胜 1.比较重要性 重要性从高到低 1&…

Docker 教程

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&a…

省电液晶驱动IC,VK2C22G,COG片高抗干扰抗噪系列LCD段码驱动芯片,I2C通信接口

型号:VK2C22G DICE(邦定COB)/COG&#xff08;绑定玻璃用&#xff09; VK2C22G概述&#xff1a; VK2C22G是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大176点&#xff08;44SEGx4COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#…

C# 接口2.0 (028 课程)

参考视频教程&#xff1a;B站 刘铁猛 028 接口 依赖反转 单元测试 接口是一种供方和需求方都遵守的契约 — 即规则。 文章目录 原始代码利用用接口简化函数重载紧耦合程序实体松耦合代码实体设计一个紧耦合 -- 接口松耦合 -- 单元测试紧耦合程序实例松耦合程序实体 -- 引入接…

latex子图无法重新编号问题

问题 想让后四个子图&#xff0c;从a开始编号 解决方法 如上原因是由于全局自动编号机制&#xff0c;在 \begin{figure*}[h] \centering下面添加&#xff1a; \setcounter{subfigure}{0}

SpringBoot+ShardingSphere+Mybatis实现Mysql8读写分离

场景 CentOS7安装Mysql8并进行主从复制配置&#xff1a; CentOS7安装Mysql8并进行主从复制配置_霸道流氓气质的博客-CSDN博客 在上面搭建起来Mysql之间的主从复制的基础上&#xff0c;在SpringBoot项目中实现Mysql数据的 读写分离&#xff0c;即写入操作一个库&#xff0c;…

为什么重写 equals 方法要重写 hashCode 方法

前言 看了挺多关于这个问题相关的文章&#xff0c;发现回答缺少因果逻辑。直到看了一篇文章提到 《Effective Java》中有关于这个问题的答案。于是找了电子书看了一下&#xff0c;查看相关源码理清了因果逻辑&#xff0c;得出怎样回答这个问题比较好。 1 hashCode 的通用约定…

k8s 如何升级应用

如何升级应用 在之前的分享中&#xff0c;我们知道一个程序如何放到容器中&#xff0c;一个镜像如何生成 pod&#xff0c; pod 的创建&#xff0c;运行&#xff0c;管理&#xff0c;删除过程&#xff0c;挂载等等 那么我们有没有想过&#xff0c;在真正的生产环境中&#xff…

golang 验证器库go-playground/validator实践

当我们将一个接口值传递给一个 reflect.ValueOf 函数调用时&#xff0c;此调用返回的是代表着此接口值的动态值的一个 reflect.Value 值。我们必须通过间接的途径获得一个代表一个接口值的 reflect.Value 值。 reflect.Value 类型有很多方法&#xff08;Package reflect - The …

【字符流】编码解码问题

字符流中编码解码问题 字符流抽象基类&#xff1a; Reader&#xff1a;字符输入流的抽象类Writer&#xff1a;字符输出流的抽象类 字符流中和编码和解码问题相关的两个类&#xff1a; InputStreamReader&#xff1a;是从字节流到字符流的桥梁&#xff0c;它读取字节并使用指…

Jupyter Notebook 后台启动

进入用户目录 cd 指定目录 激活环境 conda activate 环境名 Note&#xff1a; 注意&#xff1a;无法导入依赖包&#xff0c;查看是否激活对应环境。 后台启动 jupyter notebook&#xff0c;或者服务器上启动 可通过浏览器访问 nohup jupyter notebook --allow-root& …

C语言——通讯录的实现

前面的文章介绍了C语言中的 指针、自定义类型等模块&#xff0c;这篇文章将通过编写实现通讯录的代码对这些模块进行应用和进一步加深理解&#xff1a; 目录 1. 通讯录主要功能设计&#xff1a; 2. 通讯录的实现——主页面&#xff1a; 3. 通讯录的实现——保存个人信息&am…