redis 集群 底层原理以及实操

前言

上篇我们讲解了哨兵集群是怎么回事

也说了对应的leader选举raft算法

也说了对应的slave节点是怎么被leader提拔的

主要是比较优先级 比较同步偏移量 比较runid等等

今天我们再说说,其实哨兵也有很多缺点

虽然在master挂了之后能很快帮我们选举出新的master

但是对于单个master承受的压力过大的情况还是没有得到很好的解决

因此,我们就推出了新的技术  集群cluster

于是我们也就放弃了原有的哨兵操作

下面我们慢慢介绍

结构

首先我们也是先看看原来的哨兵架构

再来看看今天要介绍的集群架构

这里对应master之间是数据共享的

至于为什么我们下面慢慢介绍

由于集群自带故障迁移,这里也是自然取代了哨兵

首先我们先介绍几个基本的概念

分片

这里分片的意思就是对应的每个节点负责一部分的槽位数据

一个集群负责所有的数据

一个节点就负责一片片区的数据

槽位

上面我们提到的一片片区的基本单位就是槽位

是由16384个槽位组成的

注:这里建议节点数不要超过1k

上述的架构可以这样理解

哈希算法

我们如何找到对应的槽位呢?

通过一次CRC16算法再&0x3FFF即可

哈希映射有哪些 方式呢???

1.哈希取余分区算法

简单有效

将对应的哈希值取模一个机器数量即可

缺点就是扩容比较困难

我们需要将所有数据key进行一次rehash的操作

2.一致性哈希分区算法

首先由一个重要的概念称之为哈希环

也就是将所有数据首位相连成一个一致性哈希环

假设是0-65535

这里0和65536指向的就是同一块位置

逻辑图如下

这样我们也就得到了一个所有哈希值的全量集

接着将对应的服务器ip进行对应的映射

最后就是对应的key进行hash了

就是顺时针找到的第一个节点就负责存储这一个键值对

优点是容错性好,缺失一个节点也能直接使用下一个遇见的redis节点进行存储

扩展性好,假设需要加上一个节点x,就只需要移动一小块区域的数据

如上图 我们只需要移动对应的a到x的数据即可

但是缺点也是存在的

很可能出现数据倾斜的问题

也就是说头重脚轻,分配不均匀的情况

于是我们就使用了哈希槽的方式解决问题

3.哈希槽分区算法

就是我们之前说的将16384个哈希槽分给不同的节点来保存

这里主要就是一个使用CRC16(key) 再进行了一次取模16384的操作

主要架构如下

为啥是16384???

为啥是16384个槽位呢

主要是因为以下原因

1.首先客户端每隔一段时间会给服务器发送心跳包,心跳包中就有槽位的数据

如果需要65536个槽位这里的数据量就达到了8K,但是如果是16384个槽位这里的数据就只有2k,这样的性能更好不容易导致网络阻塞

2.官网声明不可以使用超过1000个节点

因为节点过多就会导致传输数据的失真等等,也是不可取的

这里16384个槽位也是足够使用的

3.对于文件的压缩

发送的数据包如果太大就不方便压缩了

这里16384个槽位slot是刚刚好的

数据丢失

注:redis集群并没有保证数据的强一致性

假设我给1号机器写入数据还没来得及同步给从机就挂掉了

从机即使上位也无法得到之前的数据

集群搭建

首先我们在myredis下面创建新的cluster文件夹存放对应的配置文件

mkdir -p /myredis/cluster   这里-p就是父目录不存在也会创建  

我们三台虚拟机每台放两个配置文件

分别对应一主一从

对应的配置文件如下

这里我们使用的是从6381开始的6个redis节点

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节点都启动之后我们开始创建集群

使用如下命令,注意结合自身ip 使用ifconfig可以查看

redis-cli -a abc123 --cluster create 
--cluster-replicas 1 192.168.188.136:6381 192.168.188.136:6382 
192.168.188.137:6383 192.168.188.137:6384 
192.168.188.138:6385 192.168.188.138:6386
这里replicas 1 就是每个主机配置一个从机 后面对应主从关系 使用任意一台vm进行操作即可

接下来直接yes即可

出现对应的配置文件即算配置成功

我们可以使用

cluster nodes 查看集群状态

注意这里不同的机器对应的槽位不同

所以set k1 v1 很可能会失败

而k2v2会成功

这是因为登入的是1号节点 而对应计算的槽位是由5号节点管理的

我们只需要在登录的时候在最后加上一个-c 以集群形式登录

此时遇到哪个集群就会自动跳转到对应的ip端口进行操作了

redis-cli -a abc123 -p 6381 -c

这里可以理解为路由/重定向

容灾

先说结论,主机挂了从机会上位

此时主机再回来也只能当从机了

下面是具体演示

手动shutdown6381

使用cluster nodes查看情况

我们发现对应的6384上位了

此时重启6381只能当小弟了

我们还可以进行对应的恢复

让6381继续当老大,6384继续当小弟

此时只需要登录6381进行对应的操作即可

cluster failover

此时6381就可以重回master

扩容

下面演示扩容节点

我们先在192.168.138第三台vm下创建两个配置文件

并启动对应的redis

加入集群只需要执行以下命令

找6381当做引路人即可

此时我们会发现虽然添加节点成功但是没有分配槽位

检查一下集群状态

redis-cli -a abc123 --cluster check 192.168.188.136:6381

我们需要进行reshard进行分配槽位

redis-cli -a abc123 --cluster reshard 192.168.188.138:6387

因为现在是4个节点所以分配一个节点4096个槽位

我们需要之前check的6387的id号

然后输入all

进行对应的reshard

在进行一次check查看对应的状态

最后为6387分配从节点

redis-cli -a abc123 --cluster add-node 192.168.188.138:6388 192.168.188.138:6387 --cluster-slave --cluster-master-id e03b3d6631033baa0961653ebec70800f6bf0fec

最后检查一下结构

最后四主四从也就搭建完成了

缩容

虽然基本上用不到,但是咱们主打一个完整性

首先清楚6388

使用上面的check指令获取对应的id

redis-cli -a abc123 --cluster del-node 192.168.188.138:6388  20dd91501451051961745a005f580858db6f7a2e

删除之后对应的子节点可以再查看一下

然后得执行reshard将对应的slot槽位分配回去

为了方便起见我们直接全分配给6381号机器即可


redis-cli -a abc123 --cluster reshard 192.168.188.136:6381

直接全部分配写4096

然后选择6381号机器的id

对应的done即可

此时我们再进行一次check

我们发现6387已经变成salve了

对应的槽位也清零了

最后进行删除节点操作

redis-cli -a abc123 --cluster del-node 192.168.188.138:6387 e03b3d6631033baa0961653ebec70800f6bf0fec

批处理操作

我们知道不同的key k1 k2 k3会被分配到不同的slot上

所以进行批处理查询操作是会报错的

如果我们想进行批处理

可以使用通配符将几个key映射为一组

类似于以下操作

我们在cluster.c的源文件中也可以找到对应的

我们发现redis会使用通配符{}中间的元素进行CRC算法

其他操作

redis还有一个重要参数

就是当假设分区1的主从节点都宕机了之后

我们对外还会不会进行服务暴露???

默认是yes 也就是不服务暴露的  但是我们也是可以设置服务暴露的

但是这时候就会有一些数据是不可访问的

重要的三个集群命令

cluster nodes  
查看节点情况cluster countinkeysinslot slotId  
查看slot是否被占用cluster keyslot k1
查看key使用的slot是啥
也就是进行了一次CRC16算法并取余16384

示例如下

说明1236槽位没有存放数据

说明k123会存放在4255槽位上

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#解析JSON的常用库--Newtonsoft.Json

一、库介绍 在C#中,解析JSON的常用库有Newtonsoft.Json(也称为Json.NET)和 System.Text.Json(从 .NET Core 3.0 开始引入)。本文主要介绍 Newtonsoft.Json。 二、下载 官网: https://www.nuget.org/pack…

解决文件传输难题:如何绕过Gitee的100MB上传限制

引言 在版本控制和代码托管领域,Gitee作为一个流行的平台,为用户提供了便捷的服务。然而,其对单个文件大小设定的100MB限制有时会造成一些不便。 使用云存储服务 推荐理由: 便捷性:多数云存储服务如: Dro…

Vue——事件修饰符

文章目录 前言阻止默认事件 prevent阻止事件冒泡 stop 前言 在官方文档中对于事件修饰符有一个很好的说明,本篇文章主要记录验证测试的案例。 官方文档 事件修饰符 阻止默认事件 prevent 在js原生的语言中,可以根据标签本身的事件对象进行阻止默认事件…

隆道出席河南ClO社区十周年庆典,助推采购和供应链数字化发展

5月26日,“河南ClO社区十周年庆典”活动在郑州举办,北京隆道网络科技有限公司总裁助理姚锐出席本次活动,并发表主题演讲《数字化采购与供应链:隆道的探索与实践》,分享隆道公司在采购和供应链数字化转型方面的研究成果…

ZooKeeper安装

安装Zookeeper 1、下载Zookeeper安装包 打开链接选择一个版本进行下载 https://zookeeper.apache.org/releases.html2、上传Zookeeper安装包到集群 输入命令 scp apache-zookeeper-3.8.4-bin.tar.gz hadoop192.168.88.100:/tmp也可以使用xftp等上传,物理机用u盘…

方法的重写--5.29

当子类对父类的方法不满意时,可以进行重写,但是方法名字要与父类一样。 举例,我用people来举例,我是打工人,然后再创一个student类,重写方法我不是打工人,我是读书人。代码如下,发现…

如何让你的网站能通过域名访问

背景 当我们租一台云服务器,并在上面运行了一个Web服务,我们可以使用云服务器的公网IP地址进行访问,如下: 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的,购买域名…

Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计

主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估: ①PMU同步相量测量单元结合加权最小二乘法(WLS)分析电力系统的电压幅值和相角状态; ②并采用牛顿-拉夫逊方法进行系统潮流计算,结果作为理论分…

摩尔线程MTT S4000 AI GPU助力30亿参数大模型训练,性能比肩英伟达同类解决方案

中国国产GPU制造商摩尔线程(Moore Threads)在AI加速器领域取得了显著进展,其最新推出的MTT S4000 AI GPU在训练大规模语言模型时表现突出,据称相较于其前代产品有着显著的性能提升。根据cnBeta的报道,搭载S4000 GPU的全新“酷鹅千卡智能计算集…

技术面试,项目实战,求职利器

之前找工作一直想找一个能真正系统性学开发的地方,之前毕业找工作的时候无意间碰到下面这个网站,感觉还挺不错的,用上面的技术实战内容应对技术面试,也算是求职利器了。有需要的可以自取: https://how2j.cn?p156336 实…

springboot课程题库管理系统-计算机毕业设计源码30812

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于课程题库管理系统 当然也不能排除在外,随着网络技术的不断成熟,带动了课程题库管理系统 ,它彻底改变了…

基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api

前言 最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别 原项目地址:https://github.com/sml2…

Linux-应用编程学习笔记(二、文件I/O、标准I/O)

一、文件I/O基础 文件 I/O 指的是对文件的输入/输出操作,就是对文件的读写操作。Linux 下一切皆文件。 1.1 文件描述符 在 open函数执行成功的情况下, 会返回一个非负整数, 该返回值就是一个文件描述符(file descriptor&#x…

搭建YOLOv10环境 训练+推理+模型评估

文章目录 前言一、环境搭建必要环境1. 创建yolov10虚拟环境2. 下载pytorch (pytorch版本>1.8)3. 下载YOLOv10源码4. 安装所需要的依赖包 二、推理测试1. 将如下代码复制到ultralytics文件夹同级目录下并运行 即可得到推理结果2. 关键参数 三、训练及评估1. 数据结构介绍2. 配…

基于python flask的旅游数据大屏实现,有爬虫有数据库

背景 随着旅游行业的快速发展,数据在旅游决策和规划中的重要性日益凸显。基于 Python Flask 的旅游数据大屏实现研究旨在结合爬虫技术和数据库存储,为用户提供全面、实时的旅游信息展示平台。 爬虫技术作为数据采集的重要手段,能够从各种网…

浏览器输入URL到网页显示之间发生了什么

记: DNS(Domain Name System,域名系统)就是根据域名来查找对应的IP地址的一个关键系统。 域名层级关系: 根域名服务器(.)顶级域名服务器(.com)权威域名服务器(server.com) 首先浏…

勒索病毒的策略与建议

随着网络技术的快速发展,勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金,给个人和企业带来了巨大的损失。因此,了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…

云计算OpenStack基础

1.什么是虚拟化? •虚拟化是云计算的基础。 •虚拟化是指计算元件在虚拟的而不是真实的硬件基础上运行。 •虚拟化将物理资源转变为具有可管理性的逻辑资源,以消除物理结构之间的隔离,将物理资源融为一个整体。虚拟化是一种简化管理和优化…

【介绍下运维开发】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

oracle tree

select * from "Test"; INSERT INTO "Test" ("id", "name", "pid") VALUES (01, 中国, 00); INSERT INTO "Test" ("id", "name", "pid") VALUES (01.01, 福建, 01); INSERT INTO…