Redis 主从复制+哨兵+集群

1、总结写在前面

Redis 集群 = 数据分片 + 高可用性

Redis 哨兵 = 主从复制 + 故障转移

2、主从复制

2.1、准备配置

查看docker 容器 ip

docker inspect 容器id | grep IPAddress

docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

修改配置文件

初始配置文件见 => redis.conf

  • 远程访问
    • bind 0.0.0.0
    • protected-mode no
  • 主机设置
    • replicaof 172.17.0.2 6379
  • 主机访问密码
    • masterauth 111111

redis_6379.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6379.pid
logfile "/data/6379.log"
dbfilename dump6379.rdb
dir /data
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

redis_6380.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6380.pid
logfile "/data/6380.log"
dbfilename dump6380.rdb
dir /data
replicaof 172.17.0.2 6379
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

redis_6381.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6381pid
logfile "/data/6381.log"
dbfilename dump6381.rdb
dir /data
replicaof 172.17.0.2 6379
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

2.2、启动

docker run --name redis79  \
-v /usr/local/redis7.2.4/6379/data:/data  \
-v /usr/local/redis7.2.4/6379/conf:/usr/local/etc/redis \
-p 6379:6379 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6379.conf --port 6379
docker run --name redis80  \
-v /usr/local/redis7.2.4/6380/data:/data  \
-v /usr/local/redis7.2.4/6380/conf:/usr/local/etc/redis \
-p 6380:6380 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6380.conf --port 6380
docker run --name redis81  \
-v /usr/local/redis7.2.4/6381/data:/data  \
-v /usr/local/redis7.2.4/6381/conf:/usr/local/etc/redis \
-p 6381:6381 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6381.conf --port 6381

在这里插入图片描述

查看主从信息 info replication
在这里插入图片描述

主从关键点演示

从机不可以执行写命令

在这里插入图片描述

从机从头开始复制

先下线6381(此时master未插入数据),之后master执行set,再上线6381,6381复制master全量数据

在这里插入图片描述

主机下线后,主从关系不会变化

可以看到 redis79下线再上线,主从关系没有变化,只是从机的 master_link_status up down转换
在这里插入图片描述

2.3、主从复制工作流程

  1. 建立连接
    • 节点发送slaveof命令与主节点建立连接
  2. 数据同步
    • 主节点会执行bgsave命令生成RDB快照文件,并将其发送给从节点
    • 全量复制=>在节点初始化时,将主节点的数据一次性同步到从节点
    • 增量复制=>同步自上次同步之后发生变更的数据(从机重启之后增量复制,具体是记录一个偏移量)
  3. 命令传播
    • 同步完成后,进入命令传播阶段,在此阶段,主节点将持续向从节点发送写命令

3、Redis哨兵

由于主从复制在master挂了之后,不会自动选取新的master,故引入哨兵。哨兵监控master和slave,当master挂了之后,在slave中选出新master

sentinel.conf

3.1、准备配置

查看 master 容器 IP,用于后面设置 master IP
在这里插入图片描述

sentinel26379.conf

protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel26379.pid
logfile "/data/sentinel26379.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

sentinel26380.conf

protected-mode no
port 26380
daemonize yes
pidfile /var/run/redis-sentinel26380.pid
logfile "/data/sentinel26380.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

sentinel26381.conf

protected-mode no
port 26381
daemonize yes
pidfile /var/run/redis-sentinel26381.pid
logfile "/data/sentinel26381.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

3.2、启动Redis

docker run --name redis6379  \
-v /usr/local/redis7.2.4/6379/data:/data  \
-v /usr/local/redis7.2.4/6379/conf:/usr/local/etc/redis \
-p 6379:6379 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis_6379.conf --port 6379

3.3、启动哨兵

docker run --name redis-sentinel26379 \
-v /usr/local/redis7.2.4/6379/conf/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf \
-d 9b38108e295d
docker exec -it redis-sentinel26379 /bin/bash
redis-sentinel /usr/local/etc/redis/sentinel.conf

3.4、效果

所有启动的容器展示

在这里插入图片描述

搭建完成后主从关系

在这里插入图片描述

下线 6379 主机之后再上线主从关系

选举新的master,旧主变为slave

在这里插入图片描述

3.4、哨兵运行流程和选举原理

1、哨兵集群监控 master

2、sdown : sentinel 发送心跳包,一定时间没有收到master的回复,就认为主观下线

3、odown : 当有 quorum 个 sentinel 认为主观下线,就认为 master 客观下线

4、选出哨兵 leader (RAFT算法)

5、哨兵 leader 选出新master slaveof on one

- 比较优先级 `repliica-priority`  (优先级数值小的)
- 比较复制偏移量 `offset` (偏移量大的)
  • 比较 run id (run id 小的)

6、leader 让其他 slave 认新master

7、leader 让老master 降级,成为新 master 的 slave

3.5、哨兵使用建议

1、使用哨兵集群,保证高可用

2、哨兵节点的数量应该为奇数

3、哨兵集群 + 主从复制,不能保证数据零丢失

4、Redis集群

Redis 集群 = 数据分片 + 高可用性。在这种模式下,数据被分散存储在多个节点上,每个节点只保存部分数据。这提高了系统的可扩展性和性能。通过一致性哈希,集群能够实现自动的数据分片,同时通过节点间的通信保持数据的同步和状态的一致。

Redis 哨兵 = 主从复制 + 故障转移。当主节点发生故障时,哨兵节点会自动将从节点升级为新的主节点,并通知其他从节点和客户端更新配置。这种模式的优势在于其自动化的故障恢复机制,提高了系统的可用性,并且配置简单。

业务需要处理大量数据并且要求高性能,集群模式更合适

业务对数据量的要求不高,但希望建立一个简单且具有高可用性的缓存系统,哨兵模式更合适

4.1、槽映射实现方法和对比

在这里插入图片描述

4.2、集群搭建

配置基本相同,改下端口和文件名

bind 0.0.0.0
protected-mode no
port 7301
logfile "/data/cluster7301.log"
pidfile /data/cluster7301.pid
dir /data
dbfilename dump7301.rdb
appendonly yes
appendfilename "appendonly7301.aof"
requirepass 111111
masterauth 111111
 
cluster-enabled yes
cluster-config-file nodes-7301.conf
cluster-node-timeout 5000

启动六个实例

docker run --name redis7301  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7301.conf:/usr/local/etc/redis/redis.conf \
-p 7301:7301 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7301
docker run --name redis7306  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7306.conf:/usr/local/etc/redis/redis.conf \
-p 7306:7306 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7306

启动容器并查看IP

docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

在这里插入图片描述

构建主从关系

进入容器 redis 7301

docker exec -it redis7301 /bin/bash

将六个节点加入到集群,一主一从

redis-cli -p 7301 -a 111111 --cluster create --cluster-replicas 1 \
172.17.0.7:7306 \
172.17.0.6:7305 \
172.17.0.5:7304 \
172.17.0.4:7303 \
172.17.0.3:7302 \
172.17.0.2:7301

在这里插入图片描述

查看集群和节点状态

在这里插入图片描述

操作集群

集群需要路由到位 ,即命令中添加 -c

在这里插入图片描述

查看key属于哪个槽

cluster keyslot key

在这里插入图片描述

4.3、主从切换(演示)

在这里插入图片描述

在这里插入图片描述

4.4、故障转移(演示)

redis7306 重新上线后,主从关系变了,为了改回初始的主从关系,登录到原来的主机使用 cluster failover

在这里插入图片描述

4.5、扩容(演示)

docker run --name redis7307  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7307.conf:/usr/local/etc/redis/redis.conf \
-p 7307:7307 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7307
docker run --name redis7308  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7308.conf:/usr/local/etc/redis/redis.conf \
-p 7308:7308 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7308
redis-cli -a 111111 -p 7301  --cluster add-node \
172.17.0.8:7307 \
172.17.0.2:7301

redis-cli -a 111111 -p 7301 --cluster add-node 要加入的节点信息【IP:PORT】 集群中任一节点信息【IP:PORT】

在这里插入图片描述

查看集群状态(新节点未分配槽位)

redis-cli -a 111111 -p 7301 --cluster check 【IP:PORT】 集群中的任一节点都能得到信息

重新分配槽位

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

分配从节点

redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli -a 111111 -p 7301 --cluster add-node \
172.17.0.9:7308 \
172.17.0.8:7307 \
--cluster-slave --cluster-master-id 4a849f4b3d5e9e6bbf4412e8c86e7904477f4d4b

在这里插入图片描述

在这里插入图片描述

4.6、缩容(演示)

删除从节点7308

命令:redis-cli -a 密码 --cluster del-node ip:端口 节点ID

redis-cli -a 111111 -p 7301 --cluster del-node 172.17.0.9:7308 14cca2509252d583b06d3fe521eed8661f7efc15

将主节点7307的槽位重新分配给其他主节点

redis-cli -a 111111 --cluster reshard 172.17.0.2:7301

在这里插入图片描述

槽位重新分配,7307也变为从节点

在这里插入图片描述

删除原主节点7307

redis-cli -a 111111 -p 7301 --cluster del-node 172.17.0.8:7307 4a849f4b3d5e9e6bbf4412e8c86e7904477f4d4b

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始搭建创业公司全新技术栈解决方案

从零开始搭建创业公司全新技术栈解决方案 关于猫头虎 大家好,我是猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体…

Zookeeper 一、Zookeeper简介

1.分布式系统定义及面临的问题 分布式系统是同时跨越多给物理主机,独立运行的多个软件所组成的系统。类比一下,分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组…

Flink 流批一体场景应用及落地情况

摘要:本文由阿里云 Flink 团队苏轩楠老师撰写,旨在介绍 Flink 流批一体在几个常见场景下的应用。内容主要分为以下四个部分: 主要场景 落地情况 未来展望 总结 上篇:流批一体技术简介 在上篇文章中,给大家整体介绍…

有关计算素数的算法

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝黑暗的笼罩更会凸显光明的可贵! 一、引言 什么是素数 素数,也被称为质数,是指在大于1的自然数中,只能被1和它本身…

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

小程序中用font-spider压缩字体后,字体没效果(解决办法)

因为项目中需要引入外部字体,有两种方案, 第一是把字体下载到本地, 第二种是cdn请求服务器放字体的地址 但是小程序是有大小限制的,所以必须要压缩字体大小,这时候有些人就说了,那把字体放在服务器上&a…

从复用性角度阐述中台建设

目录 复用性中台定义深思中台建设产品线形态何时演变中台能力落地中台 业务中台架构总结 技术学习永不止步,最近也是看了很多关于架构设计相关的专栏,慢慢总结出来一部分知识,代入自己的思考与理解,以及结合并反思自己之前公司的架…

windows和linux下清空Redis

前言 在本文中,我们将详尽阐述在Windows与Linux操作系统中有效清除Redis缓存的实践方法,旨在为您提供清晰、高效的指导流程,确保数据管理的灵活性与效率。 windows下推荐两款可视化工具 Another Redis Desktop Manager 这是我用的最多也是最…

安卓手机删除的照片如何恢复?2个有效方法,教你找回

手机相册就像是我们的私人宝藏,里面装满了无数珍贵的回忆。但是,如果你不小心把里面的宝贝照片给删了,那可真是让人欲哭无泪啊!删除的照片如何恢复?今天,我要给你介绍几个方法,让你轻松找回那些…

网络编程(二)TCP编程 TCP粘包问题

文章目录 一、TCP网络编程(一)流程(二)相关函数1. socket2. bind3. listen4. accept5. connect 二、收发函数(一)send函数(二)recv函数 三、TCP粘包问题(一)将…

linux精通 4.1

2.1.3 http服务器实现 目的 reactor应用——webserver webclient 每次上课前 看大纲down code 复习: 不行啊 编译给的代码报错啊 给的最新的不是0430那一版就不行啊 reactor.c:(.text0x254): relocation truncated to fit: R_X86_64_PC32 against symbol begin de…

Gobject tutorial 八

The GObject base class Object memory management Gobject的内存管理相关的API很复杂,但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下,与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…

车载测试面试项目看这一套就够了!车载测试___自我讲解项目

面试官您好,我叫xx来自安微,今年xx岁,毕业于安微新华学院,我是从2017年开始接触软件测试行业,目前从事软件测试工作有5年多时间,第一家公司做了电商和进销存项目app和web都有做过,上家公司做了车…

Python使用策略模式实现绘图功能

策略模式(Strategy Pattern):允许定义一系列算法,将它们封装起来,使得它们可以互换。 实现绘制不同类型的图表(如折线图、柱状图和饼图)功能。 下面是一个示例,展示如何传入横坐标和纵坐标内容…

Spring Boot集成tablesaw插件快速入门

1 什么是tablesaw? Tablesaw是一款Java的数据可视化库,主要包括两部分: 数据解析库,主要用于加载数据,对数据进行操作(转化,过滤,汇总等),类比Python中的Pandas库; 数据…

JVM中的垃圾回收机制

文章目录 什么是垃圾为什么需要垃圾回收早期垃圾回收Java的垃圾回收机制垃圾回收主要关注的区域垃圾判定算法引用计数算法可达性分析算法 垃圾收集算法标记清除算法复制算法标记整理算法分代收集思想增量收集算法分区算法 什么是垃圾 垃圾回收(Garbage Collection&…

Java面试八股之Mybatis和JPA的区别

Mybatis和JPA的区别 Mybatis 和 JPA(Java Persistence API)是两种在 Java 应用程序中用于数据持久化的框架,它们各有特点和适用场景。下面是它们之间的一些主要区别: 映射方式: Mybatis 是半自动的 ORM 框架&#xf…

Vue66-vue-默认插槽

一、默认插槽需求 1-1、原本的写法: 在每个category组件中用v-show来做条件渲染,但是不方便! 1-2、默认插槽 img标签,ul标签,video标签,都是在app组件中完成解析之后,塞到category组件中的&…

实验室装修公司教你:真菌实验室设计建设的必备技巧

在当今的科学研究和生物技术领域,真菌实验室设计建设显得尤为重要。然而,很多实验室在实际操作中常常面临空间布局不合理、设备配置不当以及环境控制不到位等诸多挑战,导致实验效率低下,甚至危及人员安全。那么要怎么才能设计建设…

【Unity】AssetBundle打包策略

【Unity】AssetBundle打包策略 在游戏开发过程中,AssetBundle(AB)打包策略的重要性不容忽视。游戏开发者往往手动设置游戏资源包名进行管理,难免会造成资源确实或导致冗余,因此对于AB包的打包流程来说,进行策略管理显得十分重要。…