redis第三章-redis集群redisCluster

news2024/11/19 9:36:57

1.redis集群模式比较

(1)哨兵模式
在这里插入图片描述
哨兵模式是利用哨兵来做主从切换的,当主节点发生故障的时候,通过哨兵去选取出一个从节点作为主节点,但本身哨兵的配置还是有些麻烦,并且实际上哨兵的性能和高可用性一般!
特别是当主节点发生故障以后,在选举的这个过程中,出现访问瞬断的情况,即此时集群不支持访问,并且哨兵模式只有一个节点提供访问,不能支持很高的并发。
在上一课我们知道redis在持久化文件的时候,不论是rdb持久化还是aof持久化,都是每次备份内存中所有数据到磁盘的,这些的话也会导致持久化时间过长,影响数据恢复和主从同步的效率。
(2)高可用集群模式
在这里插入图片描述
redis集群是由多个主从节点组成的一个大的分布式服务器集群,它具有复制、高可用、高并发、分片的特性。redis不需要哨兵也能完成节点的移除和重新选举。
这种配置不需要一个中心的节点,可以水平拓展(官方说是水平拓展到1000个节点),并且配置比哨兵模式还要简单

2.Redis高可用集群搭建

(1)第一步:准备三台虚拟机,实际一台虚拟机也没问题,反正是自己玩,我这里还是准备了三台,之前学jenkins正好搭建了三台
(2)第二步:把上节课的redis里的配置文件redis.conf复制出来,对每台服务器都复制,这样三台服务器对应6个redis,每台服务器都是一主一从
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)修改配置文件
在这里插入图片描述
设置redis的密码,这个密码是客户端访问的
在这里插入图片描述
设置集群节点间的密码,这个密码是集群间通信访问的
在这里插入图片描述
同理其他文件也是如此
(4)分别启动每台服务器的redis,看能否启动成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(5)关闭防火墙,或者打开redis的服务端口以及节点gossip通信端口16379(默认是在redis端口号上加1W)

 # systemctl stop firewalld # 临时关闭防火墙
 # systemctl disable firewalld # 禁止开机启动
   启动集群:
/usr/local/redis-5.0.14/src/redis-cli -a renxh --cluster create --cluster-replicas 1 192.168.85.200:8001 192.168.85.201:8002 192.168.85.202:8003 192.168.85.200:8004 192.168.85.201:8005 192.168.85.202:8006

(6)验证集群
连接任意一个客户端,执行cluster nodes
在这里插入图片描述
在这里插入图片描述
实际当执行启动集群的命令的时候,redis会默认把前三台8001、8002、8003设置为主节点,剩余的三台服务器设置为从节点,但他们各自对应的主节点不在自己的服务器上,而是别的服务器,这样保证了redis的高可用性
小注:上面图片不太对,是因为我后面测试了的,主节点改变了

3.springboot的使用配置

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons‐pool2</artifactId>
</dependency>

在这里插入图片描述
在这里插入图片描述

4.集群原理分析

(1)redis Cluster集群实际将所有数据划分为16384个槽,每个节点负责一部分的数据存储,当redis Cluster的客户端来连接的时候,也会把集群的槽位配置信息存储在客户端上,这样客户端查找某一个key的时候,就能直接定位到对应的节点
同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
在这里插入图片描述
(2)跳转定位法
当客户端向一个错误的节点发送了指令,该节点会发现指令的key并不归属于自己管理,这时他会把客户端发送的这个指定携带到拥有这个槽位的节点地址,同时更新客户端的集群配置信息
在这里插入图片描述
可以看到当我set name这个key的时候,他告诉我不能插入,同时我的客户端变成了8006端口号

(3)Redis集群节点间的通信机制
其实大多集群之间的通信基本上就是两种,一种是传播(传播就是一个传一个的通知),还有一种集中式(集中式就是所有的节点都在同一个地方管理,类似eureka,nacos,zk)
redis Cluster集群采用的就是传播机制,实际gossip协议
在这里插入图片描述
gossip协议有个好处在于元数据的更新比较分散,就是彼此相隔太远,没有集中在一个地方,这样都一定的延时、降低了压力,同理这也是它的缺点,导致元素在更新的时候有延时导致集群的一些操作滞后

在这里插入图片描述
(4)网络抖动
真实世界的机房网络往往并不是风平浪静的,它们经常会发生各种各样的小问题。比如网络抖动就是非常常见的一种现象,突然之间部分连接变得不可访问,然后很快又恢复正常。
为解决这种问题,Redis Cluster 提供了一种选项cluster­-node-timeout,表示当某个节点持续 timeout的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频
繁切换 (数据的重新复制)。

(5)Redis集群选举原理分析
当某个节点的从节点发现主节点故障之后,就会尝试选取,希望自己能够成为主节点(毕竟不想当领导的从节点不是好从节点),但是很可能会有多个从节点相互竞争的情况
1.当主节点挂了之后,从节点会向其他节点发送信息,实际也只有其他节点的主节点能够响应
2.尝试成为主节点的从节点在收到其他主节点返回的信息后,发现如果有半数以上的主节点同意,那么就可以成为主节点了,这里也说明为什么搭建集群需要三个节点,也就是三个主节点了
(当只有两个节点的时候,一个节点挂了,即使申请主节点的从节点拿到的票数也只有一票,是不满足半数以上的)
3.成为主节点以后,广播告知集群的其他节点
图为专业话术,实际学习还是夹杂自己理解吧

在这里插入图片描述
在这里插入图片描述
补充问:实际情况可能出现两个从节点都拿到了一票?
实际是从节点并不是在主节点故障之后立刻发起选举的,(领导噶了,也不能表现的立刻顶人家的位置吧?总要看清一下形势吧,万一领导没噶了呢),是有一定延迟的,当故障信息在集群里传播之后,才能进行选举,否则当从节点申请选举的时候,其他主节点没有收到故障信息,可能会拒绝投票
在这里插入图片描述
(6)集群脑裂丢失问题
简单概括就是每个节点实际也是个小集群,当出现网络波动或者其他原因,主节点和从节点无法通信了,也就是说主节点从集群里剥离出来了,但实际主节点也没有故障,只是因为某种原因!
但是这样的话,剩余的从节点会认为主节点已经故障了,会发起选举,成为了主节点,但是此时网络恢复过来了,发现一个节点里有两个主节点,这就是脑裂问题!
这样的话,原本的主节点就会变成从节点,就会丢失大量数据
解决方法: 在这里插入图片描述
(7)集群是否完整才能对外提供服务?
当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。
(8)Redis集群对批量操作命令的支持 在这里插入图片描述

5.水平拓展集群

(1)先启动搭建好的集群,如上面介绍,查看集群的插槽
在这里插入图片描述
从上图可以看出,整个集群运行正常,三个master节点和三个slave节点,8001对应0-5460,8004对应10923-16383,8006对应5461-10922
这三个master节点存储的所有hash槽组成redis集群的存储槽位,slave点是每个主节点的备份从节点,不显示存储槽位
(2)在/usr/local/redis-cluster下创建8007和8008文件夹,并拷贝8001文件夹下的redis.conf文件到8007和8008这两个文件夹下
在这里插入图片描述
在这里插入图片描述
(3)配置8007为集群主节点
使用add-node命令新增一个主节点8007(master),前面的ip:port为新增节点,后面的ip:port为已知存在节点,看到日志最后有"[OK]New node added correctly"提示代表新节点加入成功

/usr/local/redis‐5.0.14/src/redis‐cli ‐a renxh --cluster add‐node 192.168.85.200:8007 192.168.85.200:8001

在这里插入图片描述
(4)查看集群是否有8007,但此时还不够,因为插槽,新加的节点还没有插槽,数据是分配不了给8007这个redis的
在这里插入图片描述

(5)使用redis-cli命令为8007分配hash槽,找到集群中的任意一个主节点,对其进行重新分片工作。
在这里插入图片描述

/usr/local/redis-5.0.14/src/redis-cli -a renxh --cluster reshard 192.168.85.200:8001

在这里插入图片描述
(6)查看最新集群信息
在这里插入图片描述
(7)把8008加入到8007,作为8007的从节点

#先把8008加入到集群里
/usr/local/redis-5.0.14/src/redis-cli -a renxh --cluster add-node 192.168.85.200:8008 192.168.85.200:8001
#启动8008客户端
/usr/local/redis-5.0.14/src/redis-cli -a renxh -c -h 192.168.85.200 -p 8008
#后面一长串是8007的名字,作为8007的从节点
cluster replicate 65f0c83b02f700658220a3705f1b1f6250b52bca

(8)检查
在这里插入图片描述
(9)又进一步,加油!

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

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

相关文章

chatgpt赋能python:使用Python创建结构体:完全指南

使用Python创建结构体&#xff1a;完全指南 在Python编程领域&#xff0c;结构体是一种非常方便和有用的数据类型&#xff0c;用于存储和组织相关变量。在本篇文章中&#xff0c;我们将讨论如何使用Python创建结构体。让我们开始吧&#xff01; 什么是结构体&#xff1f; 结…

shell学习

1、/etc/hosts的作用 Windows下的目录C:\Windows\System32\drivers\etc\hosts Linux下目录/etc/hosts 如 我们在/etc/hosts文件中添加一行 39.156.66.10 taobao.com 原理是&#xff0c;我们在浏览器输入 taobao.com&#xff0c;那么网站就可以打开百度的网站 但是现实是网…

7大常用ES6特性,助力你写出更现代化的JavaScript

文章目录 1. 模板字符串2. 箭头函数3. let 和 const4. 解构赋值5. 函数默认参数6. 模块化7. Promise 1. 模板字符串 模板字符串是一种新的字符串类型&#xff0c;它允许你在字符串中插入变量&#xff0c;方便了JavaScript开发者的开发体验。 ES6的模板字符串&#xff08;Templa…

demo:搜索帮助出口

写报表&#xff0c;用到搜索帮助&#xff0c;太久不写了&#xff0c;忘了&#xff0c;然后简单测了下。 当然方法很多&#xff0c;我只是突然想起这个东西来了&#xff0c;就测了下&#xff0c;条条大路通北京&#xff0c;想咋实现就咋实现吧&#xff0c;实现了就得了~ 代码很简…

chatgpt赋能python:Python代码教你删除空文件夹——让你的电脑系统更健康

Python代码教你删除空文件夹——让你的电脑系统更健康 作为一名有着10年python编程经验的工程师&#xff0c;我发现在电脑里存储着太多的空文件夹时会对电脑系统造成负面影响。空文件夹占用了硬盘空间&#xff0c;这可能导致你的电脑运行缓慢或者存储空间不足。因此&#xff0…

Qt下使用Sqlite数据库实现图像的读写显示

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a; Qt连接Sqlite3并使用Qtableview实时显示数据&#xff0c;重写QSqlQueryModel实现文本居中 第二章&#xff1a; Qt下使用Sqlite数据库实现图片的读写显示 文章目录 系列文章目录前言一、初始…

python3.10在centos下安装以及配置

python在centos下安装以及配置 1.背景 centos下默认的都是python2.7下载需要更换为3.x使用&#xff0c;目前大部分应用都是基于pyhton3了 具体步骤&#xff1a; 先按装openssh 不安装会报错 而且要安装高版本 要不然不兼容 报错如&#xff1a; WARNING: pip is configured …

chatgpt赋能python:Python创建程序的SEO指南

Python创建程序的SEO指南 Python是一种流行的高级编程语言&#xff0c;被广泛用于开发Web应用程序、人工智能、数据分析和科学计算等领域。在创建Python程序时&#xff0c;也要考虑SEO因素&#xff0c;以优化网页在搜索引擎结果中的排名。本文将介绍如何创建具有SEO友好性的Py…

软考A计划-电子商务设计师-电子商务系统开发知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【深入浅出 Spring Security(四)】登录用户数据的获取,超详细的源码分析

登录用户数据的获取 一、SecurityContextHolder 源码分析ListeningSecurityContextHolderStrategy 使用案例SecurityContextPersistenceFilter 说明 二、登录用户数据的获取三、总结 在【深入浅出Spring Security&#xff08;一&#xff09;】Spring Security的整体架构 中叙述…

Gradle 介绍,根据 Gradle 官方文档整理

这部分内容主要根据 Gradle 官方文档整理&#xff0c;做了对应的删减&#xff0c;主要保留比较重要的部分&#xff0c;不涉及实战&#xff0c;主要是一些重要概念的介绍。 Gradle 这部分内容属于可选内容&#xff0c;可以根据自身需求决定是否学习&#xff0c;目前国内还是使用…

回调函数与钩子函数的区别,另QT中connect函数的实现,lambda的使用

1、钩子函数是回调函数的一种 广泛来说两者都是一样的 严格来说 钩子函数的函数名早已被定义好&#xff0c;只是函数内部需要用户在应用层来定义&#xff0c; 1&#xff09;可以完全通过宏来实现系统是否调用该函数&#xff08;底层不封闭&#xff0c;修改宏的参数实现是否编…

chatgpt赋能python:Python动态分配内存:了解它的工作原理

Python动态分配内存&#xff1a;了解它的工作原理 Python是一种高级编程语言&#xff0c;它在处理内存和垃圾回收方面具有独特的方式。在Python中&#xff0c;内存分配和释放是动态的&#xff0c;并且由解释器自动完成。这意味着&#xff0c;Python程序员无需手动管理内存&…

C/C++/Qt 文件操作 效率比较

C/C/Qt 文件操作 & 效率比较 1 介绍2 比较结果2.1 Linux平台上运行程序普遍比Windows上快&#xff1b;Windows下VC编译的程序一般运行比MINGW&#xff08;MINimal Gcc for Windows&#xff09;快2.2 二进制文件的操作要快于文本文件&#xff1b;写文件的操作要快于读文件&a…

chatgpt赋能python:Python剔除函数的使用介绍

Python剔除函数的使用介绍 在Python编程中&#xff0c;剔除函数是非常有用的工具&#xff0c;它可以帮助程序员快速筛选出不符合条件的数据。本文将介绍剔除函数的概念和常见用法&#xff0c;以及如何有效使用剔除函数解决实际问题。 剔除函数的概念 剔除函数是指Python中的…

反射相关知识点

这里写目录标题 反射概述获取Class对象的三种方式总结具体代码演示 获取构造方法以及构造方法里的信息利用Class对象调用对应方法&#xff0c;以及用调取出来的Constructor&#xff08;构造器类&#xff09;创建对象具体代码 获取成员变量利用Class对象调用对应方法&#xff0c…

chatgpt赋能python:Python加速读取CSV文件的方法

Python加速读取CSV文件的方法 介绍 CSV文件是一种常见的数据格式&#xff0c;因为其简单和易于理解&#xff0c;被广泛应用于数据处理和数据分析。然而&#xff0c;在处理大型CSV文件时&#xff0c;读取速度会成为问题。Python作为一种高级编程语言&#xff0c;具有易学易用的…

AI+是企业管理软件的下一站和终点站

作为GPT综合症的表现&#xff0c;准备陆续写一点关于AI的文章。就从这一篇开始吧。 这篇文章原来是在2019年1月份我发在新浪微博和LinkedIn上的。刚搜了一下&#xff0c;全然不见了踪影。原因大家也都知道。但是&#xff0c;我想那个思想的小火花一定还在&#xff0c;在某处酝…

Jenkins概念及安装配置教程(三)

如何配置Jenkins&#xff1f; Jenkins 中的用户管理 要在 Jenkins 中管理用户&#xff0c;您应该导航到管理 Jenkins &#x1f86a; 配置全局安全。理想的选择是让 Jenkins 拥有自己的用户数据库。您可以创建一个只有读取权限的匿名用户。为您打算在下一步中添加的用户创建条…

【ARMv8 SIMD和浮点指令编程】NEON 加法指令——加法都能玩出花

向量加法包括常见的普通加指令&#xff0c;还包括长加、宽加、半加、饱和加、按对加、按对加并累加、选择高半部分结果加、全部元素加等。如果你和我一开始以为的只有一种普通加&#xff0c;那就太小看设计者了&#xff01;同时这么多加法指令的确会提升我们设计程序的效率&…