Redis的主从与redis-sentinel自愈

1. 原理:

  1. 从服务器向主服务器发送 SYNC 命令。
  2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
  3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
  4. 主服务器将缓冲区储存的所有写命令(广播形式)发送给从服务器执行。

2. 主从数据一致性保证:

min-slaves-to-write # 以及执行写操作所需的至少从服务器数量
min-slaves-max-lag # 用户可以通过配置, 指定网络延迟的最大值

这个特性的运作原理:
从服务器以每秒一次的频率 PING 主服务器一次, 并报告复制流的处理情况。
主服务器会记录各个从服务器最后一次向它发送 PING 的时间。

3. 主从复制实现:

  1. 环境:
    准备两个或两个以上redis实例

     mkdir /data/638{0..2}
    
     配置文件示例:
     cat >> /data/6380/redis.conf << EOF 
     port 6380
     daemonize yes
     pidfile /data/6380/redis.pid
     loglevel notice
     logfile "/data/6380/redis.log"
     dbfilename dump.rdb
     dir /data/6380
     requirepass 123
     masterauth 123
     EOF
    
     cp /data/6380/redis.conf /data/6381/redis.conf
     cp /data/6380/redis.conf /data/6382/redis.conf
    
     sed -i 's#6380#6381#g' /data/6381/redis.conf
     sed -i 's#6380#6382#g' /data/6382/redis.conf
    
     启动:
     redis-server /data/6380/redis.conf
     redis-server /data/6381/redis.conf
     redis-server /data/6382/redis.conf
    
     查看
     netstat -lnp|grep 638
    
     主节点:6380
     从节点:6381、6382
    
  2. 开启主从:

    6381/6382命令行:

    redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
    redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
    
  3. 查询主从状态

    redis-cli -p 6380 -a 123 info replication
    redis-cli -p 6381 -a 123 info replication
    redis-cli -p 6382 -a 123 info replication
    
  4. 模拟主库故障 , 从库切为主库

    redis-cli -p 6380 -a 123 shutdown
    redis-cli -p 6381 -a 123
    info replication
    slaveof no one
    
    6382连接到6381:
    [root@db03 ~]# redis-cli -p 6382 -a 123
    127.0.0.1:6382> SLAVEOF no one
    127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
    

4. 基于redis-sentinel实现自愈

redis-sentinel(哨兵)

作用:

  1. 监控
  2. 自动选主,切换(6381 slaveof no one)
  3. 2号从库(6382)指向新主库(6381)
  4. 应用透明

sentinel搭建过程

mkdir /data/26380
cd /data/26380

cat >> sentinel.conf << EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123 
EOF

启动:
redis-sentinel /data/26380/sentinel.conf &

效果: 当主库挂了, 主库自动切换为数据最新的那台, 其他库将这个库设为主库

当挂了的主库修好加入进来, 自动变为从库

5. Sentinel管理命令:

redis-cli -p 26380

PING :返回 PONG 。
SENTINEL masters :列出所有被监视的主服务器
SENTINEL slaves  
SENTINEL get-master-addr-by-name  : 返回给定名字的主服务器的 IP 地址和端口号。 
SENTINEL reset  : 重置所有名字和给定模式 pattern 相匹配的主服务器。 
SENTINEL failover  : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。

缓存穿透, 雪崩, 击穿概念

缓存穿透
概念
访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决方案
采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。

缓存雪崩
概念
大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决方案
可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。

缓存击穿
概念
一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案
在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

你可能感兴趣的:(Redis的主从与redis-sentinel自愈)