Redis 实现哨兵模式

2024-08-26 23:20
文章标签 实现 模式 redis 哨兵

本文主要是介绍Redis 实现哨兵模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 哨兵模式介绍

1.1 什么是哨兵模式

1.2 sentinel中的三个定时任务

2 配置哨兵

2.1 实验环境

2.2 实现哨兵的三条参数:

2.3 修改配置文件

2.3.1 MASTER

2.3.2 SLAVE

2.4 将 sentinel 进行备份

2.5 开启哨兵模式

2.6 故障模拟

3 在整个架构中可能会出现的问题

3.1 问题:

3.2 解决:


1 哨兵模式介绍

1.1 什么是哨兵模式

  • 哨兵也叫 sentinel,它的作用是能够在后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

Sentinel 进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候, 可以实现MasterSlave服务器的切换,保证系统的高可用,此功能在redis2.6+的版本已引用,Redis的 哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用Redis2.8版本的以后版本

每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)MasterSlave定时发送消息,以确认对方是否” 着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的” 主观认为宕机” (主观:是每个成员都具有的独自的而且可能相同也可能不同的意识),英文名称: Subjective Down,简称SDOWN

有主观宕机,对应的有客观宕机。当哨兵群中的多数Sentinel进程在对Master主服务器做出SDOWN 的 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”(客观:是不依赖于某种意识而已经实际存在的一切事物),英文名称是: Objectively Down, 简称 ODOWN

通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改 相关配置,并开启故障转移(failover

Sentinel 机制可以解决masterslave角色的自动切换问题,但单个 Master 的性能瓶颈问题无法解决,类 似于MySQL中的MHA功能

Redis Sentinel中的Sentinel节点个数应该为大于等于3且最好为奇数

1.2 sentinel中的三个定时任务

  1. 每10秒每个 Sentinel 对 master 和 slave 执行 info 命令,以发现 slave 节点并确认主从关系。这有助于 Sentinel 了解集群的当前状态,并确保主从关系正确。
  2. 每2秒每个 Sentinel 通过 master 节点的 channel 交换信息(pub/sub),通过 sentinel __:hello 频道交互,交互对节点的“看法”和自身信息。这有助于 Sentinel 了解其他 Sentinel 的状态,并确保集群中的所有 Sentinel 都在正常工作。
  3. 每1秒每个 Sentinel 对其他 Sentinel 和 Redis 执行 ping 命令,以检查它们的可用性。这有助于 Sentinel 了解集群中所有节点的当前状态,并确保它们都在正常工作。

2 配置哨兵

2.1 实验环境

节点名称角色IP地址
node1MASTER192.168.239.10
node2SLAVE-1192.168.239.20
node3SLAVE-2192.168.239.30

2.2 实现哨兵的三条参数:

sentinel monitor mymaster 192.168.239.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1# sentinel monitor mymaster 192.168.239.10 6379 2:
# Sentinel 监控名为 mymaster 的主节点,其地址为 192.168.239.10:6379,
# 并且要求至少有两个 Sentinel 认为主节点失效才会进行故障切换。# sentinel down-after-milliseconds mymaster 10000:
# Sentinel 在经过 10000 毫秒(即 10 秒钟)之后,
# 如果主节点没有响应,则认为主节点已经失效。# sentinel parallel-syncs mymaster 1:
# 在故障切换过程中,最多允许一个从节点同时进行同步。

2.3 修改配置文件

2.3.1 MASTER

[root@node-1 ~]# vim /etc/redis/redis.confbind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证sentinel monitor mymaster 192.168.239.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1

2.3.2 SLAVE

[root@node-2 ~]# vim /etc/redis/redis.confbind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379  # 向 MASTER 进行同步sentinel monitor mymaster 192.168.239.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
[root@node-3 ~]# vim /etc/redis/redis.confbind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379  # 向 MASTER 进行同步sentinel monitor mymaster 192.168.239.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1

参数说明:

  • monitor:监控

  • redismaster:为监控对象起的服务名称

  • 2:为至少有多个个哨兵同意迁移的数量

是一条 Redis Sentinel 的命令,它告诉 Sentinel 监控名为 mymaster 的主节点,其地址为 192.168.239.10,并且要求至少有两个 Sentinel 认为主节点失效才会进行故障切换。

2.4 将 sentinel 进行备份

由于执行哨兵模式的时候Redis会修改sentinel.conf配置文件,所以将他先备份一份

[root@node-1 redis]# cp sentinel.conf sentinel.conf.bak
[root@node-2 redis]# cp sentinel.conf sentinel.conf.bak
[root@node-3 redis]# cp sentinel.conf sentinel.conf.bak

2.5 开启哨兵模式

2.6 

[root@node-1 redis]# redis-sentinel /etc/redis/sentinel.conf
[root@node-2 redis]# redis-sentinel /etc/redis/sentinel.conf
[root@node-3 redis]# redis-sentinel /etc/redis/sentinel.conf

2.6 故障模拟

停止node-1 的Redis

[root@node-1 ~]# systemctl stop redis_6379.service 

在node-2能发现MASTER从node-1 变为了 node-2

查看 node-2 的状态 

[root@node-2 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.239.30,port=6379,state=online,offset=28084,lag=1
master_failover_state:no-failover
master_replid:5042333e8ac488fd7fd05a38bbd99e3f1a4f4528
master_replid2:6cae489b55bf61b8432df467e53d93081effc1ce
master_repl_offset:28227
second_repl_offset:18125
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28227

发现已经转换为MASTER了 

3 在整个架构中可能会出现的问题

3.1 问题:

在生产环境中如果masterslave中的网络出现故障,由于哨兵的存在会把master提出去

当网络恢复后,master发现环境发生改变,master就会把自己的身份转换成slave

master变成slave后会把网络故障那段时间写入自己中的数据清掉,这样数据就丢失了。

3.2 解决:

master在被写入数据时会持续连接slavemater确保有2slave可以写入我才允许写入

如果slave数量少于2个便拒绝写入

#在matster中设定
[root@node2 ~]# redis-cli
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "0"
127.0.0.1:6379> CONFIG set min-slaves-to-write 2
OK
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "2"
#如果要永久保存写到配置文件中/etc/redis/6379.conf

这篇关于Redis 实现哨兵模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109972

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如