当前位置: 首页 > news >正文

Redis-哨兵模式以及集群

在开始这部分内容之前需要先说一下复制功能,因为这是Redis实现主从数据同步的实现方式。

  1. 复制功能

如果存在两台服务器的话,我们可以使用redis的复制功能,让一台服务器去同步另一台服务器的数据。现在我启动了两台redis服务器,一个端口是6379,一个端口是6380。

我们在6380的客户端执行命令: slaveof 127.0.0.1 6379

让80服务器去复制79的数据:在6380这台服务器去复制6379的数据(后面将6379称为主服务器,6380称为从服务器);

127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
=============在6379新增一条数据========
127.0.0.1:6379> set hello 6380
OK
=============在6380取这条数据========
127.0.0.1:6380> get hello
"6380"

复制功能的实现:

在以前的Redis版本中复制功能主要是通过同步和命令传播两个动作来完成的。

同步操作就是从服务器向主服务器发送SYNC命令,主服务器收到SYNC命令后执行BGSAVE命令(前面持久化文章讲过),就会在后台生成一个RDB文件,然后使用一个缓冲区记录从现在开始执行所有的些命令,执行完BGSAVE命令之后主服务器就把RDB文件发个从服务器,然后将缓冲区命令发送给从服务器,从服务器收到之后就会执行这个文件的命令,同步状态;

在执行完同步操作之后,两个服务器的状态基本一致了,但是在这过程中可能会存在数据不一致的情况,比如说它们刚刚执行完同步,那么这时候主服务器删除了某个键,这时候两个服务器的状态就不一致了;为了解决这个问题主服务器就需要对从服务器执行 命令传播 操作,主服务器会将自己的些命令(就是造成数据不一致的那条命令),发送给从服务器执行,这样两个服务器的命令就会一致了。

刚刚讲的是以前老版Redis的复制实现,这样的复制方式存在一定的缺陷,比如说主服务器在命令传播的过程中突然断线了,从服务器去重新同步主服务器的状态效率是非常低的,还有就是SYNC命令是一个非常消耗资源的操作。

在Redis2.8版本之后,开始使用PSYNC命令代替原来的SYNC命令,这个命令可以实现完全同步和部分重同步,就解决了SYNC命令的断线后重复复制的低效率问题;部分重同步就是断线后重连只需要同步它们存在差异的数据,不用全部去重新同步。

2.Sentinel(哨兵模式)

哨兵模式是Redis高可用性的解决方案,我们前面讲的主从复制存在一个问题就是当主服务器挂了之后需要人为的干预才能恢复Redis的正常使用,Sentinel系统可以监视我们的这些主从服务器,当主服务器下线的时候,Sentinel系统会从主服务器下的某个服务器升级升级为新的主服务器,然后会由新的服务器来提供服务。

搭建一个Sentinel系统:

当我们安装了一个redis服务器后,在根目录下有一个sentinel.conf文件,编辑这个文件,可以看到这么一行配置:

sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster pwd654321 #如果有密码就要输入密码

这就是配置我们监听的服务器,最后面这个1的意思是 确认主节点下线的sentinel数量,1表示只要有一台sentinel判断他下线了,就可以确认他下线了。

在src目录下有一个文件:

就是启动哨兵模式:

./redis-sentinel ../sentinel.conf 

测试:

端口为6379是我搭建的主服务器,端口为6380是我搭建的从服务器,这时候我们把主服务器关闭。

登录从服务器看角色:

可以看到它已经是master了,说明sentinel生效了。

主服务器的竞选规则:

在redis.conf 中的 replica-priority 选项来设置竞选新主节点的优先级,它的默认值是 100,它的最大值也是 100,这个值越小它的权重就越高,例如从节点 A 的 replica-priority 值为 100,从节点 B 的值为 50,从节点 C 的值为 5,那么在竞选时从节点 C 会作为新的主节点。但是当优先级相等的时候就会判断复制偏移量,偏移量大的从节点生效,如果偏移量也相等的话,那就是运行时随机生成ID较小的那个服务器被选为主服务器。

工作原理:

哨兵的工作原理是这样的,首先每个 Sentinel 会以每秒钟 1 次的频率,向已知的主服务器、从服务器和以及其他 Sentinel 实例,发送一个 PING 命令。

如果最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 所配置的值(默认 30s),那么这个实例会被 Sentinel 标记为主观下线。

如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有 Sentinel 节点,要以每秒 1 次的频率确认 主服务器的确进入了主观下线状态。

如果有足够数量(quorum 配置值)的 Sentinel 在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。此时所有的 Sentinel 会按照规则协商自动选出新的主节点。

  1. 集群

Redis集群是将数据分布在不同的服务器上,来降低系统对主节点的依赖,可以提高服务器的读写性能;Redis把所有的数据分为16384个槽,每个节点都可以负责其中的一部分槽位;

Redis集群是无代理模式去中心化的运行模式,客户端发送的绝大多数命令会直接交给相关的节点运行,这样的话大部分的请求命令都无需转发,或者仅仅转发一次就可以完成请求与响应,所以集群单个节点的性能与单机Redis服务器的性能非常接近,因此当水平扩展一倍的主节点就相当于请求处理的性能也提高了一倍。

搭建Redis集群

在redis源码中提供了集群的快速搭建集群的工具,这种搭建方式比较简单比较轻量适合用来学习和做一些小测试,在正式使用中还是需要手动配置。

在redis安装根目录下,有一个utils的文件夹

我们直接执行这个文件夹下的create-cluster:

[root@localhost create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

接下来需要把以上创建的 6 个节点通过 create 命令组成一个集群,执行如下:

./create-cluster create 

在执行的过程中会询问你是否通过把 30001、30002、30003 作为主节点,把 30004、30005、30006 作为它们的从节点,输入 yes 后会执行完成。

创建完成后就可以使用客户端连接了

[root@localhost create-cluster]# redis-cli -c -p 30001
127.0.0.1:30001> cluster nodes
5cb57688027850bfe3e4ea624b93c3ac94c85be7 127.0.0.1:30005@40005 slave d1402bfe3bc06d6b54b627570911bacd785f9fd4 0 1676725685276 2 connected
c6be86f41ce5e4dd83a8c712757882853153e487 127.0.0.1:30003@40003 master - 0 1676725685276 3 connected 10923-16383
d1402bfe3bc06d6b54b627570911bacd785f9fd4 127.0.0.1:30002@40002 master - 0 1676725685072 2 connected 5461-10922
3ddc1b69166c62a041fa55c2f52f7b4c730ad5d6 127.0.0.1:30004@40004 slave a26f8956893115813849bdcc795403f7f2a8cd35 0 1676725685276 1 connected
a26f8956893115813849bdcc795403f7f2a8cd35 127.0.0.1:30001@40001 myself,master - 0 1676725685000 1 connected 0-5460
375512950f3a13179217ab3524d8ee8ff3bbb0b0 127.0.0.1:30006@40006 slave c6be86f41ce5e4dd83a8c712757882853153e487 0 1676725685276 3 connected
127.0.0.1:30001> 

可以看出 30001、30002、30003 都为主节点,30001 对应的槽位是 0~5460,30002 对应的槽位是 5461~10922,30003 对应的槽位是 10923~16383,总共有槽位 16384 个(0~16383)。

create-cluster 搭建的方式虽然速度很快,但是该方式搭建的集群主从节点数量固定以及槽位分配模式固定,并且安装在同一台服务器上,所以只能用于测试环境。

槽定位算法:

Redis集群工作的槽位是16384个,每一个主节点负责维护一部分槽以及槽所映射的键值数据,Redis集群默认会对要存储的key值使用CRC16算法进行hash得到一个整数,然后对槽位个数进行取模来得到具体槽位:slot =CRC16(key)%16383

总结

首先介绍了Redis的复制功能,然后讲了Redis的两种高可用方案哨兵模式和集群模式,之前我刚进公司实习那会,我们架构师会让我们每个月写总结嘛,具体就是我们所在项目的使用的中间件,其中就跟我说的是你要去看看我们项目中用了那些中间件,比如说用了Redis你就要看看用的什么模式,什么持久化方案、以及项目中怎么使用的等等,那个时候开始我才真正的去买书网上找资料来看,学完之后对我现在的工作帮助非常大。

相关文章:

Redis-哨兵模式以及集群

在开始这部分内容之前需要先说一下复制功能,因为这是Redis实现主从数据同步的实现方式。复制功能如果存在两台服务器的话,我们可以使用redis的复制功能,让一台服务器去同步另一台服务器的数据。现在我启动了两台redis服务器,一个端…...

过滤器和监听器

1、过滤器Filter 作用是防止SQL注入、参数过滤、防止页面攻击、空参数矫正、Token校验、Session验证、点击率统计等等; 使用Filter的步骤 新建类,实现Filter抽象类;重写init、doFilter、destroy方法;在SpringBoot入口中添加注解…...

Acwing 第 91 场周赛

Powered by:NEFU AB-IN B站直播录像! Link 文章目录Acwing 第 91 场周赛A AcWing 4861. 构造数列题意思路代码B AcWing 4862. 浇花题意思路代码C AcWing 4863. 构造新矩阵题意思路代码Acwing 第 91 场周赛 A AcWing 4861. 构造数列 题意 略 思路 将每个数的每一位…...

JavaEE|套接字编程之UDP数据报

文章目录一、DatagramSocket API构造方法常用方法二、DatagramPacket API构造方法常用方法E1:回显服务器的实现E2:带有业务逻辑的请求发送一、DatagramSocket API 在操作系统中,把socket对象当成了一个文件处理。等价于是文件描述符表上的一项。 普通的文件&#xf…...

如何使用Python创建一个自定义视频播放器

目录 1、安装vlc的64位版本。 2、安装python的vlc模块。 3、编写如下代码,包含了播放,暂停,停止、音量控制功能。 4、来看一看运行结果。 5、如果遇到播放不了的问题,解决方式如下: 这个例子使用VLC作为视频播放器…...

Elasticsearch进行优化-使用索引拆分(Split)和索引收缩(shrink )

一、索引拆分和收缩的场景 在Elasticsearch集群部署的初期我们可能评估不到位,导致分配的主分片数量太少,单分片的数据量太大,导致搜索时性能下降,这时我们可以使用Elasticsearch提供的Split功能对当前的分片进行拆分&#xff0c…...

数论 —— 高斯记号(Gauss mark)

定义 数学上,高斯记号(Gauss mark)是指对取整符号和取小符号的统称,用于数论等领域。 设 x∈Rx \in \textbf{R}x∈R,用 [x][x][x] 表示不超过 xxx 的最大整数。也可记作 [x][x][x]。设 x∈Rx \in \textbf{R}x∈R&…...

【随笔】程序员眼中的 CPU,“没有灵魂的躯体”

引言 先引用一段比较有意思的论述: 现实中每个人是由两部分构成,灵魂和躯体,灵魂依附于躯体游走于世间,现实中我们面对的每个人其实面对的是其灵魂而非肉体,肉体不过是表象而已。 灵魂本性乃一恶物,寄生于…...

算法的时间复杂度

算法在编写成可执行程序后,运行时需要消耗时间资源和空间(内存)资源,因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的。 时间复杂度主要衡量一个算法运行的快慢,而空间复杂度主要衡量一个算法运…...

华为OD机试 - 叠放书籍(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 五键键盘 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - IPv4 地址转换成整数 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 …...

进程间通信(重点)

概念 进程是一个独立的资源分配单元,不同进程之间的资源是独立的进程并非孤立的,不同进程需要进行信息的交互和状态的传递,因此需要进程之间的通信【IPC: Inter processes communication】 如qq聊天,qq在每个人的手机上是独立的…...

Reverse入门[不断记录]

文章目录前言一、[SWPUCTF 2021 新生赛]re1二、[SWPUCTF 2021 新生赛]re2三、[GFCTF 2021]wordy[花指令]四、[NSSRound#3 Team]jump_by_jump[花指令]五、[NSSRound#3 Team]jump_by_jump_revenge[花指令]前言 心血来潮,想接触点Reverse,感受下Reverse&am…...

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用,在局域网内可以访问,但在外网不能访问。如何实现外网访问内网ip?主要有两种方案:路由器端口映射和快解析内网映射。根据自己本地网络环境,结合是否有公网IP,是否有路由权限,…...

[acwing周赛复盘] 第 91 场周赛20230218

[acwing周赛复盘] 第 91 场周赛20230218 一、本周周赛总结二、 4861. 构造数列1. 题目描述2. 思路分析3. 代码实现三、4862. 浇花1. 题目描述2. 思路分析3. 代码实现四、4863. 构造新矩阵1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 这周挺难的。T1 贪心分…...

蓝桥12届

小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位 二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 256MB 的空间可以存储多少个 32 位二进制整数?1MB 1024KB 1KB 1024字节(byte) 1字节 8位…...

华为OD机试 - 斗地主(JS)

斗地主 题目 斗地主起源于湖北十堰房县, 据传是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的, 如今已风靡整个中国,并流行于互联网上 牌型: 单顺,又称顺子,最少5张牌,最多12张牌(3...A),不能有2, 也不能有大小王,不计花色 例如:3-4-5-7-8,7-8-9-1…...

【MyBatis】| MyBatis的注解式开发

目录 一:MyBatis的注解式开发 1. Insert注解 2. Delete注解 3. Update注解 4. Select注解 5. Results注解 一:MyBatis的注解式开发 MyBatis中也提供了注解式开发⽅式,采⽤注解可以减少Sql映射⽂件的配置。 当然,使⽤注…...

python自制PDF转换.PNG格式图片(按每页生成图片完整源码)小工具!

使用PyQt5应用程序制作PDF转换成图片的小工具,可以导入PDF文档后一键生成对应的PNG图片。 PDF图片转换小工具使用的中间件: python版本:3.6.8 UI应用版本:PyQt5 PDF文件操作非标准库:PyPDF2 PNG图片生成库&#xff1…...

Go 数组和切片反思

切片的底层数据结构是数组,所以,切片是基于数组的上层封装,使用数组的场景,也完全可以使用切片。 类型比较 我看到 go 1.17 有对切片和数组转换的优化,禁不住纳闷,有什么场景是必须数组来完成的呢&#x…...

win10电脑性能优化设置

win10电脑性能优化设置 目录win10电脑性能优化设置1.桌面图标显示2.wini2.1 “系统”2.1.1专注助手 关2.1.2 电源和睡眠 设置为从不2.1.3 存储 开2.2 网络和Internet2.3 个性化2.4 应用2.5 账户2.6 游戏2.7 隐私墨迹书写和键入个性化:关活动历史记录:全部…...

作为初学者必须要了解的几种常用数据库!

现在已经存在了很多优秀的商业数据库,如甲骨文(Oracle)公司的 Oracle 数据库、IBM 公司的 DB2 数据库、微软公司的 SQL Server 数据库和 Access 数据库。同时,还有很多优秀的开源数据库,如 MySQL 数据库,Po…...

小红书日常实习一面面经

时间:2月13下午 平台:赛码网,视频面大概70分钟顺序大致是下面,讲到哪问到哪,基础知识最好要结合项目或者实际回答,没录音不完全,有错误请指正首先面试官人超级好,细心提问,耐心解答问…...

将Nginx 核心知识点扒了个底朝天(一)

什么是Nginx? Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用ngin…...

SSM项目搭建保姆级教程

文章目录1、什么是SSM框架1.1、持久层1.2、业务层1.3、表现层1.4、View层1.5、SpringMVC执行流程1.6、MyBatis2、SSM实战搭建2.1、创建工程2.2、添加依赖2.3、配置spring.xml文件2.4、配置web.xml文件2.5、log4j.properties2.6、准备表2.7、实体类2.8、mapper2.9、service2.10、…...

LeetCode 350. 两个数组的交集 II

原题链接 难度:easy\color{Green}{easy}easy 题目描述 给你两个整数数组 nums1nums1nums1 和 nums2nums2nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现…...

Python可以解码吗,解码打码是如何实现的

前言 咳咳,进来的铁汁都是抱着学习的心态进来看的吧,咱今天不讲解解码,咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…...

Jackson 序列化:Cannot deserialize value of type `java.time.LocalDateTime`

问题描述 使用 jackson 反序列化异常如下: Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2023-02-13 19:43:01”: Failed to deserialize java.time.LocalDat…...

机试_3_数据结构(一)_习题

数据结构(一)——练习题 学习完第三章-数据结构(一)之后,当然要做相应地练习啦~ 注:上述习题都可以在牛客进行测试。 例如,第2题链接:计算表达式_牛客题霸_牛客网 (nowcoder.com)…...

《Hadoop篇》------HDFS与MapReduce

目录 一、HDFS角色职责总结 二、CheckPoint机制 三、Mapreduce序列化 四、Mapper 4.1、官方介绍 4.2、Split计算 4.3、Split和block对应关系 4.4、启发式算法 五、MapTask整体的流程 六、压缩算法 6.1、压缩算法适用场景 6.2、压缩算法选择 6.2.1、Gzip压缩 6.2…...

网络爬虫简介

前言 没什么可以讲的所以就介绍爬虫吧 介绍 网络爬虫(英语:web crawler),也叫网路蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 网路搜索引擎等站点通过…...

wordpress 封包apk/阿里指数在线查询

C语言中有许多基本的数据类型,如char,int,double等。char是字符类型,可以保存一个字符,int是整数类型,可以保存一个整数,double是双精度实型,可以保存一个实数。例如:cha…...

wordpress调用文章分类/搜索热度查询

表是5字段int类型,第一个字段是主健,自增字段 表结构: id int Uncheckedbillno bigint Uncheckedopid int Checkedbillopid int Checkedtag int Checked 存储过程: CREATE proc [dbo].[inbill]bills bigint,bille bigint,bil…...

烟台网站建设多少钱/刚刚传来最新消息

TAP主要安装于光纤网络中的两个或多个点之间提供实时网络信号监控报告功能。TAP一般有两种不同的类型,有源TAP和无源TAP。无源TAP是一种不需要电源的纯无源器件。它在企业数据中心中更为常见,用于创建网络可视性和增强网络安全性。无源TAP主要有两种技术…...

wordpress去掉google字体/武汉seo创造者

同学毕业设计做了一个Online Judge,应该是河海第一个自主的OJ雏形了,放在github上,我也凑了个热闹。 久闻git大名,一直没用过,昨天捣鼓了一下,几个比较不错的资料如下: 关于git: http://prog…...

阿里云空间可以做网站吗/外贸网站免费推广

一、诈骗罪的起刑点以及量刑是怎么规定的 1、诈骗罪起刑点为诈骗的公私财物价值达到三千元。 2、诈骗罪的量刑标准如下所述: (1)数额较大的,处三年以下有期徒刑、拘役或者管制,并处或者单处罚金; (2&am…...

慈溪做网站公司/线下推广渠道有哪些方式

http://www.putty.ws/Putty-wanquanshiyong putty中文站 转载于:https://www.cnblogs.com/kex1n/p/5088531.html...