Redis哨兵模式的搭建以及配置参数简介

原理

Redis哨兵模式是一种用于在Redis主从复制环境中进行高可用性监控和故障恢复的机制。该模式引入了一个或多个哨兵节点,这些节点负责监控Redis服务器的状态,并在主节点发生故障时切换为新的主节点。

哨兵节点的工作原理如下:
1、哨兵节点通过发送命令来监控Redis服务器的状态。它会定期向主节点和从节点发送PING命令,检查节点是否存活。
2、当主节点发生故障或不可用时,哨兵节点会进行故障检测。它会询问其他哨兵节点是否已经发现了主节点的故障,并尝试达成共识。
3、如果多数哨兵节点都认为主节点故障,那么它们会选举新的主节点。选举的原则是选择一个具有最高优先级的从节点,如果没有从节点则选择一个具有最高优先级的哨兵节点。
4、一旦新的主节点被选出,哨兵节点会更新所有其他从节点的配置信息,使它们成为新主节点的从节点。
5、当故障的主节点恢复时,哨兵节点会将其重新加入到主从复制环境中,并将其设置为新主节点的从节点。
6、通过哨兵模式,Redis可以实现高可用性和故障恢复。当主节点发生故障时,哨兵节点可以自动切换为新的主节点,使系统可以在故障期间继续提供服务。同时,哨兵节点可以监控并修复其他节点的故障,确保整个Redis集群处于可用状态。
在这里插入图片描述

搭建准备

服务器准备
在这里插入图片描述
关闭所有服务器防火墙

$ systemctl stop firewalld.service

修改所有服务器的hosts

$ vim /etc/hosts

192.168.1.1 redis-01
192.168.1.2 redis-02
192.168.1.3 redis-03

资源准备
redis 下载地址:
http://download.redis.io/releases/

主从搭建

1、在所有服务器执行
注意: 新版本redis自带哨兵,不需要单独安装

$ mkdir /home/redis
$ mkdir /home/redis/data
$ mkdir /home/redis/logs
$ cd /home/redis
$ wget http://download.redis.io/releases/redis-7.2.4.tar.gz
$ tar -zxvf redis-7.2.4.tar.gz
$ cd redis-7.2.4/
$ make

2、配置redis.conf

$ vim /home/redis/redis-7.2.4/redis.conf

主配置

dir "/home/redis/data"
logfile "/home/redis/logs/redis.log"
requirepass "123456"
protected-mode no
port 6379
min-replicas-to-write 1
min-replicas-max-lag 10
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
maxmemory 2gb
maxmemory-policy allkeys-lru
pidfile "/var/run/redis_6379.pid"
loglevel notice
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4kb
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

从配置
1、masterauth: 以认证的方式连接到master。 如果master中使用了“密码保护”,slave必须交付正确的授权密码,才能连接成功。“requirepass”配置项指定了当前server的密码。此配置项中值需要和master机器的“requirepass”保持一致。
2、slaveof : 将当前服务器转变为指定服务器的从属服务器(slave server)。

dir "/home/redis/data"
logfile "/home/redis/logs/redis.log"
requirepass "123456"
masterauth "123456"
protected-mode no
port 6379
min-replicas-to-write 1
min-replicas-max-lag 10
slaveof middleware-01 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
maxmemory 2gb
maxmemory-policy allkeys-lru
pidfile "/var/run/redis_6379.pid"
loglevel notice
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4kb
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

3、启动
依次启动所有服务器上的redis 服务

$ /home/redis/redis-7.2.4/src/redis-server /home/redis/redis-7.2.4/redis.conf

4、查看状态
启动所有服务器后,查看所有redis 节点状态

master节点信息

$ /home/redis/redis-7.2.4/src/redis-cli -a 123456(redis密码) info replication

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:3
min_slaves_good_slaves:3
slave0:ip=192.168.1.2,port=6379,state=online,offset=812674869,lag=0
slave1:ip=192.168.1.3,port=6379,state=online,offset=812674869,lag=0
master_failover_state:no-failover
master_replid:ff565edfdaed8aba6cab1c39f70b8bcab2126c08
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:812674869
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:811607825
repl_backlog_histlen:1067045

slave节点信息

$ src/redis-cli -a 123456(redis密码) info replication

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:redis-01
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:812708923
slave_repl_offset:812708923
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
min_slaves_good_slaves:0
master_failover_state:no-failover
master_replid:ff565edfdaed8aba6cab1c39f70b8bcab2126c08
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:812708923
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:811648705
repl_backlog_histlen:1060219

哨兵配置

在redis的安装目录下有个文件sentinel.conf,这就是哨兵的配置文件。它和redis.conf文件在同级目录。

1、sentinel.conf配置

$ vim /home/redis/redis-7.2.4/sentinel.conf


protected-mode no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
loglevel notice
logfile "/home/redis/logs/sentinel.log"
dir "/home/redis/data"
sentinel monitor mymaster 192.168.1.1 6379 3
sentinel auth-pass mymaster 123456
# 如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了

# 如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 30000
# 指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

# 编写redis节点切换通知,根据实际情况编写
sentinel client-reconfig-script mymaster /home/redis/redis-7.2.4/reconfig.sh

sentinel deny-scripts-reconfig yes
sentinel resolve-hostnames yes
sentinel announce-hostnames yes

2、reconfig.sh 节点切换企业微信发送脚本


#!/bin/bash
  
check_time=$(date +"%F-%T")
master_name="$1"
from_ip="$4"
from_port="$5"
to_ip="$6"
to_port="$7"


#填写自己正确的机器人链接
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=【自己的key】' \
   -H 'Content-Type: application/json' \
   -d '
   {
        "msgtype": "text",
        "text": {
            "content": "【'$check_time' : '$master_name'】 \nmessage : \nredis主节点转移\nfrom : \n'$from_ip:$from_port'\nto: \n'$to_ip:$to_port'",
            "mentioned_list":["@all"]
        }
   }'

3、哨兵启动

$ /home/redis/redis-7.2.4/src/redis-sentinel /home/redis/redis-7.2.4/sentinel.conf

4、查看启动状态

$ /home/redis/redis-7.2.4/src/redis-cli -p 26379  info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.1:6379,slaves=3,sentinels=4

5、注意
redis 哨兵模式启动成功后,会自动在sentinel .conf 最下方生成以下配置

...

# Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
user default on nopass sanitize-payload ~* &* +@all
sentinel myid a98121e7518d18336731dac83e1ef041152590f0
sentinel config-epoch mymaster 219
sentinel leader-epoch mymaster 0
sentinel current-epoch 219


## 不包含自身
sentinel known-replica mymaster 192.168.1.1 6379
sentinel known-replica mymaster 192.168.1.2 6379
sentinel known-replica mymaster 192.168.1.3 6379

## 不包含自身
sentinel known-sentinel mymaster 192.168.1.1 26379 ebf711bac3990a534fc068312b7622c849dc65e5
sentinel known-sentinel mymaster 192.168.1.2 26379 ec8837fb38d22daa9800b82006130fe625d959fd
sentinel known-sentinel mymaster 192.168.1.3 26379 ec8837fb38d22daa9800b82006130fe625d959fd

redis.conf 参数详解

Redis的配置文件redis.conf包含了多个参数,这些参数用于定义Redis服务器的行为、性能和安全设置。以下是一些常见参数的详细说明:

基本设置

  • daemonize:是否以后台进程运行。默认为no,如果设置为yes,则Redis将以守护进程的方式在后台运行。
  • pidfile:当Redis以后台进程运行时,需要指定一个PID文件以存储进程ID。默认为/var/run/redis.pid,但可以通过此参数进行修改。
  • bind:绑定主机IP地址。默认值为127.0.0.1,即只接受来自本地主机的连接。如果设置为0.0.0.0,则接受来自所有IP地址的连接。
  • port:监听端口号。默认为6379,但可以根据需要进行修改。
  • timeout:客户端连接超时时间(秒)。默认为300秒,即如果客户端在指定时间内没有发送任何请求,则服务器将关闭该连接。如果设置为0,则表示禁用此功能。

日志设置

  • loglevel:日志记录等级。有4个可选值:debug、verbose(默认值)、notice、warning。这些等级决定了日志信息的详细程度。
  • logfile:日志记录方式及路径。默认为stdout,即将日志输出到标准输出。如果设置为文件路径,则日志将被写入该文件。

数据库设置

  • databases:可用数据库的数量。默认值为16,但可以根据需要进行修改。数据库编号从0开始,可以使用SELECT命令来选择要使用的数据库。
  • dbfilename:本地数据库文件名。默认为dump.rdb,这是Redis用于存储数据的文件名。
  • dir:本地数据库存放路径。默认为当前目录(即redis.conf所在的目录),但可以通过此参数进行修改。

数据持久化

  • save:指定在多长时间内有多少次更新操作就将数据同步到数据文件。可以配置多个条件,如“save 900 1”表示在900秒内有1次更改时触发数据持久化。
  • rdbcompression:在存储至本地数据库时是否压缩数据。默认为yes,使用LZF压缩算法。如果为了节省CPU时间,可以设置为no,但会导致数据库文件变大。
  • appendonly:是否在每次更新操作后进行日志记录(AOF持久化)。默认为no。如果开启此功能,Redis将在每次写操作时追加日志到指定的文件中,以确保数据的持久性。但需要注意的是,这可能会影响性能。
  • appendfilename:更新日志文件名。默认为appendonly.aof。
  • appendfsync:更新日志条件。有3个可选值:no(等待操作系统进行数据缓存同步到磁盘)、always(每次更新操作后手动调用fsync()将数据写到磁盘)、everysec(每秒同步一次,默认值)。

主从复制

  • slaveof:设置从服务器的主服务器IP地址和端口号。当本机为从服务时,需要指定主服务的IP及端口。
  • masterauth:当本机为从服务时,设置主服务的连接密码。如果主服务器设置了密码保护,则从服务器在连接主服务器时需要进行身份验证。
  • slave-serve-stale-data:当从服务器与主服务器失去联系或复制正在进行时,从服务器的行为设置。如果设置为yes(默认值),从服务器将继续响应客户端请求,但返回的数据可能是过时的。如果设置为no,则除了INFO和SLAVEOF命令之外的任何请求都会返回一个错误信息“SYNC with master in progress”。

安全设置

  • requirepass:设置连接密码。如果配置了连接密码,客户端在连接Redis时需要通过AUTH命令提供密码。

其他设置

  • maxclients:最大客户端连接数。默认不限制,但可以根据服务器的性能和网络环境进行设置。如果达到最大连接数,Redis将关闭新的连接并向客户端返回错误信息。
  • maxmemory:设置Redis使用的最大内存量。当达到最大内存限制时,Redis会尝试清除已到期或即将到期的Key。如果仍然无法释放足够的内存,Redis将无法进行写入操作。
  • tcp-backlog:TCP监听的最大容纳数量。在高并发的环境下,需要把这个值调高以避免客户端连接缓慢的问题。
  • tcp-keepalive:指定ACKs的时间周期(秒)。如果设置为非0值,则表示将周期性地检测客户端是否可用。默认值为0,表示不进行检测。
  • protected-mode:Redis 3.2版本后新增的配置项。默认为yes,即开启保护模式。在保护模式下,如果Redis没有配置密码或绑定IP地址,它将只允许来自本地主机的连接。为了允许外部连接,可以关闭保护模式或配置密码和绑定IP地址。

sentinel.conf 参数详解

sentinel.conf 是 Redis Sentinel 的配置文件,用于定义 Sentinel 的行为、监控的主节点信息、故障转移策略等。以下是对 sentinel.conf 中一些关键参数的详细解释:

基本设置

  • port:Sentinel 实例运行的端口号。每个 Sentinel 实例都需要一个独立的端口号。例如:port 26379。
  • daemonize:是否以守护进程方式运行 Sentinel。默认为 no,如果设置为 yes,则 Sentinel 将在后台运行。
  • logfile:指定 Sentinel 的日志文件路径。如果为空,则日志将输出到标准输出。
  • dir:指定 Sentinel 的工作目录。用于存放 Sentinel 的配置文件、日志文件等。

监控设置

  • sentinel monitor:定义要监控的主节点信息。格式为 sentinel monitor 。其中, 是主节点的名称, 是主节点的 IP 地址, 是主节点的端口号, 是判定主节点最终不可达所需要的票数(即多少个 2、Sentinel 实例认为主节点不可达时,才认为主节点真正不可达)。例如:sentinel monitor mymaster 127.0.0.1 6379 2。
  • sentinel auth-pass:设置连接主节点和从节点的密码。如果主节点和从节点设置了密码保护,则需要通过此参数进行身份验证。格式为 sentinel auth-pass 。

故障转移设置

  • sentinel down-after-milliseconds:定义 Sentinel 认为主节点或从节点不可达的时间阈值(毫秒)。如果在这个时间内没有收到主节点或从节点的响应,则认为该节点不可达。格式为 sentinel down-after-milliseconds 。例如:sentinel down-after-milliseconds mymaster 30000。
  • sentinel parallel-syncs:定义在故障转移期间,可以同时向新主节点发起复制操作的从节点个数。这个值越大,意味着故障转移期间从节点同步新主节点数据的时间总和越长;这个值越小,则意味着在故障转移期间,多个从节点向客户端提供服务时可能仍然使用旧数据。格式为 sentinel parallel-syncs 。例如:sentinel parallel-syncs mymaster 1。
  • sentinel failover-timeout:定义故障转移的超时时间(毫秒)。如果在这个时间内故障转移没有完成,则认为此次故障转移失败。下次对该主节点进行故障转移的时间将是该设置的2倍。格式为 sentinel failover-timeout 。例如:sentinel failover-timeout mymaster 900000。

通知脚本设置

  • sentinel notification-script:定义在故障转移发生时执行的通知脚本。这个脚本可以用来告知系统管理员当前集群的情况。脚本被允许执行的最大时间为60秒,如果超时,脚本将会被终止。脚本执行的结果可以是1(稍后重试,最大重试次数为10)或2(执行结束,无需重试)。格式为 sentinel notification-script 。例如:sentinel notification-script mymaster /var/redis/notify.sh。

其他设置

  • protected-mode:保护模式设置。如果设置为 yes,则 Sentinel 只允许来自本地主机的连接(除非绑定了其他 IP 地址或关闭了保护模式)。默认为 yes。
  • bind:绑定 IP 地址。如果设置了此参数,则 Sentinel 只接受来自这些 IP 地址的连接。
Redis哨兵模式是一种用于高可用性部署的Redis架构。它通过监控Redis主节点的状态,并在主节点故障时自动将其中一个从节点升级为新的主节点,以保证系统的可用性。 要搭建Redis哨兵模式,首先需要准备一组Redis实例,包括一个主节点和多个从节点。然后按照以下步骤进行配置: 1. 配置主节点:在主节点的配置文件(redis.conf)中,设置`port`、`bind`和`daemonize`等参数,并打开`requirepass`选项设置密码保护。重要的是要启用`masterauth`选项并设置与`requirepass`相同的密码。 2. 配置从节点:在每个从节点的配置文件(redis.conf)中,设置`port`、`bind`和`daemonize`等参数,并在配置文件中添加`slaveof`选项,指定主节点的IP地址和端口号。另外,也需要设置与主节点相同的密码保护。 3. 配置哨兵节点:在一个或多个独立的服务器上,分别配置哨兵节点的配置文件(sentinel.conf)。设置`port`、`bind`、`daemonize`以及至少一个监控的主节点的信息,包括IP地址、端口号和密码。例如,使用`sentinel monitor <master-name> <ip> <port> <quorum>`命令添加监控的主节点。 4. 启动Redis实例:依次启动主节点、从节点和哨兵节点的Redis实例。可以使用`redis-server`命令指定配置文件路径来启动实例。 5. 验证哨兵模式:通过`redis-cli`连接到任意一个哨兵节点,并使用`sentinel master <master-name>`命令查看主节点的状态信息。可以使用`sentinel slaves <master-name>`命令查看从节点的状态。 在上述步骤完成后,Redis哨兵模式搭建成功了。如果主节点发生故障,哨兵节点会自动将一个从节点升级为新的主节点,并通知其他从节点更新配置。这样可以保证系统的高可用性和容错性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马爱打代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值