搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
做程序猿的老婆应该注意的一些事情
2
Java实现数据结构——双链表
3
git基本使用步骤_git health
4
Hadoop 之 Hive 4.0.0-alpha-2 搭建(八)_hive alpha
5
五、Pyqt5事件、信号和槽
6
基于jsp的高校网上订餐系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)_基于jsp和数据库实现网上订餐系统
7
bip32,39,44...........在线工具_bip32在线计算
8
重新开始!大前端+实时渲染+Al_前端实时渲染
9
AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.31-2024.04.05_vllm视觉语言大模型
10
如何训练一个大语言模型(LLMs)_大语言模型训练过程
当前位置:
article
> 正文
Redis④ —— 高可用
作者:知新_RL | 2024-07-19 22:14:16
赞
踩
Redis④ —— 高可用
1. 主从复制
一主多从模式,采用读写分离的方式
主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。
主从服务器之间的命令复制是
异步
进行的
1.1 第一次同步
建立连接、协商同步
主服务器会把所有的数据都同步给从服务器(全量复制)。
主服务器同步数据给从服务器
主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器
从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件(异步)
为了保证主从服务器的数据一致性,
主服务器在下面这三个时间间隙中将收到的写操作命令,写入到 replication buffer 缓冲区里
主服务器生成 RDB 文件期间;
主服务器发送 RDB 文件给从服务器期间;
从服务器加载 RDB 文件期间;
主服务器发送新写操作命令给从服务器
主服务器将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,从服务器执行来自主服务器 replication buffer 缓冲区里发来的命令,这时主从服务器的数据就一致了
1.2 命令传播
主从服务器在完成第一次同步后,双方之间就会维护一个 TCP 连接。
连接是长连接的,目的是避免频繁的 TCP 连接和断开带来的性能开销
1.3 分摊主服务器的压力
从服务器可以有自己的从服务器,可以把拥有从服务器的从服务器当作经理角色,它不仅可以接收主服务器的同步数据,自己也可以同时作为主服务器的形式将数据同步给从服务器
通过这种方式,
主服务器生成 RDB 和传输 RDB 的压力可以分摊到充当经理角色的从服务器
。
1.3.1 增量复制
网络断开又恢复后,从主从服务器会采用
增量复制
的方式继续同步,也就是只会把网络断开期间主服务器接收到的写操作命令,同步给从服务器。
主服务器怎么知道要将哪些增量数据发送给从服务器呢
repl_backlog_buffer
,是一个「
环形
」缓冲区,用于主从服务器断连后,从中找到差异的数据;
replication offset
,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用 master_repl_offset 来记录自己「
写
」到的位置,从服务器使用 slave_repl_offset 来记录自己「
读
」到的位置。
如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用
增量同步
的方式;
相反,如果判断出从服务器要读取的数据已经不存在 repl_backlog_buffer 缓冲区里,那么主服务器将采用
全量同步
的方式。
2. 哨兵机制
实现
主从节点故障转移
。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端
哨兵其实是一个运行在特殊模式下的 Redis 进程,相当于是“观察者节点”,观察的对象是主从节点。
主要负责三件事情:
监控、选主、通知
。
哨兵节点通过 Redis 的发布者/订阅者机制,哨兵之间可以相互感知,相互连接,然后组成哨兵集群,同时哨兵又通过 INFO 命令,在主节点里获得了所有从节点连接信息,于是就能和从节点建立连接,并进行监控了。
流程:
判断主节点下线
某个哨兵判定主节点下线(主观下线)后,就会向其他哨兵发起命令,其他哨兵收到这个命令后,就会根据自身和主节点的网络状况,做出赞成投票或者拒绝投票的响应。当赞成数到达预定值后,标记为客观下线
选出哨兵leader
拿到半数以上的赞成票
拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值
哨兵leader进行主从故障转移
在已下线主节点(旧主节点)属下的所有「从节点」里面,挑选出一个从节点,并将其转换为主节点,选择的规则:
过滤掉已经离线的从节点
过滤掉历史网络连接状态不好的从节点
将剩下的从节点,进行三轮考察:优先级、复制进度、ID 号。在每一轮考察过程中,如果找到了一个胜出的从节点,就将其作为新主节点
让已下线主节点属下的所有「从节点」修改复制目标,修改为复制「新主节点」
将新主节点的 IP 地址和信息,通过「发布者/订阅者机制」通知给客户端
继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点
3. 切片集群模式
当 Redis 缓存数据量大到一台服务器无法缓存时,就需要使用
Redis 切片集群
方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。
采用哈希槽(Hash Slot),来处理数据和节点之间的映射关系。
一个切片集群共有 16384 个哈希槽
,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中
根据键值对的 key,按照 CRC16 算法 计算一个 16 bit 的值
再用 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽
哈希槽怎么被映射到具体的 Redis 节点上的呢
平均分配:
在使用 cluster create 命令创建 Redis 集群时,Redis 会自动把所有哈希槽平均分布到集群节点上。比如集群中有 9 个节点,则每个节点上槽的个数为 16384/9 个。
手动分配:
可以使用 cluster meet 命令手动建立节点间的连接,组成集群,再使用 cluster addslots 命令,指定每个节点上的哈希槽个数。
在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作
4. 集群脑裂
4.1 什么是脑裂?
由于网络问题,主节点与从节点失联,但是主节点与客户端网络正常,客户端仍然向主节点写数据,但是此时主节点无法同步数据给从节点。哨兵模式选举新的leader作为主节点,这时集群有两个主节点了。
4.2 为什么集群脑裂会导致数据丢失?
网络好了之后,哨兵会把原来的主节点降级为从节点,然后从节点会向新的主节点请求数据同步。
第一次同步是全量同步,该从节点会清除自己本地的数据,然后再全量同步。这样会导致客户端之前写入的数据都丢失了
4.3 如何解决
当主节点发现从节点下线或者通信超时的总数量小于阈值时,那么禁止主节点进行写数据,直接把错误返回给客户端。
等到新主库上线时,就只有新主库能接收和处理客户端请求,此时,新写的数据会被直接写到新主库中。而原主库会被哨兵降为从库,即使它的数据被清空了,也不会有新数据丢失。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/853786
推荐阅读
article
Red
is
连接报错:ERR Client
sent
AUTH, but no
password
is
...
【代码】Red
is
连接报错:ERR Client
sent
AUTH, but no
password
is
set
或...
赞
踩
article
【
red
is
】解决
red
is
连接错误:ERR Client
sent
AUTH,
but
no
pa...
解决
red
is
连接错误:ERR Client
sent
AUTH,
but
no
password
is
set
_: e...
赞
踩
article
【
Red
is
】安装
Red
is
后报ERR Client
sent
AUTH,
but
no passw...
安装
Red
is
后使用
auth
验证是否安装成功(或者其它应用访问red
is
时报错),报ERR Client
sent
AU...
赞
踩
article
链接Red
is
时出现 “ERR Client
sent
AUTH
, but no
password
...
Java链接Red
is
时出现 “ERR Client
sent
AUTH
, but no
password
is
set
...
赞
踩
article
解决
redis
报错:ERR C
lient
sent
AUTH
, but no password_se...
默认无密码登录,但是你输入了密码。1、不输入密码登录;2、在
redis
目录下
redis
.windows-service....
赞
踩
article
redis
设置
密码
验证...
1、找到配置文件:如/etc/
redis
/
redis
.conf2、找到以下内容# requirepass foobare...
赞
踩
article
Ubuntu22.04安装
jdk8
、
redis
、
srs
...
Ubuntu22.04安装
jdk8
、
redis
、
srs
_ubuntu22.04安装
jdk8
ubuntu22.04安装jd...
赞
踩
article
了解
一
下
Redis
并在 CentOS
下
进行
安装
配置
_《了解
一
下
redis
并在
centos
...
了解
一
下
Redis
Redis
是一个开源、支持网络、基于内存、键值对的 Key-Value 数据库,使用 ANSI C...
赞
踩
article
Redis
-
分布式
锁
(
基本原理
和不同
实现
方式
对比)...
多个线程都能看到相同的结果,注意:这个地方说的可见性并不是并发编程中指的内存可见性,只是说多个进程之间都能感知到变化的意...
赞
踩
article
Spring
Boot
2.x 集成
Redis
缓存
_
springboot2
redis
声明式
缓存
...
allEntries 是否清空所有
缓存
内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有
缓存
。每...
赞
踩
article
【
Spring
Boot
3】【
Redis
】集成
Jedis
_
springboot3
jedis
...
本文提供了一种快速实现
Spring
Boot
3应用集成
Redis
Jedis
的方法,详细介绍了开发环境、工程目录结构、...
赞
踩
article
如何使用
Spring
Boot框架整合
Redis
:超详细案例教程_
spring
-
boot
-start...
成功在
Spring
Boot 项目中整合了
Redis
并配置了连接池。我们使用连接池可以显著提高
Redis
操作的...
赞
踩
article
MySQL
数据库
类型和常见的
关系
型
数据库
【
MySQL
-2】常见的非
关系
型
数据库
管理系统
有Memcac...
服务器跳转_
mysql
不属于非
关系
型
数据库
的是
mysql
不属于非
关系
型
数据库
的是 【1】...
赞
踩
article
可视化
工具
Another
-
Redis
-
Desktop
-
Manager
的安装与使用_
another
...
Redis
是一种快速、高效的NoSQL数据库,广泛用于缓存、会话管理、消息队列等领域。为了更方便地管理
Redis
实例、监...
赞
踩
article
docker
部署
redis
,并使用
rdm
连接
redis
_
redis
rdm
...
docker
部署
redis
,并使用
rdm
连接
redis
_
redis
rdm
redis
rdm
...
赞
踩
article
Redis
Desktop
Manager
:一款强大的图形化
Redis
管理工具
...
Redis
Desktop
Manager
:一款强大的图形化
Redis
管理工具
项目地址:https://gitcode....
赞
踩
article
Redis
Desktop
Manager
安装及简单教程_
redisdesktopmanager
...
Redis
可视化工具的安装与界面功能的简单使用_
redisdesktopmanager
redisdesktopmanag...
赞
踩
article
Redis
Desktop
Manager
下载、安装、使用,想跳槽的朋友必看_
redis
-deskt...
本文介绍了如何下载并安装
Redis
Desktop
Manager
以连接本地
Redis
服务器,同时分享了一个针对初中级前端工...
赞
踩
article
【
Redis
】
Redis
的
安装
及
图形化
界面
Redis
DeskTop
Manager
的
安装
与使...
Redis
是一个 key-value 存储系统。string(字符串)、list(链表)、set(集合)、zset(so...
赞
踩
article
Redis
Desktop
Manager2022
中文 附安装教程(附使用)_
redis
deskt...
Redis
Desktop
Manager2022
中文安装及使用_
redis
desktop
manager 2022r...
赞
踩
相关标签
redis
数据库
缓存
java
spring boot
spring
jedis
ubuntu
分布式
分布式锁