1、总结tomcat优化方法

内存空间优化

JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= "
-server:服务器模式
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX:NewSize=:新生代空间初始化大小
-XX:MaxNewSize=:新生代空间最大值

线程池调整

[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
......

常用属性:

  • connectionTimeout :连接超时时长,单位ms
  • maxThreads:最大线程数,默认200
  • minSpareThreads:最小空闲线程数
  • maxSpareThreads:最大空闲线程数
  • acceptCount:当启动线程满了之后,等待队列的最大长度,默认100
  • URIEncoding:URI 地址编码格式,建议使用 UTF-8
  • enableLookups:是否启用客户端主机名的DNS反向解析,缺省禁用,建议禁用,就使用客户端IP就行
  • compression:是否启用传输压缩机制,建议 "on",CPU和流量的平衡
    • compressionMinSize:启用压缩传输的数据流最小值,单位是字节
    • compressableMimeType:定义启用压缩功能的MIME类型text/html, text/xml, text/css,text/javascript

2、java程序出现oom如何解决?什么场景下会出现oom?

什么是OOM

OOM为out of memory的简称,来源于java.lang.OutOfMemoryError,指程序需要的内存空间大于系统分配的内存空间,OOM后果就是程序crash;可以通俗理解:程序申请内存过大,虚拟机无法满足,然后自杀了。

导致OOM问题的原因

1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。 2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。 内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。 内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。 最常见的OOM情况有以下三种:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
  • java.lang.OutOfMemoryError: PermGen space 或 java.lang.OutOfMemoryError:MetaSpace ------>java方法区,(java8 元空间)溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
  • java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

3、简述redis特点及其应用场景

redis特点

  • 速度快: 10W QPS,基于内存,C语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
  • 代码少简单,单线程开发容易,不依赖外部库,使用简单
  • 主从复制
  • 支持高可用和分布式

redis应用场景

  • Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
  • 缓存:数据查询、电商网站商品信息、新闻内容
  • 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
  • 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
  • 消息队列:ELK的日志缓存、部分业务的订阅发布系统
  • 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能

4、对比redis的RDB、AOF模式的优缺点

RDB 模式优点

  • RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者save(会阻塞写操作,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本,很适合备份,并且此文件格式也支持有不少第三方工具可以进行后续的数据分析 比如: 可以在最近的24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一个RDB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
  • RDB可以最大化Redis的性能,父进程在保存 RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
  • RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快

RDB 模式缺点

  • 不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据
  • 如果你需要尽量避免在服务器故障时丢失数据,那么RDB并不适合。虽然Redis允许设置不同的保存点(save point)来控制保存RDB文件的频率,但是,因为RDB文件需要保存整个数据集的状态,所以它并不是一个轻松快速的操作。因此一般会超过5分钟以上才保存一次RDB文件。在这种情况下,一旦发生故障停机,你就可能会丢失好几分钟的数据。
  • 当数据量非常大的时候,从父进程fork子进程进行保存至RDB文件时需要一点时间,可能是毫秒或者秒,取决于磁盘IO性能

AOF模式优点

  • 数据安全性相对较高,根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec,即每秒执行一次 fsync,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync会在后台线程执行,所以主线程可以继续努力地处理命令请求)
  • 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中不需要seek, 即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,可以通过 redis-check-aof 工具来解决数据一致性的问题
  • Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写,重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。
  • AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建
  • AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此 AOF文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。导出(export)AOF文件也非常简单:举个例子,如果不小心执行了FLUSHALL.命令,但只要AOF文件未被重写,那么只要停止服务器,移除 AOF文件末尾的FLUSHAL命令,并重启Redis ,就可以将数据集恢复到FLUSHALL执行之前的状态。

AOF模式缺点

  • 即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
  • AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
  • 根据fsync策略不同,AOF速度可能会慢于RDB
  • bug 出现的可能性更多

5、实现redis哨兵,模拟master故障场景

image.png

哨兵的准备实现主从复制架构

哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用redis架构 注意: master 的配置文件中masterauth 和slave 都必须相同

所有主从节点的redis.conf中关健配置

#在所有主从节点执行
[root@slave1 ~]# yum install -y redis
[root@slave1 ~]# vim /etc/redis.conf
bind 0.0.0.0           #监听所有网段
masterauth "123456"    #哨兵master密码
requirepass "123456"   #Redis数据库登录密码
[root@slave1 ~]# systemctl enable --now redis
#省略slave2和master上的重复操作

配置slave1(实现主从复制)

[root@slave1 ~]# vim /etc/redis.conf 
replicaof 10.0.0.8 6379  #配置主从复制
[root@slave1 log]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:110617
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:bc9871b6b0d1fe1e93be9df3ed9f42a946c3ecaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:110617
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:110617

配置slave2(实现主从复制)

[root@slave2 ~]# vim /etc/redis.conf 
replicaof 10.0.0.8 6379  #配置主从复制
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:183683
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:bc9871b6b0d1fe1e93be9df3ed9f42a946c3ecaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:183683
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:183683

master服务器状态

[root@master etc]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO sentinel
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=4659,lag=1
slave1:ip=10.0.0.18,port=6379,state=online,offset=4791,lag=1
master_replid:bc9871b6b0d1fe1e93be9df3ed9f42a946c3ecaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4791
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4791

编辑哨兵的配置文件

Sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在26379/tcp端口. 哨兵可以不和Redis服务器部署在一起,但一般部署在一起以节约成本 所有redis节点使用相同的以下示例的配置文件


[root@master etc]# grep -vE "^#|^$" /etc/redis-sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 0
#打开redis-sentinel.service
[root@master etc]# systemctl enable --now redis-sentinel.service
#查看redis-sentinel.conf
[root@master etc]# grep -vE "^#|^$" /etc/redis-sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 0
#以下为运行redis-sentinel.service后自动生成内容
sentinel myid 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.0.28 6379
sentinel known-replica mymaster 10.0.0.18 6379
sentinel known-sentinel mymaster 10.0.0.28 26379 b4976cea986d8acb11d60a19e1eb07b0e1535090
sentinel known-sentinel mymaster 10.0.0.18 26379 f240538ed10be63cb14ce16d4c27c44fac300eec
sentinel current-epoch 0
#将从节点的redis-sentinel.conf内容修改成和master一直(自动生成内容不需要手动添加)
#可以使用scp复制至其他主机,但是可能会出现myid相同的情况,手动修改一个数字即可
#省略从节点修改过程

查看日志文件和配置

master日志文件

Last login: Sun May  8 10:20:16 2022 from 10.0.0.1
[root@master ~]# tail -f /var/log/redis/sentinel.log
30754:X 08 May 2022 11:13:03.590 * Removing the pid file.
...
30939:X 08 May 2022 11:51:59.712 * +sentinel sentinel b4976cea986d8acb11d60a19e1eb07b0e1535090 10.0.0.28 26379 @ mymaster 10.0.0.8 6379
30939:X 08 May 2022 11:52:00.102 * +sentinel sentinel f240538ed10be63cb14ce16d4c27c44fac300eec 10.0.0.18 26379 @ mymaster 10.0.0.8 6379
30939:X 08 May 2022 12:12:34.172 * +reboot master mymaster 10.0.0.8 6379
30939:X 08 May 2022 12:12:34.172 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
30939:X 08 May 2022 12:12:34.173 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379

slave1日志文件

Last login: Sun May  8 10:20:35 2022 from 10.0.0.1
[root@slave1 ~]# tail -f /var/log/redis/sentinel.log
2185:X 08 May 2022 11:18:23.266 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2185:X 08 May 2022 11:18:23.266 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=2185, just started
2185:X 08 May 2022 11:18:23.266 # Configuration loaded
2185:X 08 May 2022 11:18:23.266 * supervised by systemd, will signal readiness
2185:X 08 May 2022 11:18:23.267 * Running mode=sentinel, port=26379.
2185:X 08 May 2022 11:18:23.268 # Sentinel ID is f240538ed10be63cb14ce16d4c27c44fac300eec
2185:X 08 May 2022 11:18:23.268 # +monitor master mymaster 10.0.0.8 6379 quorum 2
2185:X 08 May 2022 11:18:26.302 # +sdown master mymaster 10.0.0.8 6379
2185:X 08 May 2022 11:45:18.590 # User requested shutdown...
2185:X 08 May 2022 11:45:18.590 * Removing the pid file.
2185:X 08 May 2022 11:45:18.590 # Sentinel is now ready to exit, bye bye...
2305:X 08 May 2022 11:45:18.598 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2305:X 08 May 2022 11:45:18.598 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=2305, just started
2305:X 08 May 2022 11:45:18.598 # Configuration loaded
2305:X 08 May 2022 11:45:18.598 * supervised by systemd, will signal readiness
2305:X 08 May 2022 11:45:18.599 * Running mode=sentinel, port=26379.
2305:X 08 May 2022 11:45:18.599 # Sentinel ID is f240538ed10be63cb14ce16d4c27c44fac300eec
2305:X 08 May 2022 11:45:18.599 # +monitor master mymaster 10.0.0.8 6379 quorum 2
2305:X 08 May 2022 11:45:21.642 # +sdown master mymaster 10.0.0.8 6379
2305:X 08 May 2022 11:52:00.160 # -sdown master mymaster 10.0.0.8 6379
2305:X 08 May 2022 11:52:01.625 * +sentinel sentinel 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5 10.0.0.8 26379 @ mymaster 10.0.0.8 6379
2305:X 08 May 2022 11:52:01.747 * +sentinel sentinel b4976cea986d8acb11d60a19e1eb07b0e1535090 10.0.0.28 26379 @ mymaster 10.0.0.8 6379
2305:X 08 May 2022 12:12:34.553 * +reboot master mymaster 10.0.0.8 6379
2305:X 08 May 2022 12:12:34.553 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
2305:X 08 May 2022 12:12:34.555 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379

slave2日志文件

Last login: Sun May  8 10:20:51 2022 from 10.0.0.1
[root@slave2 ~]# tail -f /var/log/redis/sentinel.log
2196:X 08 May 2022 11:20:57.171 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2196:X 08 May 2022 11:20:57.171 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=2196, just started
2196:X 08 May 2022 11:20:57.171 # Configuration loaded
2196:X 08 May 2022 11:20:57.171 * supervised by systemd, will signal readiness
2196:X 08 May 2022 11:20:57.172 * Running mode=sentinel, port=26379.
2196:X 08 May 2022 11:20:57.188 # Sentinel ID is b4976cea986d8acb11d60a19e1eb07b0e1535090
2196:X 08 May 2022 11:20:57.188 # +monitor master mymaster 10.0.0.8 6379 quorum 2
2196:X 08 May 2022 11:21:00.176 # +sdown master mymaster 10.0.0.8 6379
2196:X 08 May 2022 11:45:32.836 # User requested shutdown...
2196:X 08 May 2022 11:45:32.836 * Removing the pid file.
2196:X 08 May 2022 11:45:32.836 # Sentinel is now ready to exit, bye bye...
2327:X 08 May 2022 11:45:32.845 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2327:X 08 May 2022 11:45:32.845 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=2327, just started
2327:X 08 May 2022 11:45:32.845 # Configuration loaded
2327:X 08 May 2022 11:45:32.845 * supervised by systemd, will signal readiness
2327:X 08 May 2022 11:45:32.846 * Running mode=sentinel, port=26379.
2327:X 08 May 2022 11:45:32.846 # Sentinel ID is b4976cea986d8acb11d60a19e1eb07b0e1535090
2327:X 08 May 2022 11:45:32.846 # +monitor master mymaster 10.0.0.8 6379 quorum 2
2327:X 08 May 2022 11:45:35.848 # +sdown master mymaster 10.0.0.8 6379
2327:X 08 May 2022 11:51:59.779 # -sdown master mymaster 10.0.0.8 6379
2327:X 08 May 2022 11:52:00.102 * +sentinel sentinel f240538ed10be63cb14ce16d4c27c44fac300eec 10.0.0.18 26379 @ mymaster 10.0.0.8 6379
2327:X 08 May 2022 11:52:01.626 * +sentinel sentinel 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5 10.0.0.8 26379 @ mymaster 10.0.0.8 6379
2327:X 08 May 2022 12:12:34.309 * +reboot master mymaster 10.0.0.8 6379
2327:X 08 May 2022 12:12:34.310 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
2327:X 08 May 2022 12:12:34.310 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379

master的哨兵状态

[root@master etc]# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.8:6379,slaves=2,sentinels=3

测试(master宕机)

[root@master etc]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> shutdown

#master日志文件
[root@master ~]# tail -f /var/log/redis/sentinel.log
....
30939:X 08 May 2022 13:00:27.894 # -odown master mymaster 10.0.0.8 6379
30939:X 08 May 2022 13:00:27.894 # +failover-end master mymaster 10.0.0.8 6379
30939:X 08 May 2022 13:00:27.894 # +switch-master mymaster 10.0.0.8 6379 10.0.0.18 6379
30939:X 08 May 2022 13:00:27.894 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.18 6379
30939:X 08 May 2022 13:00:27.895 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
30939:X 08 May 2022 13:00:30.896 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379

查看slave1日志

#slave1日志文件(slave1和slave2显示内容相同)
[root@slave1 ~]# tail -f /var/log/redis/sentinel.log
...
2305:X 08 May 2022 13:00:25.509 # +sdown master mymaster 10.0.0.8 6379
2305:X 08 May 2022 13:00:25.677 # +new-epoch 1
2305:X 08 May 2022 13:00:25.678 # +vote-for-leader 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5 1
2305:X 08 May 2022 13:00:26.593 # +odown master mymaster 10.0.0.8 6379 #quorum 3/2
2305:X 08 May 2022 13:00:26.593 # Next failover delay: I will not start a failover before Sun May  8 13:06:25 2022
2305:X 08 May 2022 13:00:26.820 # +config-update-from sentinel 07f9c66da9d89d5ae6500f6fc7d6b9a7e05745e5 10.0.0.8 26379 @ mymaster 10.0.0.8 6379
2305:X 08 May 2022 13:00:26.820 # +switch-master mymaster 10.0.0.8 6379 10.0.0.18 6379
2305:X 08 May 2022 13:00:26.820 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.18 6379
2305:X 08 May 2022 13:00:26.820 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
2305:X 08 May 2022 13:00:29.865 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379

查看slave1的replication

#查看slave1(已显示slave1变为新主)
[root@slave1 log]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO replication
#Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.28,port=6379,state=online,offset=605864,lag=0
master_replid:c0e2eb97e0c896e9da2ab7b44f8fa47999339713
master_replid2:bc9871b6b0d1fe1e93be9df3ed9f42a946c3ecaf
master_repl_offset:605864
second_repl_offset:561359
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:605864

查看slave2的replication

#查看slave2(已显示slave2已将18认为新主)
127.0.0.1:6379> info replication
#Replication
role:slave
master_host:10.0.0.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:614278
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c0e2eb97e0c896e9da2ab7b44f8fa47999339713
master_replid2:bc9871b6b0d1fe1e93be9df3ed9f42a946c3ecaf
master_repl_offset:614278
second_repl_offset:561359
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:614278

测试(恢复之前宕机的master)

master日志显示的内容

[root@master etc]# systemctl start redis
[root@master ~]# tail -f /var/log/redis/sentinel.log
...
30939:X 08 May 2022 13:07:14.412 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379

slave1(新主)

[root@slave1 ~]# tail -f /var/log/redis/sentinel.log
...
2305:X 08 May 2022 13:07:13.484 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379
2305:X 08 May 2022 13:07:23.480 * +convert-to-slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379

slave2

[root@slave2 ~]# tail -f /var/log/redis/sentinel.log
...
2327:X 08 May 2022 13:07:14.389 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.18 6379