Redis的主从与redis-sentinel自愈

2019-03-07  本文已影响0人  火鸡不肥
  1. 原理:

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

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

这个特性的运作原理:
从服务器以每秒一次的频率 PING 主服务器一次, 并报告复制流的处理情况。
主服务器会记录各个从服务器最后一次向它发送 PING 的时间。
  1. 主从复制实现:
  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
  1. 开启主从:
    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
  1. 查询主从状态
redis-cli -p 6380 -a 123 info replication
redis-cli -p 6381 -a 123 info replication
redis-cli -p 6382 -a 123 info replication
  1. 模拟主库故障 , 从库切为主库
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
  1. 基于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 &

效果: 当主库挂了, 主库自动切换为数据最新的那台, 其他库将这个库设为主库
当挂了的主库修好加入进来, 自动变为从库

  1. Sentinel管理命令:

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

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

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

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

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

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

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

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

猜你喜欢

热点阅读