前言

环境:centos 7.9

介绍

我们知道redis一共有3中集群模式,1、主从模式。2、哨兵模式。3、Cluster模式。

主从复制模式缺点:master挂掉之后,集群无法使用,slave也不会自动成为新的master,slave会一直等待master正常,所以主从复制故障之后需要人为介入。

哨兵模式是为了解决主从复制模式的缺点的,即哨兵模式还是基于主从复制模式,只不过多了一个“哨兵”,当master挂掉之后,哨兵就会在在所有的从节点竞选出新的主节点。

哨兵模式原理

哨兵模式核心还是主从复制,只不过在相对于主从模式在主节点宕机导致不可写的情况下,多了一个竞选机制:在所有的从节点竞选出新的主节点。每一个哨兵都是一个独立的sentinel进程,作为进程,它会独立运行。

当master挂掉之后,哨兵会自动从slave中选一个作为master,若master重新启动,master则会转化为现有的master下的一个slave,当slave切换时,会通过发布订阅方式,将slave所对应的master更改。

哨兵本身也有单点故障的问题,所以在一个一主多从的Redis系统中,可以使用多个哨兵进行监控,哨兵不仅会监控主数据库和从数据库,哨兵之间也会相互监控。每一个哨兵都是一个独立的进程,作为进程,它会独立运行。

哨兵模式搭建

下面将以一主一从一哨兵进行搭建演示,当然,你也可以搭建一主带多从,多个哨兵的模式。

首先:搭建redis主数据库,即master,搭建方法请参考https://blog.csdn.net/MssGuo/article/details/114283015,这里不在赘诉。
redis.conf配置文件要注意2个参数:

#表示监听本机哪个网卡地址,因为我们要让slave能连接master,所以让redis监听在一个外部网卡而不仅仅是127.0.0.1
bind 192.168.118.133
#设置密码
requirepass 123456

设置slave从服务器:
同理,正常搭建一个redis实例之后,修改redis.conf配置文件。主要修改下面这些参数:

vim redis.conf                       #编辑配置文件
/REPLICATION                        #在命令行模式下搜索REPLICATION,这段就是配置主从复制的,5.0之前的版本叫SLAVE
replicaof 192.168.118.133 6379      #找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveof
masterauth 123456                   #如果master设置了密码,还要配置master的密码,这样slave才能连的上master
replica-read-only yes               #slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读

到这里,主从已经搭建完成,可以进入master,slave后输入:info Replication ,查看主从之间的相关信息,还可以在master写入一个数据之后查看slave是否正常同步到数据。

配置哨兵

这里仅配置一个哨兵,在master上配置一个哨兵,当然,如果你需要多个哨兵,还可以在每个slave上配置哨兵。

#在master上配置一个哨兵,如下:#复制哨兵的配置文件到redis安装目录下,与redis.conf配置文件放一块,在源码包里面有sentinel.conf文件
[root@Redis ~]# cp /root/redis-6.2.6/sentinel.conf /usr/local/redis-6.2.6/etc/
[root@Redis etc]# cd /usr/local/redis-6.2.6/etc/ && ll
total 108
-rw-r--r-- 1 root root 93767 Sep  9 18:35 redis.conf            #这是我们redis主配置文件
-rw-r--r-- 1 root root 13768 Sep  9 21:45 sentinel.conf         #这是我们的哨兵配置文件[root@Redis etc]# vim sentinel.conf                                #编辑哨兵配置文件,主要修改或启动下面这些参数
[root@Redis etc]# grep -Ev '$^|#' sentinel.conf
bind 192.168.118.133                                            #哨兵监听本机哪个端口
port 26379                                                      #哨兵的默认端口是26379
daemonize yes                                                   #哨兵的启动模式,yes是后台启动
pidfile /opt/redis/logs/redis-sentinel.pid                      #哨兵的pid文件存放位置
logfile /opt/redis/logs/redis-sentinel.log                      #哨兵的日志文件存放位置
dir /tmp                                                        #哨兵进程的工作目录,默认就是/tmp                                  #哨兵监听的master数据库,mymaster是为主数据库起的名称,可以随便起个名字,后面是master的ip和端口
# 最后面的1表示选举个数,含义是需要多少个哨兵认为master挂了才认定master挂掉,这里我设置为1是因为我只有一个哨兵,如果你配置
# 了多个哨兵,建议配置2以上数字。
sentinel monitor mymaster 192.168.118.133 6379 1
sentinel auth-pass mymaster 123456                              #配置master的登陆密码,mymaster是你配置的master名称
sentinel down-after-milliseconds mymaster 30000                 #30秒内master无响应则认为master挂掉
acllog-max-len 128                                              #保持默认即可#master重新选举之后,其它节点能同时并行进行数据同步的台数有多少台
#显然该值越大,则所有slave能同步完成的速度越快,但如果此时刚好有人访问slave数据,可能造成读取失败,最保守的值建议设为1
#即同一时间只能有一台进行数据同步,这样其它slave还能继续提供服务,但是所有的slave数据同步完成就会显得缓慢。
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000       #故障转移超时时间,指在该时间内如果故障转移没有成功,则会再发起一次故障转移
sentinel deny-scripts-reconfig yes              #保持默认即可
SENTINEL resolve-hostnames no                   #保持默认即可
SENTINEL announce-hostnames no                  #保持默认即可
[root@Redis etc]#

启动哨兵

sentinel.conf 配置文件修改完成之后,开启哨兵进程:

[root@Redis bin]# ./redis-sentinel ../etc/sentinel.conf         #指定哨兵配置文件启动
[root@Redis bin]# ps -ef | grep redis                          #查看进程,可以看到哨兵进程已经启动
root      71838      1  0 21:43 ?        00:00:08 ./redis-server 192.168.118.133:6379               #这是redis服务进程
root      93433      1  0 22:35 ?        00:00:00 ./redis-sentinel 192.168.118.133:26379 [sentinel] #这是哨兵进程[root@Redis bin]# tail -22f ../logs/redis-sentinel.log          #查看哨兵日志,没有报错,说明哨兵启动正常
93433:X 09 Sep 2022 22:35:21.203 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
93433:X 09 Sep 2022 22:35:21.203 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=93433, just started
93433:X 09 Sep 2022 22:35:21.203 # Configuration loaded
93433:X 09 Sep 2022 22:35:21.204 * monotonic clock: POSIX clock_gettime
93433:X 09 Sep 2022 22:35:21.205 * Running mode=sentinel, port=26379.
93433:X 09 Sep 2022 22:35:21.206 # Sentinel ID is a39ed9dc9dd67d84a32eb135f957f8c060b662ee
93433:X 09 Sep 2022 22:35:21.206 # +monitor master mymaster 192.168.118.133 6379 quorum 1
93433:X 09 Sep 2022 22:35:21.207 * +slave slave 192.168.118.132:6379 192.168.118.132 6379 @ mymaster 192.168.118.133 6379

登陆哨兵

登录哨兵还是使用redis-cli命令,指定主机端口和26379端口即可:

[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 26379           #登录哨兵,没设密码所以不用输入密码# SENTINEL HELP可以查看哨兵使用命令帮助文档
192.168.118.133:26379> SENTINEL master mymaster      #查看哨兵监听的master的信息,master的名称我们在配置文件定义为mymaster1) "name"2) "mymaster"3) "ip"4) "192.168.118.133"5) "port"6) "6379"7) "runid"8) "02f3d42a68a5358a44c1dea60a80e6b774092e67"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) "55"
19) "last-ping-reply"
20) "55"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "3349"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "354734"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "0"
35) "quorum"
36) "1"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
192.168.118.133:26379>
192.168.118.133:26379> SENTINEL REPLICAS  mymaster                       #查看master的slave的信息
1)  1) "name"2) "192.168.118.132:6379"3) "ip"4) "192.168.118.132"5) "port"6) "6379"7) "runid"8) "0f52d6e66dc478ddeb7f82cc3f9a2f0ba6467c31"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) "554"19) "last-ping-reply"20) "554"21) "down-after-milliseconds"22) "30000"23) "info-refresh"24) "9229"25) "role-reported"26) "slave"27) "role-reported-time"28) "722021"29) "master-link-down-time"30) "0"31) "master-link-status"32) "ok"33) "master-host"34) "192.168.118.133"35) "master-port"36) "6379"37) "slave-priority"38) "100"39) "slave-repl-offset"40) "55892"41) "replica-announced"42) "1"
192.168.118.133:26379>

验证

下面验证master挂掉之后,哨兵会不会将slave提升为新的master。

#关闭master ,模拟挂点,看看哨兵会如何操作
[root@Redis bin]# ./redis-cli  -h 192.168.118.133 -p 6379 -a 123456 shutdown
[root@Redis bin]# ps -ef | grep redis
root      93433      1  0 22:35 ?        00:00:03 ./redis-sentinel 192.168.118.133:26379 [sentinel]
root      99823  79065  0 22:50 pts/0    00:00:00 grep --color=auto redis#登录slave,查看现在slave的角色
[root@node1 bin]# ./redis-cli  -h 192.168.118.132 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6379> info Replication
# Replication
role:master                                         #从已经变成master角色了
connected_slaves:0
master_failover_state:no-failover
master_replid:9aa2e88aa729a454dae63f4a8c03cb2dcac40606
master_replid2:4976935598fb02dc112bddd37068f5f5b45f085f
master_repl_offset:82267
second_repl_offset:69050
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:82267
192.168.118.132:6379> [root@Redis bin]# ./redis-server  ../etc/redis.conf           #重新之前挂点的master,看看是不是变成slave了
[root@Redis bin]# ps -ef | grep redis
root      93433      1  0 22:35 ?        00:00:04 ./redis-sentinel 192.168.118.133:26379 [sentinel]
root     101580      1  0 22:54 ?        00:00:00 ./redis-server 192.168.118.133:6379[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 6379 -a 123456192.168.118.133:6379> info Replication
# Replication
role:slave                                                      #角色变成slave,我们也没有该redis.conf配置文件
master_host:192.168.118.132
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:1
slave_repl_offset:1
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:fbec000371f598d941c57b877b0d4b71065448cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.168.118.133:6379> #这时如何重启新的master会怎么样,因为新的master的配置文件里面肯定有关于slave的配置
192.168.118.132:6379> SHUTDOWN                                               #关闭redis
[root@node1 bin]# ./redis-server  ../etc/redis.conf                        #重新启动redis
[root@node1 bin]# ./redis-cli  -h 192.168.118.132 -p 6379 -a 123456            #登陆redis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6379> info Replication
# Replication
role:master     #还是master角色,说明即使redis.conf配置文件配置了slave的相关信息,但是该节点受哨兵管理,主从仍是正常的
connected_slaves:0
master_failover_state:no-failover
master_replid:7b55a5e55c316d416ad225ef96fe69cf302bf3fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.168.118.132:6379>

总结

1、先搭建好redis主从复制模式,因为哨兵是基于主从复制模式的;
1、可以配置多个哨兵,解决哨兵单点故障问题;
2、可以在master节点上启动哨兵,如果需要多个哨兵,则可以在slave上也启动哨兵;
2、复制哨兵的配置文件到redis安装目录下,与redis.conf配置文件放一块,在源码包里面有sentinel.conf文件;
3、修改sentinel.conf文件对应的参数,主要是定义其监控的master节点ip端口密码等
4、启动哨兵:[root@Redis bin]# ./redis-sentinel ../etc/sentinel.conf #指定哨兵配置文件启动
5、登陆哨兵:[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 26379 #登录哨兵,没设密码所以不用输入密码
6、验证master挂掉,发现slave自动成为了新的master,而且当就的master故障恢复启动之后,就的master会自动成为slave角色;
7、在不该变redis.conf配置文件的情况下,重启新的master节点,发现其重启后仍是master节点,即使redis.conf配置了它是salve,这一点与没有哨兵模式的主从模式有所不同,在redis仅仅是主从模式时,重启master就是master角色,重启slave就是slave角色,因为配置文件就是这样定义的。

redis搭建哨兵模式(哨兵模式原理)相关推荐

  1. Redis搭建主从同步流程及原理

    目录 一.关于 Redis 主从复制 1.1 关于 Redis 的主从复制 1.2 Redis 主从架构 1.3 优缺点 二.配置 Redis 主从复制 2.1 准备事项 2.2 同步服务器的时区和时 ...

  2. Redis单机模式主从模式哨兵模式集群模式搭建

    文章目录 一.Redis下载及安装 1.1.下载 1.2.环境安装 1.3.编译安装 1.4.修改配置 1.5.启动Redis 1.6.验证Redis是否启动 1.7.进入到Redis客户端 1.8. ...

  3. redis搭建主从哨兵模式+分片集群部署(redis系列二)

    前言:在前一章了解redis的基本介绍后,这一章主要介绍redis的实战部署,文章有点长请一步步耐心看完,我相信肯定会有收获的,这里用的资源包是2022年最新的redis版本可能会跟旧版本不同,在此章 ...

  4. Redis(主从复制、哨兵模式、集群)概述及部署

    Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...

  5. Redis(十八)——Sentinel 哨兵模式

    文章目录 Redis(十八)--Sentinel 哨兵模式 1.哨兵模式概述 2.搭建 Sentinel 集群 3.sentinel 集群测试 4.哨兵模式的所有配置详解 Redis(十八)--Sen ...

  6. 【Redis】Redis主从架构和哨兵模式

    文章目录 主从架构 为什么需要Redis主从架构? 搭建主从架构(一主二从) 主从一致原理 复制积压缓冲区 全量复制 增量复制 在主从架构中出现了宕机的情况 为什么主从库之间的复制不使用 AOF? 哨 ...

  7. Redis深入理解五 :Redis主从架构、哨兵架构、高可用集群模式

    redis主从架构 redis主从架构搭建,配置从节点步骤: 复制一份redis.conf文件 将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.p ...

  8. Redis集群之哨兵模式

    本文来说下Redis集群之哨兵模式 文章目录 概述 哨兵模式 什么是哨兵 实现原理 哨兵选举过程 master选举过程 cluster集群模式 cluster集群模式是怎么存放数据的 键是如何和163 ...

  9. Redis进阶篇主从复制----哨兵模式

    主从复制是什么 主从复制,就是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 作用 读写分离,性能扩展 容灾快速恢复 当一个从数 ...

  10. Redis的主从复制和 哨兵模式

    前言 持久化解决了单机redis的数据保存问题,但是redis还是存在以下两个问题: (1)假如某天这台redis服务器挂了,redis服务将彻底丧失 (2)redis的读和写都集中到一台机上,如果请 ...

最新文章

  1. python工具之myql数据库操作
  2. IDA Pro 修改默认名称
  3. ElementUI的el-form表单验证报错[Element Warn][Form]model is required for validate to work!
  4. Windows 8系统平台上应用软件安装心得
  5. 无根二叉树_无根Podman如何工作?
  6. 联想A208T ROOT
  7. 指针 | golang之指针的学习
  8. Objective-C SQLiteHelper
  9. 【转】XSD (xml Schema Definition)
  10. 太极发送卡片软件_太极APP的入门级使用方法
  11. 软件评测师考试(再来看一遍书,整理知识点)
  12. galgame安卓_史上最强教程!教你如何在安卓和ios上运行GALgame!
  13. python绘图画猫咪_Turtle库画小猫咪
  14. 【报告分享】代餐行业营销洞察报告-丁香医生(附下载)
  15. 基于微信云开发的商家转账至零钱
  16. PhotonServer-创建APPServer和Client类
  17. python实现归一化与标准化
  18. K8S章节2 — k8s集群中通过rook方式部署ceph
  19. Android TabLayout修改指示器宽度方案汇总
  20. PDA 无线网络设置

热门文章

  1. Xcelsius 的苦难日子
  2. 最新十大透支健康行业(2019年版)
  3. 【程序员学理财】有哪些普通人应该知道的经济学常识?
  4. 企业项目管理八大经典法宝
  5. flowable-6.7(一)从工作流与BPMN到flowable
  6. 【转】为什么linux系统变慢了
  7. Windows 10, version 21H2 (released Nov 2021) 简体中文版、英文版(企业版)下载
  8. php blowfish 解密,php blowfish加密解密算法
  9. 广告词 android,广告语猜猜看
  10. Cannot determine archive format of /tmp/pip-req-build-