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 地址的连接。