哨兵模式(sentinel)
为什么需要哨兵模式
redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。
- 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障
- 主节点通过主从复制模式将读压力分散出去,但是写压力/存储压力无法被分散,受单机的限制
其中第一个问题是高可用问题,可以通过redis哨兵模式解决。第二个问题是存储分布式问题,要通过redis集群解决。本篇只讨论第一个问题。
哨兵模式
通过人工的方式解决主节点故障,不靠谱。而哨兵模式可以自动解决主节点故障问题。
哨兵机制是通过独立的进程实现的,即redis sentinel
,和redis-server
是不同的进程。redis sertinel
不负责存储数据,只是对redis-server
进程起到监控效果。
并且哨兵节点,也会搞一个集合。防止单个节点发生故障,而且单个节点容易出现误判(网络传输数据容易出现抖动,延迟,丢包,会误认为主节点发生故障)
人工恢复主节点故障
服务器需要7*24运行,为了保证服务器能够长期运行,程序员会写一个监控程序来监控服务器的运行状态。当服务器出现问题,就会通知程序员,程序员会先看看主节点能不能修复
如果主节点挂的原因不好定位,或者原因知道,但是短时间难以解决就需要挑一个从节点,设置为新的主节点。
- 把选中的从节点通过
slaveof no one
,脱离原来的主节点
2)把其他从节点,修改slaveof的主节点ip和port,连上新的主节点。
修改客服端的配置,让客服端连接上新的主节点
当之前挂的主节点修复完成后,就可以作为一个新的从节点,挂到这组机器中
哨兵自动恢复主节点故障
哨兵集合中有多个单独的redis sentinel
进程,这三个哨兵进程会监控现有的redis master
和slave
.
监控:
sentinel
进程会和主从节点建立tcp长连接,定期发送心跳包。如果发送ping
,没有返回pong
意味着这个主机挂了。
- 如果从节点挂了,问题不太严重,如果主节点挂了,哨兵就会发挥作用。
一个哨兵节点发现主节点挂了,还不够,需要多个哨兵节点共同认同这件事情,防止出现误判
- 确认主节点挂了,这些哨兵节点就会推举出一个leader,由这个leader负责从现有的从节点中,挑选一个作为新的主节点
- 挑选出新的主节点后,哨兵节点会自动控制被选中的节点,执行
slaveof no one
并且控制其他从节点,修改slaveof到新的主节点上 - 哨兵节点自动通知客服端程序现在主节点是哪个,并且后续客服端再进行写操作,就会针对新的主节点进行操作
redis哨兵的核心功能:
- 监控:sentinel节点会定期检测redis数据节点
- 故障转移:实现从节点晋升为主节点并维护后续正确的主从关系
- 通知:sentinel节点会将故障转移的结果通知给应用方
安装部署(基于docker)
咱们要安装上图哨兵模式中的6个节点,是需要6个不同的服务器。但是我只有1个服务器,因此只能在一个云服务器下安装。如果我们按照主从结构配置的方式进行部署,容易出现端口/配置文件/数据文件各种问题,比较繁琐,也和在不同主机上部署存在较大差异。因此我们采docker部署。
docker可以认为是一个“轻量级”虚拟机,起到虚拟机这样隔离环境的效果,但是又不吃很多硬件资源。
docker安装
- 确认操作系统:centos7/8/9,咱们采用centos7
使用cat /etc/*release*
命令查看linux版本是否符合
- 确认cpu架构: ARM/x86_64
使用uname -a
命令查看当前的cpu架构
- 查看是否下载过docker
使用docker
命令,或docker version
命令
我的linux中并没有安装过
如果存在docker
- 卸载旧版本
:::tips
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
:::- 卸载历史版本
:::tips
#删除机器上的包
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
#删除目录
sudo rm -rf /var/lib/docker 4.
sudo rm -rf /var/lib/containerd
:::
-
配置仓库
:::tips
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#配置国内源
sed -i ‘s@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g’ /etc/yum.repos.d/docker-ce.repo
::: -
安装最新版本
:::tips
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
::: -
启动docker
:::tips
#加载配置
systemctl daemon-reload
#查看服务状态
systemctl status docker
#启动服务
systemctl start docker
#开机自启动
systemctl enable docker
::: -
检查安装结果查看版本
:::tips
docker version
::: -
更详细的查看docker信息
:::tips
docker info
::: -
执行
hello-world
看到Hello from Docker,表明docker服务正常
:::tips
docker run hello-world
::: -
配置docker国内的镜像源,加速下载镜像
:::tips
mkdir /etc/docker
cd /etc/docker
vim daemon.json
{
“registry-mirrors”: [“http://hub-mirror.c.163.com”,“https://registry.docker-cn.com”,“https://docker.mirrors.ustc.edu.cn”]
}
#重新加载配置
systemctl daemon-reload
#重启docker
systemctl restart docker
docker info
::: -
修改docker目录
docker中有很多镜像,为了防止磁盘不够用,需要将他挂载到大磁盘的目录上
:::tips
#假定我们大磁盘的目录为 /data ,
mkdir /data/var/lib/docker -p
cd /etc/docker/
vim daemon.json
#输入下面的json
{
“data-root”: “/data/var/lib/docker”
}
#重新加载配置
systemctl daemon-reload
#重启docker
systemctl restart docker
#查看docker信息
docker info
:::
安装redis
-
安装docker-compose:docker中可以安装很多容器,容器之间存在依赖关系,因此引入docker-compose来帮助我们编排这些容器
:::tips
yum install docker-compose
::: -
停止redis进程,防止后续出现干扰
:::tips
service redis-server stop
ps aux | grep redis
通过kill -9杀死其他端口的redis进程
::: -
使用docker获取redis镜像
:::tips
docker pull redis:5.0.9
:::
docker中的镜像类似于”可执行程序“,容器类似于”进程“。docker pull使用docker从中央仓库拉取镜像。拉取到的镜像包含一个精简的Linux操作系统并且上面安装有redis,只要基于这个镜像创建一个容器跑起来,此时redis服务器就搭建好了
- 使用docker-compose编排redis-server节点
咱们需要安装3个redis-server和3个redis哨兵节点,每个redis server或者redis sentinel都是一个单独的容器,使用docker-compose方便安装。
具体是通过一个yml格式的配置文件,把要创建那些容器,每个容器运行的各种参数,描述清楚即可。后续通过一个命令,就能批量的启动/停止这些容器。
咱们通过两个yml文件来配置,一个yml文件配置redis server节点,一个yml文件配置redis的哨兵节点。
其实也可以只使用1个yml文件,但是如果6个容器同时启动,可能哨兵节点先启动,数据节点后启动,哨兵就会误认为数据节点挂了。虽然影响不大,但是会影响观察执行日志的过程。
:::tips
mkdir redis
cd redis
mkdir redis-data
mkdir redis-sentinel
cd redis-data/
vim docker-compose.yml
:::
version: '3.3'
services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379
- 启动所有redis-server容器
:::tips
docker-compose up -d
:::
如果启动后发现前面的配置有误,需要重新操作,使用
docker-compose down
即可停止并删除刚才创建好的容器
- 可以通过
docker ps -a
查看搭建好的redis节点
- 编排redis-sentinel节点
- 编写
docker-compose.yml
- 编写
version: '3.3'
services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redisdata_default
- 创建配置文件
创建sentinel1.conf``sentinel2.conf``sentinel3.conf
三份内容一致,都放到/root/redis-sentinel/
目录中
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
-
启动redis-sentinel
:::tips
docker-compose up -d
::: -
观察redis-sentinel的配置的rewrite
启动完以后,再次打开哨兵的配置文件,发现文件内容已经被自动修改
模拟主节点宕机情况
-
手动将
redis-master
干掉
:::tips
docker stop redis-master
::: -
观察哨兵日志
:::tips
docker-compose logs
:::
sdown: 主观下线,本哨兵节点,认为该主节点挂了
odown:客观下线,其他节点也认为主节点挂了,票数超过一半
- 查看redis-server
- 重新连上原来的主节点
:::tips
docker start redis-master
:::
哨兵选举主节点流程
- 主观下线:哨兵节点通过心跳包,判定redis服务器是否正常工作,如果超过心跳包时间,说明服务器挂了。(此时可能是由于网络抖动造成,因此只能是单方面认为redis节点挂了)
- 客观下线:多个redis节点认为主节点挂了(投票超过法定票数)
- 在多个哨兵节点,选出一个leader节点,由这个leader节点负责选一个从节点作为新的主节点
- 3号哨兵第一个发现主节点掉线,立即投自己一票,推荐自己成为leader,并告诉1和2号哨兵节点(类似于拉票)
- 1号哨兵节点给哨兵3投票
- 2号哨兵节点给哨兵3投票
谁网络延迟小,谁是leader
- 选举完leader,leader需要挑选一个从节点,作为主节点
- 优先级:每个redis数据节点,在配置文件中有一个优先级设置
slave-priority
,选择优先级高的slave节点 - offset:offset是从节点从主节点同步数据的进度,数值越大,说明从节点的数据和主节点越接近。选择offset大的从节点
- runid:当上面都一样时,选择谁都没差别了。runid是redis节点启动时随机生成的一串数字,根据runid大小选择
- 优先级:每个redis数据节点,在配置文件中有一个优先级设置
注意事项
- 哨兵节点不能只有一个,否则哨兵节点挂了容易影响系统可用性
- 哨兵节点最好是奇数个,方便选举leader,得票数更容易过半数
- 哨兵节点不存储数据,仍然是redis主节点负责存储
- 主从+哨兵解决的是“可用性”问题,不能解决“数据极端情况下写丢失”问题
- 主从+哨兵不能提高数据的存储容量,当我们需要存的数据接近或超过机器的物理内存,这样的结构很难胜任,需要引入集群
相关文章:
哨兵模式(sentinel)
为什么需要哨兵模式 redis的主从复制模式能够缓解“读压力”,但是存在两个明显问题。 主节点发生故障,进行主节点切换的过程比较复杂,需要人工参与,导致故障恢复时间无法保障主节点通过主从复制模式将读压力分散出去,…...
b站老王 自动驾驶决策规划学习记录(十二)
自动驾驶之速度规划详解:SL与ST迭代 上一讲:b站老王 自动驾驶决策规划学习记录(十一) 接着上一讲学习记录b站老王对自动驾驶规划系列的讲解 参考视频: 自动驾驶决策规划算法第二章第七节(上) 速度规划详解:SL与ST迭代…...
服务器租用机房机房的类型应该如何选择
服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定,访问量也不是很大,适合新闻类网站或政务类网站。如果网站的PV流量持续增加,建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…...
大数据运维一些常见批量操作命令
大数据运维中,批量操作是一项常见的任务。在使用flume进行数据采集的过程中,有时会出现故障导致采集停止,此时积累了大量的文件。如果想要将这些文件迁移到新的目录,直接使用"mv"命令可能会因为文件数目过多而报错。为了…...
测试人职场生存必须避开的5个陷阱
在互联网职场的工作发展道路上,软件测试人员其实在公司中也面临着各种各样的职场陷阱,有些可能是因为项目业务不熟练造成的,有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些,但是想要在测试行业长久发展…...
力扣538 补9.18
538.把二叉搜索树转换为累加树 可以做,主要还是分类讨论并找规律。 当前结点如果是左节点的话,root.valroot.valpre.valdfs(root.right); 如果是右结点的话, root.valpre.val-preval-dfs(root.left); 都和前一个结点有关系,如…...
[Linux入门]---Linux编译器gcc/g++使用
文章目录 1.背景知识2.gcc如何完成编译运行工作预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件) 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…...
[Git入门]---gitee注册及代码提交
文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台,在上面可以托管个人或公司代…...
企业架构LNMP学习笔记46
PHP测试连接代码: php代码测试使用memcached: 示例代码: <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…...
ELFK之zookeeper+kafka
目录 kafkazookeeper的系统架构 Zookeeper 一、zookeeper概述 二、zookeeper特点 三、zookeeper选举机制 四、应用场景 五、zookeeper实验实例 Kafka 一、概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 二、Kafka 的特性 三、Ka…...
ECharts
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的…...
jsoup框架技术文档--java爬虫--架构体系
阿丹: 在学习以及认知使用一个新技术之前一定要搞清楚有关框架的架构体系。了解一下该技术的底层会对后面编写代码以及寻找报错都是很有用处的,前期做的铺垫多一点,后期开发的时候就很方便。 jsoup框架的关键组件 JSoup框架的关键组件主要包…...
OpenStack创建云主机并连接CRT
文章目录 OpenStackT版创建云主机并连接CRT命令行操作(1)创建镜像(2)创建实例(3)创建网络创建内网创建外网 (4)创建安全组(5)创建路由(6ÿ…...
linux-sed命令
目录 1.linux-shell sed获取某一段字符串 2.linux-shell shell脚本中 sed -n取出某一行赋给一个变量 3.linux-shell sed查询某一行 1.linux-shell sed获取某一段字符串 如果要获取的是某一段字符串,可以在 sed 命令中使用正则表达式来指定需要获取的字符串。例如…...
Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?
Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库…...
JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45
系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…...
分别用Python和Go实现对文件夹及其子文件夹里的文件进行批量重命名
文章目录 问题阐述上代码结果如何 问题阐述 最近在继续提高自己的go技术时,从网上一些平台获取到了一些学习资料,然后下载到本地后,文件的命名是真的像衣托答辩: 除了上述的文件,还有一mol多神奇的命名,害…...
redis深度历险 千帆竞发 —— 分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个…...
C#根据中文首字母排序
第一种方式: 这种方式会受制于服务器的区域和语言设置。 1.首先添加一个排序类ChineseNameComparer public class ChineseNameComparer : IComparer<string> {public int Compare(string x, string y){if (x null || y null)return 0;var xFirstChar x.Su…...
仪表基础知识培训
压力传感器:E+H PMX5x/FMX5x 一、安装:安装注意事项: 1、水平安装时仪表的呼吸孔(1)需要向下安装,并远离污染物。 2、请勿用坚硬的物体擦拭或接触膜片。 3、请勿安装在水泵的入口和搅拌叶附近 二、供电、接线、信号、:二线制,仪表输出4-20mA 三、量程:设置最大最小量程…...
无涯教程-JavaScript - PI函数
描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…...
前端防抖和节流
前端防抖和节流 概述 防抖: 防止抖动,个人字面理解此处防的不是页面的抖动,而是用户手抖。为了防止用户快速且频繁的触发事件而导致多次执行事件函数,这样的场景有很多,比如监听滚动、鼠标移动事件onmousemove、频繁…...
[pai-diffusion]pai的easynlp的clip模型训练
EasyNLP带你玩转CLIP图文检索 - 知乎作者:熊兮、章捷、岑鸣、临在导读随着自媒体的不断发展,多种模态数据例如图像、文本、语音、视频等不断增长,创造了互联网上丰富多彩的世界。为了准确建模用户的多模态内容,跨模态检索是跨模态…...
期权如何交易?期权如何做模拟交易?
买卖期权的第一步就是要有期权账户,国内的期权品种有商品期权和ETF期权以及股指期权,每种的开户方式和要求都不同,下文为大家介绍期权如何交易?期权如何做模拟交易? 一、期权交易需要开立一个期权账户,可以…...
【新书推荐】大模型赛道如何实现华丽的弯道超车 —— 《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》
文章目录 大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 …...
Calendar对象获取当前周的bug
项目场景: 双周项目管理,需要获取当前周为一年之中的第几周,原先的代码是用Calendar对象,先用setTime()把当前时间传入,再用get(3)获取一年中的第几周 问题描述 实际发…...
嵌入式环境buildroot的espeak配置与编译
1、在buildroot目录下输入make menuconfig 2、选择Target packages 3、选择Audio and video applications 4、选择espeak、选择alsa via portaudio (新版嵌入式linux一般都是用alsa音频驱动) 5、配置portaudio 选择Library 6、选择Audio/Sound 7、选择…...
物理机环境搭建-linux部署nginx
1、安装nginx部署所需依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel2、安装nginx包 wget http://nginx.org/download/nginx-1.8.0.tar.gz 如果没有wget可以安装一下 yum install -y wget下载完成后可以在/usr/local/下放置tar包…...
删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)
删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统,安装完 Google Chrome 浏览器以后,单击 启动台 桌面左下角的“显示应用程序”,我们发现捆绑安装了 Goo…...
硬件故障诊断:快速定位问题
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
wordpress抓取文章插件/谷歌浏览器下载手机版安卓
无名管道 管道是Linux支持的最早的Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关…...
wordpress关闭手机访问/seo视频教程
shell脚本启停项目进程shell脚本强制停止指定名称进程shell脚本启动logstashshell脚本强制停止指定名称进程 关闭logstash 方式一 #!/bin/bash#注意事项 logstash_pid 和 之间不能有空格,否则会将logstash_pid当成单独的命令执行报错.logstash_pidps aux|grep …...
购物网站功能/北京seo网络优化师
安装centos 7 系统之后要做的几件事#修改主机名 hostnamectl --static set-hostname xd-1vim /etc/hosts127.0.0.1 xd-1x.x.x.x xd-1#下面是使用iptables systemctl stop firewalld.service systemctl disable firewalld.service yum -y install iptables-servicesadduser www…...
网站开发设计实训总结/楚雄百度推广电话
FS2462是泛海微自主开发的5A降压型同步整流芯片,频率500Khz,可以支持降压IC输出5V4.5A降压IC输出1.2V5A降压IC输出3.3A5A降压IC输出1.8V5A降压IC输出2.5V5A是国内首家大电流同步5A芯片,内部集成极低RDS内阻20豪欧金属氧化物半导体场效应晶体管…...
网站建设营销口号/百度指数排名热搜榜
解决Maven工程(springBoot)子模块中pom.xml开头出现Unkown error的问题问题背景问题分析问题解决问题背景 最近在学习Spring Boot过程中通过eclipse创建了一个Maven工程,然后基于此Maven工程创建了一个子模块项目,及Maven Module…...
公司网站注意事项/个人网站设计欣赏
因为我装了个据称是破解的mybatis插件,卸了插件就好了,破解的东西,谁知道会不会给你带个马呢哈哈哈哈 我看网上其他的说法,像什么多按了insert之类的,反正和我的触发原因不符,你们可以试试看,回…...