一、什么是哨兵?
Redis Sentinel 是一个分布式的架构,它本身也是一个独立的 Redis 节点,只不过它不存储数据,只支持部分命令,它能够自动完成故障发现和故障转移,并通知应用方,从而实现高可用。
Redis Sentinel 包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其他 Sentinel 节点进行监控,当发现节点异常时,会对节点做下线标识,如果被标识的是主节点,此时会与其他Sentinel 节点进行协商,当大多数Sentinel 节点都人为主节点不可达时候,会发起选举,选出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化通知给 Redis 的应用方。这个过程是完全自动化的,无需人工干预。
二、目录和端口规划
redis节点 6379
哨兵节点 26379
三、db1上配置redis主节点
[root@db1 ~]# [root@db1 ~]# pkill redis
[root@db1 ~]# cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
> daemonize yes
> bind 127.0.0.1 10.0.0.51
> port 6379
> pidfile "/opt/redis_6379/pid/redis_6379.pid"
> logfile "/opt/redis_6379/logs/redis_6379.log"
> dbfilename "redis.rdb"
> dir "/data/redis_6379"
> appendonly yes
> appendfilename "redis.aof"
> appendfsync everysec
> EOF
[root@db1 ~]# systemctl restart redis
[root@db1 ~]# redis-cli
127.0.0.1:6379>
四、db02上配置从节点
[root@db2 ~]# ssh-keygen
[root@db2 ~]# ssh-copy-id 10.0.0.51
[root@db2 ~]# pkill redis
[root@db2 ~]# rm -rf /opt/redis*
[root@db2 ~]# rsync -avz 10.0.0.51:/usr/local/bin/redis-* /usr/local/bin
[root@db2 ~]# rsync -avz 10.0.0.51:/usr/lib/systemd/system/redis.service /usr/lib/systemd/system/
[root@db2 ~]# mkdir /opt/redis_6379/{conf,logs,pid} -p
[root@db2 ~]# mkdir /data/redis_6379 -p
[root@db2 ~]# cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
> daemonize yes
> bind 127.0.0.1 $(ifconfig eth0|awk 'NR==2{print $2}')
> port 6379
> pidfile "/opt/redis_6379/pid/redis_6379.pid"
> logfile "/opt/redis_6379/logs/redis_6379.log"
> dbfilename "redis.rdb"
> dir "/data/redis_6379"
> appendonly yes
> appendfilename "redis.aof"
> appendfsync everysec
> EOF
[root@db2 ~]# useradd redis -M -s /sbin/nologin
[root@db2 ~]# chown -R redis:redis /opt/redis*
[root@db2 ~]# chown -R redis:redis /data/redis*
[root@db2 ~]# systemctl daemon-reload
[root@db2 ~]# systemctl start redis
[root@db2 ~]# redis-cli
127.0.0.1:6379>
五、db03上配置从节点
[root@db2 ~]# ssh-keygen
[root@db2 ~]# ssh-copy-id 10.0.0.51
[root@db2 ~]# pkill redis
[root@db2 ~]# rm -rf /opt/redis*
[root@db2 ~]# rsync -avz 10.0.0.51:/usr/local/bin/redis-* /usr/local/bin
[root@db2 ~]# rsync -avz 10.0.0.51:/usr/lib/systemd/system/redis.service /usr/lib/systemd/system/
[root@db2 ~]# mkdir /opt/redis_6379/{conf,logs,pid} -p
[root@db2 ~]# mkdir /data/redis_6379 -p
[root@db2 ~]# cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
> daemonize yes
> bind 127.0.0.1 $(ifconfig eth0|awk 'NR==2{print $2}')
> port 6379
> pidfile "/opt/redis_6379/pid/redis_6379.pid"
> logfile "/opt/redis_6379/logs/redis_6379.log"
> dbfilename "redis.rdb"
> dir "/data/redis_6379"
> appendonly yes
> appendfilename "redis.aof"
> appendfsync everysec
> EOF
[root@db2 ~]# useradd redis -M -s /sbin/nologin
[root@db2 ~]# chown -R redis:redis /opt/redis*
[root@db2 ~]# chown -R redis:redis /data/redis*
[root@db2 ~]# systemctl daemon-reload
[root@db2 ~]# systemctl start redis
[root@db2 ~]# redis-cli
127.0.0.1:6379>
六、配置主从复制关系
[root@db1 ~]# redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
[root@db1 ~]# redis-cli -h 10.0.0.53 slaveof 10.0.0.51 6379
[root@db1 ~]# redis-cli -h 10.0.0.51 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.53,port=6379,state=online,offset=98,lag=1
slave1:ip=10.0.0.52,port=6379,state=online,offset=98,lag=1
master_replid:bd2c1b4110cf3e2a39664ceeea1b9ac965e9bac9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
七、三台节点上配置哨兵节点
[root@db1 ~]# mkdir -p /data/redis_26379
[root@db1 ~]# mkdir -p /opt/redis_26379/{conf,pid,logs}
[root@db1 ~]# cat >/opt/redis_26379/conf/redis_26379.conf << EOF
> bind $(ifconfig eth0|awk 'NR==2{print $2}')
> port 26379
> daemonize yes
> logfile /opt/redis_26379/logs/redis_26379.log
> dir /data/redis_26379
> sentinel monitor myredis 10.0.0.51 6379 2
> sentinel down-after-milliseconds myredis 3000
> sentinel parallel-syncs myredis 1
> sentinel failover-timeout myredis 18000
> EOF
[root@db1 ~]# chown -R redis:redis /data/redis*
[root@db1 ~]# chown -R redis:redis /opt/redis*
[root@db1 ~]# cat >/usr/lib/systemd/system/redis-sentinel.service<<EOF
> Description=Redis persistent key-value database
> After=network.target
> After=network-online.target
> Wants=network-online.target
> [Service]
> ExecStart=/usr/local/bin/redis-sentinel /opt/redis_26379/conf/redis_26379.conf --supervised systemd
> ExecStop=/usr/local/bin/redis-cli -h 10.0.0.51 -p 26379 shutdown
> Type=notify
> User=redis
> Group=redis
> RuntimeDirectory=redis
> RuntimeDirectoryMode=0755
> [Install]
> WantedBy=multi-user.target
> EOF
[root@db1 system]# systemctl daemon-reload
[root@db1 system]# systemctl start redis-sentinel
[root@db1 system]# redis-cli -h 10.0.0.51 -p 26379
10.0.0.51:26379>
八、配置文件主要解释
sentinel monitor myredis 10.0.0.51 6379 2
主节点名 主节点ip 端口 需要2个哨兵节点同意
sentinel down-after-milliseconds myredis 3000
认定服务器已断线需要的毫秒数
sentinel parallel-syncs myredis 1
1表示轮训发起复制
sentinel failover-timeout myredis 18000
故障转移超时时间
九、哨兵节点注意
哨兵发起故障转移的条件是master节点失去联系,从节点挂掉不会发起故障转移
哨兵启动完成之后,不要再自己去设置主从关系
十、哨兵的常用命令
[root@db1 system]# redis-cli -h 10.0.0.51 -p 26379 SENTINEL get-master-addr-by-name myredis
1) "10.0.0.51"
2) "6379"
[root@db1 system]# redis-cli -h 10.0.0.51 -p 26379 SENTINEL master myredis
[root@db1 system]# redis-cli -h 10.0.0.51 -p 26379 SENTINEL slaves myredis
[root@db1 system]# redis-cli -h 10.0.0.51 -p 26379 SENTINEL ckquorum myredis
OK 3 usable Sentinels. Quorum and failover authorization can be reached
十一、模拟故障,停掉db1的redis,db2的redis被选举为主节点
[root@db1 system]# systemctl stop redis
10.0.0.53:26379> SENTINEL get-master-addr-by-name myredis
1) "10.0.0.52"
2) "6379"
十二、恢复故障,db2的redis依然是主节点
10.0.0.51:26379> SENTINEL get-master-addr-by-name myredis
1) "10.0.0.52"
2) "6379"
十三、查看权重
[root@db1 system]# redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "100"
[root@db2 ~]# redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "100"
[root@db3 redis_6379]# redis-cli -h 10.0.0.53 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "100"
十四、通过设置权重让db3成为主节点
[root@db2 ~]# redis-cli -h 10.0.0.51 -p 6379 CONFIG SET slave-priority 0
OK
[root@db2 ~]# redis-cli -h 10.0.0.52 -p 6379 CONFIG SET slave-priority 0
OK
十五、查看权重
[root@db2 ~]# redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "0"
[root@db2 ~]# redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "0"
[root@db2 ~]# redis-cli -h 10.0.0.53 -p 6379 CONFIG GET slave-priority
1) "slave-priority"
2) "100"
十六、db2弃权发生选举
[root@db2 ~]# redis-cli -h 10.0.0.52 -p 26379 sentinel failover myredis
OK
[root@db2 ~]# redis-cli -h 10.0.0.53 -p 26379 sentinel get-master-addr-by-name myredis
1) "10.0.0.53"
2) "6379"
0 Comments