redis sentinel搭建以及基础知识介绍

redis sentinel

目标:主从架构高可用,即当master节点宕机挂掉,选举一个slave来晋升master来保证服务的可用性~
redis sentinel主要实现了手动进行主从切换需要执行命令的步骤,由redis sentinel 来实现~

redis sentinel 不是代理模式,本身不存储数据,直接使用redis sentinel 无法使用set get 命令~

搭建 redis sentinel

  1. 首先搭建好一组主从复制组,并且启动,查看之前的教程~ https://blog.csdn.net/u012129607/article/details/82845773
以6379端口作为master节点,6380、6381为slave节点
启动redis-server 
6380配置示例:
	port 6380
	daemonize yes
	pidfile /var/run/redis_6380.pid
	logfile "/var/logs/redis-6380.log"
	dir /usr/local/var/db/redis/
	slaveof 127.0.0.1 6379
然后 
sed 's/6380/6381/' /usr/local/etc/redis-6380.conf >/usr/local/etc/redis-6381.conf

sudo redis-server /usr/local/etc/redis-6379.conf
sudo redis-server /usr/local/etc/redis-6380.conf
sudo redis-server /usr/local/etc/redis-6381.conf

可以看到主从架构搭建完成
redis sentinel搭建以及基础知识介绍_第1张图片
2. 搭建sentinel 环境

配置示例:
26379节点配置:(redis-sentinel.conf 配置文件和redis.conf 同级,到自己的安装目录里去找 )

cat redis-sentinel.conf |grep -v "#" |sed '/^$/d' > redis-sentinel-26379.conf

port 26379
dir "/data/logs/redis"
logfile "/data/logs/redis/redis-sentinel-26379.log"
sendtinel monitor mymaster 127.0.0.1 6379 2 (2标识至少几台机器发现master有问题时才启用故障转义)
sentinel down-after-milliseconds mymaster 30000 (发生故障,ping多少秒不通然后启用故障转移)
sentinel parallel-syncs mymaster 1 (并发还是串行的,slave向新的master同步时,同时进行最多几个,默认是1 这样可以减轻master的压力)
sentinel failover-timeout mymaster 180000


生成slave节点配置信息
sed 's/26379/26380/' redis-sentinel-26379.conf >redis-sentinel-26380.conf
sed 's/26379/26381/' redis-sentinel-26379.conf >redis-sentinel-26381.conf


启动:
sudo redis-sentinel redis-sentinel-26379.conf
sudo redis-sentinel redis-sentinel-26380.conf
sudo redis-sentinel redis-sentinel-26381.conf

查看日志:
cat /data/logs/redis/redis-sentinel-26379.log    可以看到日志信息

redis sentinel搭建以及基础知识介绍_第2张图片

使用命令行查看配置信息
redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel         (注意这里使用的是sentinel 的端口)

redis sentinel搭建以及基础知识介绍_第3张图片
可以看到有两个slave,sentinels有3个~~
至此,搭建完毕!

测试redis-sentinel 选举,自动切节点领导者选举过程:

ps aux |grep redis
sudo kill -9 24598

redis-cli -h 127.0.0.1 -p 26379 INFO Sentinel 
cat /data/logs/redis/redis-sentinel-26379.log 查看日志
查看信息
redis-cli -h 127.0.0.1 -p 26379
127.0.0.1:26379> sentinel masters  查看主节点信息
127.0.0.1:26379> sentinel masters                                       #可以看到主节点已经变成6380
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "127.0.0.1"
    5) "port"
    6) "6380"
    7) "runid"
    8) "128eed92ea229894fb1116132968f1f614e1beb7"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "744"
   19) "last-ping-reply"
   20) "744"
   21) "down-after-milliseconds"
   22) "30000"
   23) "info-refresh"
   24) "7929"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "490871"
   29) "config-epoch"
   30) "1"
   31) "num-slaves"
   32) "2"
   33) "num-other-sentinels"
   34) "2"
   35) "quorum"
   36) "2"
   37) "failover-timeout"
   38) "180000"
   39) "parallel-syncs"
   40) "1"
127.0.0.1:26379> sentinel slaves mymaster  查看从节点信息

redis sentinel搭建以及基础知识介绍_第4张图片

redis sentinel搭建以及基础知识介绍_第5张图片
日志信息查看
redis sentinel搭建以及基础知识介绍_第6张图片

无感知已经把master节点从 63798转移为6380~
查看整个集群是否有故障节点可以在 redis-cli -p6380 info replication 可以看到现在有几个从节点信息判断整个主从是否正常~
或者redis-cli -p 26379 SENTINEL slaves mymaster 可以查看mymaster 中从节点的信息,通过查看master-link-status的状态来获取集群是否有异常节点

Sentinel 领导者选举算法(Raft协议) http://weizijun.cn/2015/04/30/Raft协议实战之Redis Sentinel的选举Leader源码解析/

  1. 多个sentinel发现并确认master有问题
  2. 选举出一个sentinel作为master
  3. 选出一个slave作为master
  4. 通知其他slvae成为新的master的slave
  5. 通知客户端主从变化
  6. 等待老的master复活成为新的master的slave

如何选举slave

  1. 选择slave-priority(slave节点优先级配置)最高的slave节点,(默认都是一样的)例如:如果我们有两台slave 在两台机器上,一台配置较高,我们希望当master挂掉优先选配置高的,就可以配置该值为slave中最高的。如果存在最高则返回,不存在继续
  2. 选择复制偏移量最大的节点(复制得最完整,与master节点的数据一致性更高),如果存在则返回,不存在继续
  3. 如果以上两个条件都不满足,选runId最小的(启动最早的)

其他事项

sentinel在内部有3个定时任务

  1. 每10秒每个sentinel会对master和slave执行info命令
  2. 每2秒每个sentinel通过master节点的channel交换信息(pub/sub)
  3. 每1秒每个sentinel对其他sentinel和redis节点执行ping操作(相互监控)
    这里可能会有一个问题,如果集群中节点数过多时,会发生(黑洞现象,加机器性能不再提升,反而下降,因为内部相互通信产生大量的网络IO,会影响性能)
    sentinel slave节点为保证数据一致性,一般要设置为不允许写操作,所以客户端操作时,必须要确保修改和操作key的时候使用的是master节点!!!这里需要客户端自己完成这个操作。比如php可以使用predis库,python 也有from redis.sentinel import Sentinel 库

你可能感兴趣的:(redis)