redis哨兵
一、理论
哨兵(sentinel)主要负责监控主从节点运行是否正常,以及当主节点出现故障时自动将一个从节点转换为新的主节点。哨兵是一个独立的进程。
哨兵架构
s1 s2 s3
m
r1 r2
s1、2、3是哨兵。
m是主。
r1、2是从1、从2。
哨兵之间相互监视,s1监视r1,s2监视主,s3监视r2.
启用哨兵只需要在配置文件中添加如下配置
sentinel monitor master-name ip port quorum
sentinel monitor是配置哨兵的命令,master-name是主节点的名称,ip port是IP地址和端口号,最后的quorum用来表示执行故障恢复操作之前至少需要几个哨兵节点同意。
哨兵建立后会定时执行3个任务
1、每10秒哨兵会向主节点和从节点发送info命令。
2、每2秒哨兵会向主节点和从节点发送自己的信息。
3、每1秒哨兵会向主节点、从节点和其他哨兵发送ping命令。
二、实践
1、环境
sentinel01 192.168.10.101
sentinel02 192.168.10.102
sentinel03 192.168.10.103
master 192.168.10.104
slave01 192.168.10.105
slave02 192.168.10.1062、主从
104、105、106
[root@master ~]# dnf -y install gcc*
[root@master ~]# tar zxf redis-6.2.4.tar.gz -C /usr/src/
[root@master ~]# cd /usr/src/redis-6.2.4/
[root@master redis-6.2.4]# make && make PREFIX=/usr/local/redis install
[root@master redis-6.2.4]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@master redis-6.2.4]# mkdir /etc/redis
[root@master redis-6.2.4]# cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
[root@master redis-6.2.4]# cat /etc/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf[Install]
WantedBy=multi-user.target[root@master redis-6.2.4]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.104 # 75行,添加本机地址。
port 6379 # 98行默认存在(redis端口号)。
daemonize yes # 257行进行修改(启用守护进程)。
pidfile /var/run/redis_6379.pid # 289行默认存在(PID文件)。
loglevel notice # 297行默认存在(日志级别)
logfile "/var/log/redis_6379.log" # 203行进行添加(日志文件)。[root@master redis-6.2.4]# systemctl daemon-reload
[root@master redis-6.2.4]# systemctl start redis
[root@master redis-6.2.4]# netstat -anpt | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8328/redis-server 1
tcp 0 0 192.168.10.104:6379 0.0.0.0:* LISTEN 8328/redis-server 1 105、106
[root@slave01 redis-6.2.4]# vim /etc/redis/6379.conf replicaof 192.168.10.104 6479 # 指定主ip及端口
#这样子改完并重启后,主上查看不到连接,connected_slaves显示为0.从上查看信息,显示自己是从,主是104,端口也正确。纳闷。看了看两者之间的区别发现,命令行敲完显示master_link_status:up,而修改配置文件后显示master_link_status:down
# 在replicaof <masterip> <masterport>的下方写就可以使用了。127.0.0.1:6379> slaveof 192.168.10.104 6379
OK
# 执行完此命令后,即可在主上查看到。104
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.105,port=6379,state=online,offset=14,lag=0
slave1:ip=192.168.10.106,port=6379,state=online,offset=14,lag=0
master_failover_state:no-failover
master_replid:f138246ee00f415b4bb715077987a3a2593cfc07
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14105、106127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.10.104
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:182
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f138246ee00f415b4bb715077987a3a2593cfc07
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.10.104
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:182
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f138246ee00f415b4bb715077987a3a2593cfc07
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1823、哨兵
101、102、103
[root@sentinel01 ~]# dnf -y install gcc*[root@sentinel01 ~]# tar zxf redis-6.2.4.tar.gz -C /usr/src/
[root@sentinel01 ~]# cd /usr/src/redis-6.2.4/
[root@sentinel01 redis-6.2.4]# make && make install
[root@sentinel01 redis-6.2.4]# mkdir /etc/redis
[root@sentinel01 redis-6.2.4]# cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf[root@sentinel01 redis-6.2.4]# vim /etc/redis/6379.conf
bind 0.0.0.0 # 75行
daemonize yes # 257行
sentinel monitor master 192.168.10.104 6379 2 # 末尾添加,2表示主节点故障后,至少需要两个哨兵节点同意,才能判断主节点故障。[root@sentinel01 redis-6.2.4]# cat /etc/systemd/system/redis.service
[Unit]
Description=redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf[Install]
WantedBy=multi-user.target[root@sentinel01 redis-6.2.4]# ps -aux | grep redis
root 8552 0.8 0.2 69812 9428 ? Ssl 15:38 0:00 /usr/local/bin/redis-sentinel 0.0.0.0:6379 [sentinel]127.0.0.1:6379> 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=master,status=ok,address=192.168.10.104:6379,slaves=2,sentinels=34、故障转移
主上创建数据,从上能看到。104127.0.0.1:6379> set aaa 1OK127.0.0.1:6379> get aaa"1"
105、106127.0.0.1:6379> get aaa"1"
关闭主104[root@master redis-6.2.4]# systemctl stop redis观察哨兵信息,发现主切换为106101127.0.0.1:6379> info sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=master,status=ok,address=192.168.10.106:6379,slaves=2,sentinels=3从上查看主是谁,发现是106105127.0.0.1:6379> info replication # Replicationrole:slavemaster_host:192.168.10.106master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:42579slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:79d8b586ae2fb1ea21ddeb7090049a22efa70e06master_replid2:f138246ee00f415b4bb715077987a3a2593cfc07master_repl_offset:42579second_repl_offset:36215repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:42579106上查看信息,发现自己成为了主。106127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.10.105,port=6379,state=online,offset=43573,lag=0master_failover_state:no-failovermaster_replid:79d8b586ae2fb1ea21ddeb7090049a22efa70e06master_replid2:f138246ee00f415b4bb715077987a3a2593cfc07master_repl_offset:43573second_repl_offset:36215repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:43573重启104,发现它变为了从。104[root@master redis-6.2.4]# systemctl start redis127.0.0.1:6379> info replication# Replicationrole:slavemaster_host:192.168.10.106master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:54586slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:79d8b586ae2fb1ea21ddeb7090049a22efa70e06master_replid2:0000000000000000000000000000000000000000master_repl_offset:54586second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:54284repl_backlog_histlen:303主上创建数据,从上能查看到。106127.0.0.1:6379> set bbb 2OK104、105127.0.0.1:6379> get bbb"2"