06. Redis架构-哨兵

news2024/11/14 1:28:07

简介

什么是哨兵

Redis的主从模式下,主节点一旦发生故障便不能提供服务,需要人工干预。手动将从节点晋升为主节点,同时还需要修改客户端配置。
Sentinel(哨兵)架构解决了Redis主从人工干预的问题。
Redis Sentinel是Redis的高可用实现方案。实际生成环境中,可以提高整个Redis系统的可用性。
Sentinel 本质上是一个运行在特殊状模式下的 Redis 服务器。
Sentinel 模式下 Redis 服务器只支持 PING、SENTINEL、INFO、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE 七个命令。

哨兵的主要功能

Redis Sentinel是一个分布式系统,可以提高Redis的可用性。在没有人为干预的情况下可以实现故障节点替换。
Sentinel系统用于管理多个Redis服务器,Sentinel主要任务有:

  1. 监控(Monitoring)

Sentinel会不断地定期检查主服务器和从服务器是否运行正常。

  1. 提醒(Notification)

当被监控的某个Redis服务器出现问题时,Sentinel会通过API向管理员或者其他程序发送通知。

  1. 自动故障迁移(Automatic failover)

当一个主机不能正常工作时,Sentinel会自动故障转移。它会在集群中选一个节点作为新的主节点,并让其他从节点复制此新主节点。

实现

一主两从三哨兵

规划Redis

  • 主机规划
    | 主机名称 | 主机地址 | 主机规划 |
    | — | — | — |
    | redis-master | 192.168.108.129 | master主机+Sentinel |
    | redis-slave-1 | 192.168.108.130 | slave主机+Sentinel |
    | redis-slave-2 | 192.168.108.131 | slave主机+Sentinel |

  • redis目录规划
    | 用途 | 目录 | 备注 |
    | — | — | — |
    | 家目录 | /usr/local/redis/ | |
    | 解压目录 | /usr/local/ | |
    | 日志目录 | /usr/local/redis/logs/ | |
    | 数据目录 | /usr/local/redis/data/ | |
    | 配置目录 | /usr/local/redis/conf/ | |
    | PID目录 | /usr/local/redis/pid/ | |

  • sentinel目录规划
    | 用途 | 目录 | 备注 |
    | — | — | — |
    | 日志目录 | /usr/local/redis_16379/logs/ | |
    | 数据目录 | /usr/local/redis_16379/data/ | |
    | 配置目录 | /usr/local/redis_16379/conf/ | |
    | PID目录 | /usr/local/redis_16379/pid/ | |

  • 检查主机

#检查防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
  • 拓扑图

安装Redis

涉及主机:redis-master和redis-slave

#解决依赖关系
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc

#下载Redis
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压Redis
tar -zxvf redis-3.2.9.tar.gz -C /usr/local/

#重命名Redis文件
mv /usr/local/redis-3.2.9 /usr/local/redis

#安装Redis
cd /usr/local/redis
make
make PREFIX=/usr/local/redis MALLOC=libc install

#创建目录和用户
useradd redis
mkdir -p /usr/local/redis/{data,conf,logs,pid}
chown -R redis:redis /usr/local/redis/

#复制配置文件
cp /usr/local/redis/redis.conf /usr/local/redis/conf/

#命令加载至profile
cat >> /etc/profile << 'EOF'
export PATH=$PATH:/usr/local/redis/bin/
EOF

source /etc/profile

配置Redis

  • master和slave
cat > /usr/local/redis/conf/redis.conf << EOF
bind 0.0.0.0
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/logs/redis.log"

#数据保存路径
dir /usr/local/redis/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF

实现Sentinel

配置主从
  • slave主机
cat >> /usr/local/redis/conf/redis.conf << EOF
##添加主库信息
#主库地址和端口
slaveof 192.168.108.129 6379
#主库密码
masterauth 1qaz!QAZ
EOF
配置哨兵
  • master和slave主机
mkdir -p /usr/local/redis_16379/{conf,logs,pid,data}

cat > /usr/local/redis_16379/conf/redis.conf << EOF
bind 0.0.0.0
port 16379
daemonize yes
logfile /usr/local/redis_16379/logs/redis_16379.log
pidfile /usr/local/redis_16379/pid/redis_16379.pid
dir /usr/local/redis_16379/data

#指定主节点信息,判断主节点故障后几台sentinel选举master
sentinel monitor redis-master 192.168.108.129 6379 2
#指定Sentinel认为服务器断了多久后迁移节点,单位毫秒
sentinel down-after-milliseconds redis-master 3000
#指定一次又多少个从节点去新master上复制,一般为一台一台的同步复制
sentinel parallel-syncs redis-master 1
#故障转移超时时间,单位毫秒
sentinel failover-timeout redis-master 180000
#添加连接Redis的密码
sentinel auth-pass redis-master 1qaz!QAZ
EOF
  • 参数

sentinel monitor redis-master 192.168.108.129 6379 2
sentinel monitor
: 是一个自定义名称,用于哨兵之间识别和标识主服务器的逻辑名字。
: 主服务器的IP地址。
: 主服务器监听的端口。
: 最小投票数,它是哨兵在认为主服务器已经不可达并启动自动故障迁移之前需要达到的最小哨兵同意数。例如,如果设置为2,则至少需要两个哨兵同意主服务器无法访问。

启动redis主从
redis-server /usr/local/redis/conf/redis.conf
启动Redis哨兵
redis-sentinel /usr/local/redis_16379/conf/redis.conf

验证哨兵

验证服务
  • Redis进程
[root@wang redis]# ps -ef | grep redis
root      33560      1  0 15:14 ?        00:00:00 redis-server 0.0.0.0:6379
root      33607      1  0 15:22 ?        00:00:00 redis-sentinel 0.0.0.0:16379 [sentinel]
root      33611  22305  0 15:22 pts/0    00:00:00 grep --color=auto redis
  • 配置
#主节点
[root@wang redis]# redis-cli -h 192.168.108.129 -p 16379
192.168.108.129:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.129:6379,slaves=2,sentinels=3

#从节点
[root@localhost redis]# redis-cli -h 192.168.108.130 -p 16379
192.168.108.130:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.129:6379,slaves=2,sentinels=3

[root@localhost redis]# redis-cli -h 192.168.108.131 -p 16379
192.168.108.131:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.129:6379,slaves=2,sentinels=3
验证读写
#从机写入
192.168.108.131:6379> AUTH 1qaz!QAZ
OK
192.168.108.131:6379> set name wangmingqu
(error) READONLY You can't write against a read only slave.

192.168.108.130:6379> AUTH 1qaz!QAZ
OK
192.168.108.130:6379> set name wangmingqu
(error) READONLY You can't write against a read only slave.

#主机读写
192.168.108.129:6379> AUTH 1qaz!QAZ
OK
192.168.108.129:6379> set name wangmingqu
OK

192.168.108.130:6379> get name
"wangmingqu"

192.168.108.131:6379> get name
"wangmingqu"
验证故障转移
  • 主备切换
#关闭主节点
pkill -9 redis

#观察从节点
[root@localhost redis]# redis-cli -h 192.168.108.130 -p 16379
192.168.108.130:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.131:6379,slaves=2,sentinels=3

[root@localhost redis]# redis-cli -h 192.168.108.131 -p 16379
192.168.108.131:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.131:6379,slaves=2,sentinels=3
  • 数据读写
#从机写入
192.168.108.130:6379> AUTH 1qaz!QAZ
OK
192.168.108.130:6379> set age 18
(error) READONLY You can't write against a read only slave.

#主机写入
192.168.108.131:6379> AUTH 1qaz!QAZ
OK
192.168.108.131:6379> set age 18
OK

#从机读取
192.168.108.130:6379> get age
"18"

哨兵命令

登录哨兵命令行

redis-cli -h 192.168.108.129 -p 16379

查看哨兵信息

192.168.108.129:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis-master,status=ok,address=192.168.108.131:6379,slaves=2,sentinels=3

查看哨兵主节点信息

192.168.108.129:16379> sentinel masters
1)  1) "name"
    2) "redis-master"
    3) "ip"
    4) "192.168.108.131"
    5) "port"
    6) "6379"
    7) "runid"
    8) "06313df278d3d20060b7e12a94efaaa217547ce3"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "690"
   19) "last-ping-reply"
   20) "690"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "901"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "503084"
   29) "config-epoch"
   30) "1"
   31) "num-slaves"
   32) "2"
   33) "num-other-sentinels"
   34) "2"
   35) "quorum"
   36) "2"
   37) "failover-timeout"
   38) "180000"
   39) "parallel-syncs"
   40) "1"

查看某个哨兵组的主节点信息

192.168.108.129:16379> sentinel master redis-master
 1) "name"
 2) "redis-master"
 3) "ip"
 4) "192.168.108.131"
 5) "port"
 6) "6379"
 7) "runid"
 8) "06313df278d3d20060b7e12a94efaaa217547ce3"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "740"
19) "last-ping-reply"
20) "740"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "6188"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "679090"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

查看某个哨兵组的从节点信息

192.168.108.129:16379> sentinel slaves redis-master
1)  1) "name"
    2) "192.168.108.129:6379"
    3) "ip"
    4) "192.168.108.129"
    5) "port"
    6) "6379"
    7) "runid"
    8) "cc9e042f8312ef446118d0171869a67ae4af579d"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "762"
   19) "last-ping-reply"
   20) "762"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "227"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "766728"
   29) "master-link-down-time"
   30) "1709799229000"
   31) "master-link-status"
   32) "err"
   33) "master-host"
   34) "192.168.108.131"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "1"
2)  1) "name"
    2) "192.168.108.130:6379"
    3) "ip"
    4) "192.168.108.130"
    5) "port"
    6) "6379"
    7) "runid"
    8) "cdc7797103531d2aca7ff5c7f5bbbd2d16ece9f8"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "762"
   19) "last-ping-reply"
   20) "762"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "3356"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "776764"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "192.168.108.131"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "298886"

查看某个哨兵组的哨兵节点信息

192.168.108.129:16379> sentinel sentinels redis-master
1)  1) "name"
    2) "9613171fbc3a343ce1fdaa7617471df992deb7c7"
    3) "ip"
    4) "192.168.108.131"
    5) "port"
    6) "16379"
    7) "runid"
    8) "9613171fbc3a343ce1fdaa7617471df992deb7c7"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "553"
   19) "last-ping-reply"
   20) "553"
   21) "down-after-milliseconds"
   22) "3000"
   23) "last-hello-message"
   24) "395"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"
2)  1) "name"
    2) "66ef8fc36c93f53c757a2b595b8b47f62bb8adb1"
    3) "ip"
    4) "192.168.108.130"
    5) "port"
    6) "16379"
    7) "runid"
    8) "66ef8fc36c93f53c757a2b595b8b47f62bb8adb1"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "553"
   19) "last-ping-reply"
   20) "553"
   21) "down-after-milliseconds"
   22) "3000"
   23) "last-hello-message"
   24) "600"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"

查看某个哨兵组的主节点IP和PORT

192.168.108.129:16379> sentinel get-master-addr-by-name redis-master
1) "192.168.108.131"
2) "6379"

强制执行故障转移

192.168.108.129:16379> sentinel failover redis-master
OK

将哨兵的配置信息强制写入配置文件

192.168.108.129:16379> sentinel flushconfig
OK

检查某个哨兵组中可用主机数量

192.168.108.129:16379> sentinel ckquorum redis-master
OK 3 usable Sentinels. Quorum and failover authorization can be reached

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《鸟哥的Linux私房菜》第6章——总结与习题参考答案

目录 一、 简介 二、一些新了解的指令 1.touch- 修改文件时间或创建新文件 2.umask-新建文件/目录的默认权限 3.文件隐藏属性 4.文件特殊权限 5.file-观察文件类型 三、简答题部分 一、 简介 本章介绍了一些常用的文件与目录指令&#xff0c;包括新建/删除/复制/移动/查…

Spring Cloud Alibaba微服务从入门到进阶(一)(SpringBoot三板斧、SpringBoot Actuator)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

卖木头块(Lc2312)——动态规划

给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, wi, pricei] 表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。 每一次操作中&#xff0c;你必须按下述方式之一执行切割操…

在SwiftUI中使用Buider模式创建复杂组件

在SwiftUI中使用Buider模式创建复杂组件 我们在前面的博客闲聊SwiftUI中的自定义组件中聊到了如何在SwiftU中创建自定义组件。 在那里&#xff0c;我们创建了一个非常简单的组件RedBox&#xff0c;它将展示内容增加一个红色的边框。 RedBox非常简单&#xff0c;我们用普通的方…

电梯机房秀

每天乘坐电梯&#xff0c;您见过电梯的机房吗&#xff1f;来&#xff0c;跟着小伍去看看吧。Lets go&#xff01; 电梯还能节能呢&#xff0c;您知道么&#xff1f;正好&#xff0c;小伍一块带您看看电梯节能装置(●◡●) 目前电梯节能装置已广泛应用于三菱、富士、日立、奥的斯…

电梯机房秀 系列二

上次小伍带大家看了部分机房的照片&#xff0c;并且简单介绍了一下电梯能量回馈装置&#xff0c;小伙伴们表示很新奇&#xff0c;没看够&#xff0c;今天小伍又来了&#xff0c;带大家看一下电梯能量回馈装置到底安装在电梯什么位置。跟着小伍去看看吧。Lets go&#xff01; 电…

【MySQL基础】MySQL基础操作

文章目录 &#x1f349;什么是数据库&#xff1f;&#x1f353;MySQL数据库&#x1f9c0;1.数据库操作&#x1f346;1.1展示数据库&#x1f346;1.2创建数据库&#x1f346;1.3使用数据库&#x1f346;1.4删除数据库 &#x1f9c0;2.常用数据类型&#x1f9c0;3.数据表操作&…

电视盒子解析安装包失败,安卓4.4安装不了kodi的解决方法,如何安装kodi

有些安卓电视或者电视盒子的安卓系统版本太低、自身架构或者屏蔽了安装其他应用的功能&#xff0c;下载的Kodi apk安装包提示无法安装&#xff0c;解析程序包时出现问题、解析出错无法安装、[INSTALL_FAILED_OLDER_SDK]、此应用与您的电视不兼容。 解决方法&#xff1a; 1、3…

分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸

分享一下自己总结的7万多字java面试笔记和一些面试视频&#xff0c;简历啥的&#xff0c;已大厂上岸 总结的面试资料&#xff1a;面试资料 SSM SSM搭建的版本有很多&#xff0c;例如有一个版本可以这么搭建&#xff0c;两个核心配置文件web.xml,applicationContext.xml。1.前…

电影票预约系统---c++实现

使用 1.打开mysql对应的数据库-->prodb 打开数据库&#xff1a;mysql -uroot -p 查看数据库&#xff1a;show databases; 使用数据库&#xff1a;use prodb; 查看用户信息&#xff1a;select * from user_info 2.打开sever 3.打开client 编译命令 server.cpp命令 g -…

SpringMVC | SpringMVC中的 “数据绑定”

目录: “数据绑定” 介绍1.简单数据绑定 :绑定 “默认数据” 类型绑定 “简单数据类型” 类型 &#xff08;绑定Java“基本数据类型”&#xff09;绑定 “POJO类型”绑定 “包装 POJO”“自定义数据” 绑定 :Converter (自定义转换器) 2.复杂数据绑定 :绑定数组绑定集合 作者简…

《互联网的世界》第七讲-能源

本想聊聊 tcp 和 quic&#xff0c;但这些都属于术的范畴&#xff0c;变化多端&#xff0c;等孩子们长大了又不知变成什么样子了&#xff0c;趁这段时间在家&#xff0c;还是得讲一些相对不变的东西&#xff0c;或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…

python-绘制五角星

绘制五角星 """ 功能&#xff1a;五角星的绘制 """ import turtledef main():"""主函数"""count 1lenth50while count < 50:lenth lenth 50turtle.forward(lenth) #向前走50turtle.right(144) #向右转…

探索数据结构:双向链表的灵活优势

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 前言 前面我们学习了单链表&#xff0c;它解决了顺序表中插入删除需…

IM项目题

消息的可靠性 前言 IM系统的可靠性指的是端到端的可靠性&#xff0c;并不是tcp的可靠性&#xff0c;它是指客户端A&#xff0c;客户端B以及服务端三端通信之间的可靠性&#xff0c;并不是客户端A到服务端这么一个上行消息的可靠&#xff0c;这个tcp就可以保证了&#xff0c;当…

openssl3.2 - note - Getting Started with OpenSSL

文章目录 openssl3.2 - note - Getting Started with OpenSSL概述笔记openssl 历史版本Configure 选项开关支持的OSopenssl 文档简介安装新闻每个平台的安装文档支持的命令列表配置文件格式环境变量 END openssl3.2 - note - Getting Started with OpenSSL 概述 看到官方文档…

基于单片机的智能环境监测系统

摘 要 本设计主要由温湿度检测、烟雾检测电路、报警电路、显示电路和人体检测等模块组成。温湿度检测部分使用的是DHT11这种型号的温湿度传感器。DHT11是一种单总线型数字式温湿度传感器&#xff0c;它具有误差小、分辨率高、抗干扰能力强等特点。在烟雾检测电路模块当中&…

ant-design的DatePicker、a-range-picker限制选择今天之前的时间和今天之后的日期时间

a-range-picker限制选择今天之前的时间和今天之后的时间 antd的时间选择器做限制主要用到的参数是disabledDate &#xff0c;下面我们看下案例&#xff1a; HTML&#xff1a; <a-date-picker :disabledDate"disabledDate"></a-date-picker> //最简单…

Linux学习之网络

目录 认识协议 网络协议初始 协议分层 OSI七层模型 TCP/IP的四层模型 数据包封装和分用 以太网通信 ip地址与MAC地址 网络编程套接字 端口号&#xff08;port&#xff09; 认识协议 网络字节序 socket接口 网络的产生是计算机历史的必然性&#xff0c;是计算机发展…

【AI+CAD】(二)LLM和VLM生成结构化数据结构(PPT/CAD/DXF)

当前LLM和VLM在PPT生成任务上已经小有成效,如ChatPPT。 @TOC 1. PPT-LLM LLM根据用户的instruction生成规范的绘制ppt的API语句:即使是最强的GPT-4 + CoT也只能达到20-30%的内容准确度。 LLM输入:User_instruction(当前+过去)、PPT_content、PPT_reader_API。其中 PPT_rea…