文章目录
- 1、原理
- 2、准备
- 2.1、服务器准备
- 2.2、资源准备
- 3、Redis 主从搭建
- 3.1、Redis 安装
- 3.2、redis.conf 配置
- 3.2.1、Redis 主配置
- 3.2.2、Redis 从配置
- 3.3、Redis 启动
- 3.4、Redis 状态
- 3.4.1、master 节点信息
- 3.4.2、slave节点信息
- 4、哨兵配置
- 4.1、sentinel.conf配置
- 4.2、reconfig.sh 企业微信发送脚本
- 4.3、哨兵启动
- 4.4、查看启动状态
- 4.5、其他注意事项
- 5、redis.conf 参数详解
- 6、sentinel.conf 参数详解
1、原理
Redis哨兵模式是一种用于在Redis主从复制环境中进行高可用性监控和故障恢复的机制。该模式引入了一个或多个哨兵节点,这些节点负责监控Redis服务器的状态,并在主节点发生故障时切换为新的主节点。
哨兵节点的工作原理如下:
- 哨兵节点通过发送命令来监控Redis服务器的状态。它会定期向主节点和从节点发送PING命令,检查节点是否存活。
- 当主节点发生故障或不可用时,哨兵节点会进行故障检测。它会询问其他哨兵节点是否已经发现了主节点的故障,并尝试达成共识。
- 如果多数哨兵节点都认为主节点故障,那么它们会选举新的主节点。选举的原则是选择一个具有最高优先级的从节点,如果没有从节点则选择一个具有最高优先级的哨兵节点。
- 一旦新的主节点被选出,哨兵节点会更新所有其他从节点的配置信息,使它们成为新主节点的从节点。
- 当故障的主节点恢复时,哨兵节点会将其重新加入到主从复制环境中,并将其设置为新主节点的从节点。
- 通过哨兵模式,Redis可以实现高可用性和故障恢复。当主节点发生故障时,哨兵节点可以自动切换为新的主节点,使系统可以在故障期间继续提供服务。同时,哨兵节点可以监控并修复其他节点的故障,确保整个Redis集群处于可用状态。
2、准备
2.1、服务器准备
hosts | IP | 服务 |
---|---|---|
redis-01(主) | 192.168.1.1 | redis、sentinel |
redis-02(从) | 192.168.1.2 | redis、sentinel |
redis-03(从) | 192.168.1.3 | redis、sentinel |
关闭所有服务器防火墙
$ 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
2.2、资源准备
redis 下载地址:
http://download.redis.io/releases/
3、Redis 主从搭建
3.1、Redis 安装
在所有服务器执行
注意: 新版本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
3.2、redis.conf 配置
$ vim /home/redis/redis-7.2.4/redis.conf
3.2.1、Redis 主配置
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
3.2.2、Redis 从配置
- masterauth: 以认证的方式连接到master。 如果master中使用了“密码保护”,slave必须交付正确的授权密码,才能连接成功。“requirepass”配置项指定了当前server的密码。此配置项中值需要和master机器的“requirepass”保持一致。
- 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.3、Redis 启动
依次启动所有服务器上的redis 服务
$ /home/redis/redis-7.2.4/src/redis-server /home/redis/redis-7.2.4/redis.conf
3.4、Redis 状态
启动所有服务器后,查看所有redis 节点状态
3.4.1、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
3.4.2、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
4、哨兵配置
在redis的安装目录下有个文件sentinel.conf,这就是哨兵的配置文件。它和redis.conf文件在同级目录
4.1、sentinel.conf配置
$ vim /home/redis/redis-7.2.4/sentinel.conf
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
4.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"]
}
}'
4.3、哨兵启动
$ /home/redis/redis-7.2.4/src/redis-sentinel /home/redis/redis-7.2.4/sentinel.conf
4.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
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
5、redis.conf 参数详解
参数 | 描述 |
---|---|
daemonize no | redis是否作为守护进程的方式运行。 |
pidfile /var/run/redis.pid | 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定 |
loglevel notice | 日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose。 |
logfile “” | 日志输出的路径及文件名称。 |
databases 16 | 数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id。 |
bind 127.0.0.1 | 绑定的主机地址,只有绑定的主机才能访问。 |
port 6379 | 指定Redis监听端口,默认端口为6379,之所以选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码, MERZ取自意大利歌女Alessia Merz,来自程序员的浪漫。 |
tcp-backlog 511 | TCP三次握手后会将接受的连接放到队列中,tcp-backlog就是队列的大小。该参数受操作系统影响,在linux操作系统中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在redis启动时会看到如下日志,并建议将/proc/sys/net/core/somaxconn调大。# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. |
tcp-keepalive 300 | 检测TCP连接活性的周期,默认300s,也就是每隔5分钟对它创建的TCP连接进行活性检测,防止大量的死链接占用系统资源。建议维护成60s。 |
timeout 300 | 客户端空闲连接的超时时间,一旦空闲时间达到了timeout,客户端就会被关闭,如果设置为0的话就不进行检测。 |
maxclients 128 | 同一时间客户端最大连接数,默认10000个连接,当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。 |
save | 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,Redis默认配置文件中提供了三个条件: save 900 1 save 300 10 save 60 10000 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。 |
stop-writes-on-bgsave-error yes | 默认情况下,如果redis最后一次后台保存失败,redis将停止接受写操作。如果后台保存进程重新工作了,redis也将自动的允许写操作。建议改成no。 |
dir ./ | 指定本地数据库存放目录 |
dbfilename dump.rdb | 指定本地数据库文件名,默认值为dump.rdb |
rdbcompression yes | 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,RDB会消耗CPU,但是可大幅度降低文件的体积,建议开启。 |
rdbchecksum yes | 读取和写入的时候是否支持CRC64校验,默认开启 |
requirepass foobared | 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭 |
appendonly yes | 指定是否在每次更新操作后进行日志记录。Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no |
appendfilename appendonly.aof | 指定更新日志文件名,默认为appendonly.aof |
appendfsync everysec | 指定日志刷到磁盘的机制,共有3个可选值: no:由操作系统自行决定数据缓存何时刷到磁盘,相对较快。 always:每次更新操作后手动调用fsync()将数据写到磁盘,性能相对较慢,但是最安全。 everysec:每秒刷新到磁盘一次 |
no-appendfsync-on-rewrite no | 指定后台aof文件在rewrite期间会调用fsync,默认为no,表示要调用fsync。 |
auto-aof-rewrite-percentage 100 | 表示redis触发aof文件rewrite的条件,默认100,表示与上次rewrite的aof文件大小相比,当aof的增长量超过上次aof文件大小的100%时就会触发backgroup rewrit。若配置为0,会禁用rewrite。 |
auto-aof-rewrite-min-size 64mb | 指定触发rewrite的aof文件大小,若aof文件小于该值,及时文件增量达到auto-aof-rewrite-percentage配置的值时,也不会触发rewrite。即这两个条件同时满足时才触发rewrite。 |
aof-load-truncated yes | redis在执行恢复时,当最后一条指令被截断时,如果配置的yes时redis会记录日志并继续,如果设置为no时,redis会失败退出。 |
aof-rewrite-incremental-fsync yes | AOF重写过程中,是否采用增量文件同步的策略。 |
slaveof | 设置当本机为slav服务器时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。 |
masterauth | 当master服务设置了密码保护时,slav服务连接master的密码。 |
slave-serve-stale-data yes | 当slave与master失去连接之后,或者当数据正在复制传输的时候,slave可以继续接受客户端的请求,否则会返回给客户端如下信息:“SYNC with master in progress” |
slave-read-only yes | 从库是否只读 |
repl-diskless-sync no | 全量同步时是否先把快照存于本地,如果存于本地会占用磁盘IO,但是可以服用RDB文件,如果不存于磁盘就会直接把RDB文件发给从库,复用性降低。从库较少时建议设置为yes,采用不存储磁盘的方式。 |
repl-diskless-sync-delay 5 | 当repl-diskless-sync参数为yes时,采用不存储磁盘时,master等待一定时间,等待更多的从库要求增量复制,然后进行并行复制。 |
repl-disable-tcp-nodelay no | 向从库传输数据时,是否禁用socket的TCP_NODELAY选项。若配置为yes则禁用TCP_NODELAY,则TCP协议栈会合并小包统一发送,这样可以节省带宽,但是会造成从库的延迟。若配置为no,表明启用TCP_NODELAY,则TCP协议栈会实时传输数据,减少了从库的延迟,但是需要更大的带宽。建议配置为no以减少从库的延迟。 |
slave-priority 100 | 从库的优先级。集群模式下,优先级越小越容易被选为主库,但是若配置为0,那么该slave永远不会成为master。 |
maxmemory | 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会根据maxmemory-policy清除策略先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再使用SET、LPUSH进行写入操作,但仍然可以进行GET操作。 maxmemory-policy提供了8种清除策略: valatie-lru:从所有最近最少访问数据范围内查找设置了过期时间的数据进行淘汰。 allkeys-lru:从所有数据范围内查找最近最少使用的数据进行淘汰。 volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。 allkeys-random:从所有数据范围内随机选择key进行删除。 Noevction:不执行任何淘汰策略,当达到内存限制后会报错。默认为此策略 volatile-ttl:从设置了过期时间的数据范围内挑选将要过期的数据进行淘汰。 Redis4.X版本开始支持LFU算法。 valatie-lfu:在设置了过期时间的键空间中,移除使用次数最少的key。 allkeys-lfu:在所有键空间范围内,移除使用次数最少的key。 |
slowlog-log-slower-than 10000 | 慢查询被记录的阀值(单位微秒) |
slowlog-max-len 128 | 最多记录慢查询的条数。 |
cluster-enabled yes | 开启集群功能 |
cluster-config-file nodes-6379.conf | 集群配置文件 |
cluster-node-timeout 15000 | 集群节点超时时间(单位毫秒) |
cluster-migration-barrier 1 | 主从节点切换需要的最少从节点个数。 |
cluster-require-full-coverage yes | 集群是否需要所有的slot都分配给在线节点才能正常访问。 |
repl-ping-slave-period 10 | 从服务器每隔一定时间向服务器发送ping探测,时间间隔由该参数配置。 |
cluster-slave-validity-factor 10 | 从节点有效判断因子,当从节点与主节点最后通信时间超过(((cluster-node-timeout) * (slave-validity-factor)) + (repl-ping-slave-period))时,对应的从节点不具备故障转移资格,防止断线时间过长的从节点进行故障转移。设置为0表示从节点永不过期。 |
6、sentinel.conf 参数详解
参数 | 描述 |
---|---|
port “” | 端口号 |
daemonize yes | 运行模式 |
dir “” | 数据目录 |
logfile “*.log” | 日志文件 |
sentinel monitor mymaster 127.0.0.1 端口 2 | (判定主节点下线状态的票数) 监听数据节点 |
sentinel auth-pass mymaster 端口 | 设置主节点连接权限信息 |
sentinel down-after-milliseconds mymaster 30000 | 判断数据节点和sentinel节点多少毫秒数内没有响应ping,则处理为下线状态 |
sentinel parallel-syncs mymaster 1 | 主节点下线后,从节点向新的主节点发起复制的个数限制(指的一次同时允许几个从节点)。 |
sentinel failover-timeout mymaster 180000 | 故障转移超时时间 |