一、什么是哨兵?

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"

Categories: 数据库

0 Comments

发表评论

Avatar placeholder

邮箱地址不会被公开。 必填项已用*标注