首页 > 数据库 >保姆级,手把手教你物理机搭建Redis-sentinel(哨兵)集群

保姆级,手把手教你物理机搭建Redis-sentinel(哨兵)集群

时间:2024-09-13 15:48:58浏览次数:12  
标签:手把手 redis 哨兵 master sentinel 服务器 Redis 节点

集群介绍

        Redis,作为一种开源的、基于内存的数据结构存储系统,被广泛应用于各种场景,包括缓存、消息队列、短期存储等。

单一实例的工作模式通常无法保证Redis的可用性和拓展性,Redis提供了三种分布式方案:

  • 主从模式
  • 哨兵模式
  • 集群模式

      主从模式

        主从模式,是redis集群最基本的模式,主库负责读写,从库负责读。主库的数据会同步到从库,但是从库写的数据不会自动同步到主库,除非用写脚本等方式手动同步。这种模式应急能力比较差,假如出现宕机的情况,需要手动进行修改

1.从服务器连接到主服务器:首先,从服务器需要连接到主服务器。这通常通过在从服务器上执行SLAVEOF命令并指定主服务器的IP地址和端口号来完成。

2.发送SYNC命令:从服务器连接到主服务器后,它会发送一个SYNC命令。这个命令是Redis复制的核心,它会触发主服务器开始复制过程。

3.主服务器开始保存数据:收到SYNC命令后,主服务器会开始在后台保存其数据快照。同时,主服务器还会记录从接收到SYNC命令开始执行的所有写命令,这些命令将在数据快照完成后发送给从服务器。

4.主服务器发送数据快照:数据快照完成后,主服务器会将其发送给从服务器。从服务器在接收到数据快照后,会删除所有旧数据,然后使用接收到的数据快照来加载新数据。

5.主服务器发送缓存的写命令:数据快照发送完成后,主服务器会将在数据快照过程中记录的所有写命令发送给从服务器。从服务器在接收到这些命令后,会按照接收的顺序执行这些命令,以确保其数据与主服务器的数据保持一致。

6.主从同步完成,进入命令转发阶段:完成上述步骤后,主从服务器的数据就同步了。之后,主服务器每执行一次写命令,就会将这个命令发送给所有的从服务器。从服务器在接收到写命令后,会执行这个命令,以确保其数据始终与主服务器的数据保持一致

      哨兵模式(推荐)

   Redis的主从模式是可以解决负载、数据备份等问题,但是,如果master宕机的情况,slave是不会自动升级为master的,必须手动升级,所以就有了哨兵集群的方案

        在哨兵模式下,哨兵节点会定期检查主节点和从节点的运行状态。如果发现主节点发生故障,哨兵节点会在从节点中选举出一个新的主节点,并通知其他的从节点和哨兵节点。此外,哨兵节点还可以接收客户端的查询请求,返回当前的主节点信息,从而实现客户端的透明切换。

https://i-blog.csdnimg.cn/direct/4b27e6df132b41b995ce0f0724711512.png

https://i-blog.csdnimg.cn/direct/171750f1bd5147ed9b93bed4181cecfd.png

     Cluster集群模式(推荐)

        Redis的哨兵模式提供了比如监控、自动故障转移等高可用方案,但是这种方案,容量相对固定,要进行持续扩容或者数据分片就不适合,所以有另外一种更复杂的集群方案,Cluster集群模式。

      Cluster模式支持多主多从,这种模式,按照key进行虚拟槽位分配,使得key分配到不同的主节点,使用这种模式使得集群节点有更大的容量,也可以持续进行扩容,如果主库节点出现宕机,也会从从库节点选出一个新的主库节点

      集群的作用

        数据分区: 数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。

        高可用: 集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任一节点发生故障时,从节点可以代替主节点, 集群仍然可以对外提供服务。以及当某master节点故障时,其他master仍然可提供服务

     集群特征

  1. 集群中有多个master,每个master保存不同的数据
  2. 每个master都可以有多个slave节点
  3. master之间通过ping,彼此间检测健康状态
  4. 客户端可以请求访问集群中任意节点,最终都会被转发到正确的节点上

       工作原理 

        在集群模式下,Redis使用一种叫做哈希槽的技术来实现数据的分片。整个哈希空间被分成16384个哈希槽,每个节点负责一部分哈希槽。当一个键需要被存储时,Redis会根据键的值计算出一个哈希值,然后根据哈希值决定将这个键存储在哪个节点上。这样,读写请求就可以在多个节点上并行处理,提高了系统的性能。

https://i-blog.csdnimg.cn/direct/d6453662870e44158b0d7a4c9bd59ca4.png

        在Redis集群模式下,任意一个Master节点都可以接受客户端的请求。当客户端向某个Master节点发送请求时,如果这个请求的键所对应的哈希槽不在这个Master节点负责的范围内,那么这个Master节点会返回一个重定向信息,告诉客户端应该向哪个节点发送请求。这个过程对客户端来说是透明的,客户端只需要按照重定向信息重新发送请求即可。这种方式确保了Redis集群可以有效地处理并分发客户端的请求,提高了系统的性能和可用性。

三种模式优缺点

主从模式:

优点:

        数据备份,读写分离,容灾恢复。

缺点:

        故障转移不是自动的,需手动干预。

哨兵模式:

优点:

        自动故障转移,可以实现高可用。

缺点:

        哨兵节点不能分担主节点的读压力

Cluster集群模式:

优点:

        自动分片数据,可以线性扩展,没有10000个key的限制,可以平行读写。

缺点:

        1.开发难度大,客户端的不成熟影响业务的稳定性,异常处理部分还不完善

        2.数据通过异步复制,不保证数据的强一致性。

        3. Key 事务操作支持有限,只支持多 key 在同一节点上的事务操作,当多个 Key 分布于不同的节点上时无法使用事务功能

        4.多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性较差,容易出现相互影响的情况

部署

由于项目需要,搭建了一个 Redis 服务器集群,实现了主从配置和容灾部署,使得主机出现故障时,可自动进行容灾切换。本案例以一个主服务(master)两个从服务(slave )及三个哨兵节点为例,分别部署在三台Linux(CentOS9)服务器中。

下面就详细讲解一下如何利用 Redis 来实现

1 Redis 安装部署

1.1 下载redis安装包

官网下载地址:Downloads - Redis,这里我们下载稳定版7.4.0,或者直接使用命令安装,如下

wget http://download.redis.io/releases/redis-7.4.0.tar.gz

2.2 安装redis

解压redis安装包:

tar xzf redis-7.4.0.tar.gz

解压完成后,使用make命令对解压的redis文件进行编译

cd redis-7.4.0/

make

编译完成之后,可以看到解压文件 redis-7.4.0 中会有对应的 src、conf 等文件,如下

编译成功后,进入 src 文件夹,执行 make install 进行 Redis 安装。

make install

注:如出现/bin/sh: cc: command not found错误,是因为没有安装 gcc 环境,使用命令yum install gcc安装 gcc 环境即可。

2.3 部署

由于 src 下文件非常多,我们可以将几个常用的命令和 conf 配置文件复制出来进行统一管理,如下:

(1)新建 bin 和 etc 文件夹

cd /root/redis-7.4.0/

mkdir etc

mkdir bin

(2)回到安装目录,将redis.conf复制到 ect 文件夹下

cp redis.conf /root/redis-7.4.0/etc    

(3)进入 src 文件夹下,将mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-rdb、redis-cli、redis-server、redis-sentinel文件复制到 bin 文件夹

cd src/

cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /root/redis-7.4.0/bin/

完成后如下图

2.4 启动

切换到 bin 目录,使用./redis-server即可启动 redis 服务,但是这种方式没有指明配置文件,redis 将采用默认配置,所以我们需要让 redis 按照我们的配置文件来启动,如下,启动时指定刚才我们复制到 etc 文件夹下的redis.conf

cd /root/redis-7.4.0/bin

./redis-server /root/redis-7.4.0/etc/redis.conf

使用redis-cli命令连接客户端,如下

redis-cli –p 6379

注:另外两台服务器同上述步骤部署redis

2、Redis 集群整体架构

采用的集群整体架构就是主从结构+哨兵(sentinel,实现容灾的自动切换,如下图所示:


3、Redis 主从配置及数据同步

在第一步 Redis 安装部署中我们已经启动了 Redis 服务,但是配置文件并没有做修改,因为主从配置主要就是通过修改配置文件来实现,所以 Redis 配置文件的修改统一在这里处理

三台虚拟机如下图所示,分别安装好虚拟机

IP地址

端口号

角色

192.168. 1.130

6379

主机(master)

192.168.1.132

6379

从机(slave)

192.168.1.131

6379

从机(slave)

现在进入 etc 文件夹,使用vi redis.conf命令打开编辑 redis.conf 配置文件,如下

首先看一下redis.conf 配置文件中的各个参数,详解如下

daemonize no

redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)

pidfile /var/run/redis.pid

指定redis进程的PID文件存放位置

port 6379

redis进程的端口号

protected-mode yes

是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭设置为no。

bind 127.0.0.1

绑定的主机地址

timeout 300

客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能

loglevel verbose

redis日志级别,可用的级别有debug.verbose.notice.warning

logfile stdout

log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了

databases 16

设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id

save <seconds> <changes>

指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件

rdbcompression yes

指定存储至本地数据库时是否压缩文件,默认为yes即启用存储

dbfilename dump.db

指定本地数据库文件名

dir ./

指定本地数据问就按存放位置

replicaof <masterip><masterport>

指定当本机为slave服务时,设master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步

masterauth <master-password>

当master设置了密码保护时,slave服务连接master的密码

requirepass footbared

设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭

maxclients 128

设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息

maxmemory<bytes>

指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

appendonly no

指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。

appendfilename appendonly.aof

指定跟新日志文件名默认为appendonly.aof

appendfsync everysec

指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);

3.1 主机配置

主机(192.168. 1.130)需要改动的配置如下所示,修改完毕后先按 esc ,然后:wq命令保存退出。

bind 0.0.0.0  #把 bind 修改为 0.0.0.0 表示允许所有远程访问

port 6379    #监听端口默认为6379

protected-mode no  #关闭保护模式,可以外部访问

daemonize yes     #设置为后台启动。

logfile ./redis.log    # redis 日志文件,生成后在 bin 目录下可找到

requirepass root    #设置 redis 连接密码。

masterauth root    # slave 服务连接 master 的密码。

3.2 从机配置

从机的配置和主机相似,不同的地方是需要使用replicaof指定主机(master)的IP地址和端口

bind 0.0.0.0  #把 bind 修改为 0.0.0.0 表示允许所有远程访问

port 6379    #监听端口默认为6379

protected-mode no  #关闭保护模式,可以外部访问

daemonize yes     #设置为后台启动。

logfile ./redis.log    # redis 日志文件,生成后在 bin 目录下可找到

requirepass root    #设置 redis 连接密码。

masterauth root    # slave 服务连接 master 的密码

replicaof 192.168.1.130 6379  #配置主机IP及端口

注1:replicaof 192.168.231.130 6379

指定当本机为 slave 服务时,设置 master 服务的IP地址及端口,在 redis 启动的时候会自动跟 master 进行数据同步,所以两台从机都这样配置即可。

注2:由于我们搭建的集群需要自动容灾切换,主数据库可能会变成从数据库,所以三台机器上都需要同时设置 requirepass 和 masterauth 配置项。

 3.3 数据同步

主从节点的配置文件配置好后,重启 redis 服务,进入 bin 目录即可查看配置文件中指定的redis.log日志文件。

下面我们需要设置一下防火墙,否则主从机之间无法同步数据,命令如下,这里根据自己设置的端口进行更改。

firewall-cmd --add-port=6379/tcp --permanent --zone=public

#重启防火墙(修改配置后要重启防火墙)

firewall-cmd –reload

至此主从结构搭建完毕,下面我们分别查看三台机器的信息,如下

主机(master:192.168.1.130)

从机(slave:192.168.1.131)

从机(slave:192.168.1.132)

3.4 主从验证

在主机(master)添加几条数据,看从机(slave)是否可以获取到,如果能获取,说明数据已经同步到了从机,主机添加数据,如下:

4、Redis 哨兵模式搭建

4.1 详解及原理

Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

  1. 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
  2. 通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。
  3. 故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。
  4. 统一的配置管理:连接者询问sentinel取得主从的地址。

Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

  1. 每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
  3. 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。
  4. 如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
  5. 在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
  6. 当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。 

4.2 哨兵搭建

哨兵的配置主要就是修改sentinel.conf配置文件中的参数,在Redis安装目录即可看到此配置文件。这里我们部署三个哨兵,每台服务器一个哨兵,配置方式相同

  1. 同样为了方便管理,首先将sentinel.conf复制到 etc 下

cd /data/redis-7.4.0/

cp sentinel.conf /data/redis-7.4.0/etc/

  1. 编辑 sentinel.conf

cd etc/

vi sentinel.conf

配置文件修改如下,修改完毕后先按 esc ,然后:wq命令保存退出。

port:26379

端口默认为26379

protected-mode no

关闭保护模式,可以外部访问。

daemonize yes

设置为后台启动。

logfile ./sentinel.log

日志文件

sentinel monitor mymaster 192.168.1.130 6379 2

指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。

sentinel auth-pass mymaster root

当在Redis实例中开启了requirepass,这里就需要提供密码

Sentinel down-after-milliseconds mymaster 3000

这里设置了主机多少秒无响应,则认为挂了

sentinel parallel-syncs mymaster 1

主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1

sentinel failover-timeout mymaster 180000

故障转移的超时时间,这里设置为三分钟

4.3、防火墙设置

命令如下,这里根据自己设置的端口进行更改。

#开放端口

firewall-cmd --add-port=26379/tcp --permanent --zone=public

#重启防火墙(修改配置后要重启防火墙)

firewall-cmd –reload

4.4 启动哨兵

cd /data/redis-7.4.0/bin

redis-sentinel /data/redis-7.4.0/etc/sentinel.conf

三个哨兵都启动后,可使用如下命令查看哨兵信息

redis-cli -p 26379

info sentinel

4.5 灾备切换

       模拟一下主机宕机,将主机redis服务关闭

再去看另外两台服务器,会发现哨兵(Sentinel)通过选举机制选举了从机(192.168.1.131 6379)作为了新的主机,如下

刚才的主机(192.168.231.130 6379)已经变成了从机

通过新上位的主机日志可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件,并且连接了其他从机。

5 项目集成

在Spring Boot中配置Redis主从和哨兵,你需要在application.propertiesapplication.yml文件中设置相应的配置。

application.yml 示例配置:

spring:

  redis:

    # Redis 哨兵模式

    database: 1

    password: root

    sentinel:

      master: mymaster

      nodes:192.168.1.130:26379,192.168.1.131:26379,192.168.1.132:26379

标签:手把手,redis,哨兵,master,sentinel,服务器,Redis,节点
From: https://blog.csdn.net/qq_36851486/article/details/142181427

相关文章

  • 抓包工具检测手把手教学 - 某招聘网站
    大家好,我是南枫~~~先问大家一个问题,你们有没有遇到过想爬一个网站,想用老方法,直接右键打开抓包工具,此时,突然!整个页面都变得空白,什么数据都没有了的情况……如果你没遇到过那你去看看这个网站:https://talent.baidu.com/jobs/social-list?search=Python (百度招聘网站)打开......
  • Redis高级教程(一)
    Redis数据备份与恢复Redis中SAVG命令用于创建当前数据库的备份语法SAVG命令执行该命令后将会在redis安装目录的src/下创建dump.rdb文件。恢复数据如果恢复数据,要将备份文件(dump.rdb)移动到redis安装目录并启动服务即可(默认备份的目录就在redis安装目录下所以备份后重......
  • Redis哨兵
    Redis哨兵 一、概念哨兵是巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务哨兵能够监控redis运行状态,包括master和slave当master宕机,能自动将slave切换成新的master主从监控:监控主从redis库是否正常运行消息通知:哨兵可......
  • 适合初学者的[JAVA]:Redis(2:I/O多路复用模型与事件派发)
    目录说明前言I/O多路复用模型备注:用户空间和内核空间:备注:阻塞IO:(了解)非阻塞IO:(了解)IO多路复用:(重点)常见的方式有:差异:事件派发说明:Redis网络模型总结: 说明本文适合刚刚学习Java的初学者,也可以当成阿岩~的随手笔记.接下来就请道友们和我一起来......
  • 美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 内存耗尽后,Redis会发生什么?
    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当Redis服务器的内存耗尽后,如果继续执行请求命令,Redis会如何处理呢?  2内存回收 使用Redis服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以......
  • DataGrip或者intellijIDEA 远程链接数据库的时候下载驱动失败 出现错误:https://downlo
    一、问题本人使用DataGrip版本:2023.1在链接数据库的时候出现这个错误,无法完全加载驱动,是因为这里的maven仓库下载驱动失败,这时候需要自己手动下载驱动二、怎么解决需要手动更改下载的镜像网址,改成阿里云的镜像网址仓库服务(aliyun.com)这三个仓库地址,可以选择其中一个......
  • 零基础学JAVA-day01-JDK的下载和安装(手把手系列)
    首先我们得知道JDK是什么,JDK(JavaDevelopmentKit)是Java开发工具包,它是开发Java应用程序的基础。JDK包含了编写、编译、调试和运行Java程序所需的所有工具和资源。下载JDK为了开始使用Java编程,你需要在计算机上安装JDK。你可以从Oracle官方网站或其他可信源......
  • Redis常见报错及解决方法总结
    Redis常见报错及解决方法总结Redis作为高效的内存数据库,在实际使用过程中不可避免会遇到一些问题和报错。为了帮助大家更好地应对这些问题,我将常见的Redis报错及其解决方法进行总结,并提供具体的操作步骤。1.ConnectionRefused错误描述:客户端连接Redis时,出现Connection......
  • 手把手教你制作最简网页版倒计时程序(核心代码仅25行)
    一、解构如图所示,手机浏览器的效果。代码就是简单的html语言加上一个JavaScript脚本,界面主要分3部分,功能实现主要分3个函数。(一)显示样式在头里定义了居中显示的CSS样式,将来在浏览器中居中显示倒计时X分XX秒。<styletype="text/css">   .center{      positio......