【redis】redis部署1主2从3哨兵demo搭建示例
redis版本为7,搭建的架构为1主2从3哨兵的架构。本文是对搭建的过程做一个回忆,过程可能遗漏了某些步骤,见谅。
首先,需要有一个已经安装了的redis。我们从redis源码目录中,找到一个redis.conf文件,这个文件是redis作为server的配置文件模板,mkdir一个新的目录,将这个配置文件cp到新的目录中并对cv的新配置文件进行改动。
此外,还有一个sentinel.conf文件,这个是作为sentinel的配置文件,也可以复制过去。如果想要搭建一个demo,最小化配置即可,只需要简单几个配置放在一个新文件中,不需要复制这样的一个文件。

一,修改server配置文件
搭建的是demo,所以日志最好在前台输出,针对性的对配置文件做出修改如下:
对作为server的配置文件,需要准备3份,1主2从,port不同,其他的都和下面的配置一致即可。
#redis前台运行
daemonize no
#空字符串表示在前台输出
logfile ""
#指定端口
port 6379
二,修改sentinel配置文件
sentinel的最小化配置文件如下
#指定本台sentinel的端口为26379
port 26379
#指定的本机上的端口为6379的redis为master,master name叫mymaster,需要2台sentinel及以上,才能选举出新的master(本次共3台sentinel,为了防止脑裂,需要2台sentinel的选举结果一致)
sentinel monitor mymaster ::1 6379 2
#sentinel向其他sentinel广播自身ip时用的ip。如果是在一台机器上部署多个redis实例,这个配置是必写的。
sentinel announce-ip "127.0.0.1"
最后准备出如下的配置文件

三,启动伪集群
redis默认开机启动的话,需要先关闭redis,进入客户端后,关闭server
redis-cli -p 6379
127.0.0.1:6379> shutdown
或者
redis-cli -p 6379 shutdown
查看redis进程
ps -fe | grep redis
确认redis关闭完后,启动master
#redis-server后面跟配置文件的路径
redis-server ~/test/6379.conf
启动replica
#可以通过--replica ip port,在启动的时候就作为replica,
#也可以在客户端中,通过replicaof命令转为指定ip port的redis的replica,格式和上面一样,replica可以通过replicaof no one重新作为独立的server。
redis-server ~/test/6380.conf --replicaof localhost 6379
启动sentinel
#--sentinel表示这台redsi作为哨兵启动
#也可以通过redis-sentinel,取消最后的--sentinel,启动
redis-server ~/test/26379.conf --sentinel
四,测试哨兵
查看master或replica日志,看到master和replica的sync成功,说明主从数据同步成功。

依次启动哨兵,下图中为第一台哨兵,可以看到它监测到了2台replica和2台其他哨兵的启动

此时关闭master6379,哨兵会重新选举master,选举结束后不指定replicaof重新启动6379,6379变为新的master6380的replica。
#epoch1表示开启了一个新的纪元1,也就是说选举出来一个新的主人master。不得不说redis作者有点恶趣味的。
9667:X 31 Jul 2023 04:38:44.108 # +new-epoch 1
9667:X 31 Jul 2023 04:38:44.108 # +try-failover master mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:44.128 * Sentinel new configuration saved on disk
9667:X 31 Jul 2023 04:38:44.128 # +vote-for-leader 2588ffd5f5be5c93c66544b82b3d39dca44de508 1
9667:X 31 Jul 2023 04:38:44.130 # a87c3d3f480da6b1edc0c99f1187a20a1e332bfa voted for a87c3d3f480da6b1edc0c99f1187a20a1e332bfa 1
9667:X 31 Jul 2023 04:38:44.159 # 166b0a6fa12f54717be667b4eccd59ec5ff7015b voted for 2588ffd5f5be5c93c66544b82b3d39dca44de508 1
#监测到了master6379的失联
9667:X 31 Jul 2023 04:38:44.221 # +elected-leader master mymaster 127.0.0.1 6379
#6379是失联状态
9667:X 31 Jul 2023 04:38:44.221 # +failover-state-select-slave master mymaster 127.0.0.1 6379
#选举6380准备代替6379
9667:X 31 Jul 2023 04:38:44.321 # +selected-slave slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
#后面sentinel更新了自己的配置文件,并发送给了其他sentinel,等待6379失联的最终确定。
9667:X 31 Jul 2023 04:38:44.321 * +failover-state-send-slaveof-noone slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:44.374 * +failover-state-wait-promotion slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.197 * Sentinel new configuration saved on disk
9667:X 31 Jul 2023 04:38:45.197 # +promoted-slave slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.197 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.257 * +slave-reconf-sent slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:46.223 * +slave-reconf-inprog slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:46.223 * +slave-reconf-done slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
#最终确认6379失联了
9667:X 31 Jul 2023 04:38:46.294 # -odown master mymaster 127.0.0.1 6379
#失联状态结束,后面它就是down状态了
9667:X 31 Jul 2023 04:38:46.294 # +failover-end master mymaster 127.0.0.1 6379
#转换新的master6380
9667:X 31 Jul 2023 04:38:46.294 # +switch-master mymaster 127.0.0.1 6379 ::1 6380
#通知2个replica6380 6381进行对应的转换,6380变为master,6381变为6380的replica
9667:X 31 Jul 2023 04:38:46.294 * +slave slave [::1]:6381 ::1 6381 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:38:46.294 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:38:46.317 * Sentinel new configuration saved on disk
#6379也要变为6380的replica,只不过6379现在是down的状态,重新启动6379,不需要--replica指定,6379就会变成6380的replica
9667:X 31 Jul 2023 04:38:49.334 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:46:10.375 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
#重新启动6379,不需要指定--replicaof,直接变为6380的replica
9667:X 31 Jul 2023 04:46:29.370 * +slave slave [::1]:6379 ::1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:46:29.371 * Sentinel new configuration saved on disk

五,注意事项
1,是如果是同一台linux装了这些redis,前面提到的sentinel announced-ip配置项一定要配置,不然sentinel会争抢ip。
2,如果在启动sentinel的过程中出现了问题,如果想恢复并重新启动1主2从3哨兵,那么仅仅是通过命令启动,或者将新选举出来的master改为我们想要的port,是不够的。
因为sentinel会自动对sentinel和server replica的配置文件进行追加,追加内容主要是master replica 其他sentinel的ip端口,唯一id,还有状态等。
如果想恢复,一定要将包括master replica sentinel在内的6个配置文件中,包括新选举的master的ip,和sentinel自动追加的内容全部修改或删除,重新依次启动,才能完成恢复。
相关文章:
【redis】redis部署1主2从3哨兵demo搭建示例
redis版本为7,搭建的架构为1主2从3哨兵的架构。本文是对搭建的过程做一个回忆,过程可能遗漏了某些步骤,见谅。 首先,需要有一个已经安装了的redis。我们从redis源码目录中,找到一个redis.conf文件,这个文件…...
C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig-zag/左右双旋/3+4重构)
目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 00.BBST——平衡二叉搜索树 本文是介绍众多平衡二叉搜…...
免疫疗法勘察兵——DC细胞
DC细胞又叫树状细胞或者树突细胞,1869年由保罗兰格尔翰斯发现,一开始被误以为是神经细胞的一种,直到1973年皮肤科医师Inga Silberberg发现了他的免疫功能,同年,被拉尔夫斯坦曼和赞威尔A科恩两人正式命名为“dendritic…...
Django实现音乐网站 ⑷
使用Python Django框架制作一个音乐网站,在系列文章3的基础上继续开发, 本篇主要是后台歌曲类型表、歌单表模块功能开发。 目录 表结构设计 歌曲类型表结构 歌单表结构 创建表模型 创建表 后台注册表模型 引入表模型 后台自定义 总结 表结构设计…...
2023年华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响
# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、 压力等,可能会对婴儿的认知、情…...
openGauss学习笔记-30 openGauss 高级数据管理-别名
文章目录 openGauss学习笔记-30 openGauss 高级数据管理-别名30.1 语法格式30.1.1 列别名语法30.1.2 表别名语法 30.2 参数说明30.3 示例 openGauss学习笔记-30 openGauss 高级数据管理-别名 SQL可以重命名一张表或者一个字段的名称,这个名称为该表或该字段的别名。…...
C#实现多线程局域网扫描器的思路与具体代码
C#实现多线程局域网扫描器的思路与具体代码 思路: 获取局域网内所有 IP 地址遍历所有 IP 地址,使用 Ping 命令测试主机是否在线如果主机在线,则扫描主机上的所有端口,确定哪些端口是开放的输出扫描结果 在上述过程中࿰…...
Redis秒杀:一人一单问题及初步解决
优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis: 这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖…...
python 数据分析面试题:求分组排第n名的记录数据
近期面试遇到一个面试题,分享给大家。 文中会提供详细的解题思路以及问题延伸 一、面试题 面试题:输出各学科总分第一名的学员姓名、年龄、分数数据: class_a {name: [学员1, 学员2, 学员3, 学员4,学员5],age: [23, 24, 26, 27,25],course…...
eclipse常用快捷键
Eclipse常用快捷键 补全代码的声明:alt /快速修复: ctrl 1批量导包:ctrl shift o使用单行注释:ctrl /使用多行注释: ctrl shift /取消多行注释:ctrl shift \复制指定行的代码:ctrl alt down 或…...
什么是OCR?OCR技术详解
光学字符识别(Optical Character Recognition)简称为“OCR”。ORC是指对包含文本资料的图像文件进行分析识别处理,获取文字及版面信息的技术。 一般包括以下几个过程: 1.图像输入 针对不同格式的图像,有着不同的存储格式和压缩方式。目前&…...
【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了
【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了 新闻通义千问 - 7B 介绍评测表现快速使用环境要求安装相关的依赖库推荐安装flash-attention来提高你的运行效率以及降低显存占用使用 Transformers 运行模型使用 ModelScope 运行模型 量化长文本…...
SQL分类及通用语法数据类型
一、SQL分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库…...
亿欧智库:2023中国功效型护肤产品成分解析研究报告(附下载
关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 消费端:“纯净美妆〞概念火热,消费驱动因素向成分来源硬核转变 新冠疫情过后,消费者对于生活健康:自然,可持续的关注度持续上升。在消费者…...
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…...
python与深度学习(十二):CNN和猫狗大战二
目录 1. 说明2. 猫狗大战的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…...
React(1)——快速入门
目录 一、React背景简介 ❤️ 官网和资料 📚 介绍描述 🐧 React的特点 🔨 React高效的原因 🙏🏻 二、React的基本使用 💻 三、React JSX(JSX:JavaScript XML)📦 …...
【论文】【生成对抗网络五】Wasserstein GAN (WGAN)
【题目、作者】: 紫色:要解决的问题或发现的问题 红色:重点内容 棕色:关联知识,名称 绿色:了解内容,说明内容 论文地址: 论文下载 本篇文章仅为原文翻译,仅作参考。…...
学习率Learn_rate是什么(深度学习)
学习率是指在训练神经网络时用于调整参数的步进大小,它决定了每次梯度更新时参数的调整程度。学习率的选择直接关系到模型的性能和训练过程的效果。 学习率变化可能带来的影响: 收敛速度:较高的学习率可以加快模型的收敛速度,因为…...
webpack基础知识五:说说Loader和Plugin的区别?编写Loader,Plugin的思路?
一、区别 前面两节我们有提到Loader与Plugin对应的概念,先来回顾下 loader 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
