Redis6 高可用系列,主从+Sentinel哨兵监控
普通的主从结构,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,人工干预费事费力,还会造成一段时间内服务不可用。
一、哨兵模式介绍
- Redis提供了哨兵的命令,是一个独立的进程
- 哨兵通过发送命令给多个节点,等待Redis服务器响应,从而监控运行的多个Redis实例的运行情况
- 当哨兵监测到master宕机,会自动将slave切换成master,通过通知其他的从服务器,修改配置文件切换主机
Sentinel 三大工作任务
监控(Monitoring)
- Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
提醒(Notification)
- 当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
自动故障迁移(Automatic failover)
- 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器
- 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器
哨兵模式容易出现的问题
- 一个哨兵进程对Redis服务器进行监控,可能会出现问题
- 一般是使用多个哨兵进行监控,各个哨兵之间还会进行监控,形成多哨兵模式
多哨兵模式下线概念名称介绍
主观下线(Subjectively Down, 简称 SDOWN)
- 是单个 Sentinel 实例对服务器做出的下线判断,比如网络问题接收不到通知等
- 一个服务器没有在 down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线
客观下线(Objectively Down, 简称 ODOWN)
- 指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断
- 一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线
- 客观下线条件只适用于主服务器
仲裁 qurum
- Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了【足够数量】的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线
- 这个【足够数量】就是配置文件里面的值,一般是Sentinel个数的一半加1,比如3个Sentinel则就设置为2
- down-after-milliseconds 是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用
- 当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover
二、哨兵模式搭建环境准备
哨兵模式工作基本流程
- 每秒ping,超过时间不响应,则认为主观下线
- 满足多个,则认为是客观下线
- 投票选择主节点
- 如果没有足够的节点同意master下线,则状态会被移除
环境准备
- 配置3个哨兵,每个哨兵的配置都是一样的
- 启动顺序:先启动主再启动从,最后启动3个哨兵
- 开放哨兵端口 26379
配置文件
Redis配置文件
Redis主节点的配置文件 redis.conf
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
masterauth "1qazXSW@"
其余两个从节点的配置文件redis.conf
这里,比主节点的配置多了一行,从节点设置了“是哪个主节点的副本” 写的是主节点的IP和端口
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
# 注意这里,比主节点的配置多了一行,从节点设置了“是哪个主节点的副本” 写的是主节点的IP和端口
replicaof 192.168.75.147 6379
masterauth "1qazXSW@"
Sentinel配置文件,三个节点一致
在 /usr/local/redis/conf 目录中创建 sentinel.conf配置文件,内容如下
# 端口号
port 26379
# 不限制ip
bind 0.0.0.0
# 让sentinel服务后台运行
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
# 这个文件夹需要手动创建
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
# 配置监听的主服务器,mymaster代表服务器的名称,是自定义的;192.168.75.147 6379 代表监控的主服务器和端口
# 2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作
sentinel monitor mymaster 192.168.75.147 6379 2
# 超过5秒master还没有连接上,则认为master已经停止
sentinel down-after-milliseconds mymaster 5000
# sentinel auth-pass定义服务的密码,mymaster是服务名称,1qazXSW@是Redis主服务器密码
sentinel auth-pass mymaster 1qazXSW@
# 如果该时间内没完成failover操作,则认为本次failover失败
sentinel failover-timeout mymaster 30000
三、启动哨兵集群
先启动三个redis节点,再启动三个sentinel哨兵
[root@localhost bin]# ./redis-server ../conf/redis.conf
进入 /usr/local/redis/bin 目录,执行命令,启动三个sentinel哨兵
[root@localhost bin]# ./redis-server ../conf/sentinel.conf --sentinel
可以登录某一节点的客户端 ./redis-cli -a 1qazXSW@ 输入 info replication 命令,查看节点信息
主节点
主节点 role是master
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.75.147,port=6379,state=online,offset=49930,lag=1
slave1:ip=192.168.75.150,port=6379,state=online,offset=50075,lag=0
master_failover_state:no-failover
master_replid:c3fda7b64168dff3811b46b5938196f510697021
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:50075
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:50075
从节点
从节点 role是slave
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.75.149
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:84229
slave_priority:100
slave_read_only:1
connected_slaves:0
master_failover_state:no-failover
master_replid:c3fda7b64168dff3811b46b5938196f510697021
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84229
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84229
四、哨兵集群验证
三个主从节点、三个哨兵集群全部启动之后,可以进行验证,当主节点失效后,通过更改配置文件,将从节点提拔为主节点。
关闭主节点,查看配置文件,或者是log,**下面是配置文件和Log的截图**
1、配置文件:
被关闭的主节点配置文件
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
masterauth "1qazXSW@"
# Generated by CONFIG REWRITE
pidfile "/var/run/redis.pid"
save 3600 1
save 300 100
save 60 10000
user default on sanitize-payload #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all
replicaof 192.168.75.149 6379
# Generated by CONFIG REWRITE 下面的都是sentinel哨兵自动生成的配置文件,仔细看会发现最下方多了一行 replicaof 192.168.75.149 6379 ,因为主节点(IP是 192.168.75.147 6379)被关闭了,已经没有了主节点的身份,再次上线时就会成为新选举的主节点的从节点。
并且,其中多了几个save,说明sentinel自动开启了RDB持久化
被选为主节点的从节点(192.168.75.149 6379)配置文件
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
masterauth "1qazXSW@"
# Generated by CONFIG REWRITE
pidfile "/var/run/redis.pid"
save 3600 1
save 300 100
save 60 10000
user default on sanitize-payload #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all
可以看到中间有个空行,说明他(192.168.75.149 6379)变成了主节点
看另一个从节点
bind 0.0.0.0
port 6379
daemonize yes
requirepass "1qazXSW@"
logfile "/usr/local/redis/log/redis.log"
dbfilename "xdclass.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly.aof"
replicaof 192.168.75.149 6379
masterauth "1qazXSW@"
# Generated by CONFIG REWRITE
pidfile "/var/run/redis.pid"
save 3600 1
save 300 100
save 60 10000
user default on #cadf18c1f78695ce4e58fe233883843120dff3dcc7caee1c98d594cde845b059 ~* &* +@all
另一个没有被选为主节点的从节点的配置文件中,replicaof 已经从 192.168.75.147 6379 变为192.168.75.149 6379,因为主从结构的主节点已经改变。
2、主从节点的Log redis的log 和 sentinel的log
2.1、redis的log
三节点都在启动后,tail -f redis.log 命令,查看三个节点的log
主节点的log redis的log
子节点的log redis的log
只有同步AOF,rewrite混合模式默认开启,数据恢复时,先找aof文件,找到了就开始持久化。找不到aof文件才开始找rdb文件。
此时,关闭主节点,查看log状态 这里查看的是 redis的log
关闭主节点
[root@localhost bin]# ./redis-cli -a 1qazXSW@
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> shutdown
not connected>
主节的点log redis的log
被选为slave的子节点的log redis的log
被选为master的子节点的log redis的log
2.2、sentinel的log
cd 进入给定的sentinel的log目录 cd /var/log/redis/sentinel.log
主节点的log sentinel的log
被选为master的从节点的log sentinel的log
3、Sentinel哨兵集群优缺点
优点
- 主从可以自动切换,可用性更高
缺点
- 主从切换会丢失短暂数据
- 主节点的写能力和存储能力受限
五、Spring整合Redis主从+Sentinel哨兵
- 注释掉 host和port
新增配置
sentinel:
master: mymaster
nodes: 8.129.113.233:26379,8.129.113.233:26380,8.129.113.233:26381
还没有评论,来说两句吧...