百味皆苦 java后端开发攻城狮

Redis从入门到高可用之持久化

2020-03-04
百味皆苦

持久化

  • 什么是持久化:redis所有的数据保持在内存中,对数据的更新将异步的保存在磁盘上
  • 持久化方式:快照(MySQL Dump,Redis RDB),写日志(MySQL Binlog,Hbase HLog,Redis AOF)

RDB

3oYWY8.png

  • 触发机制:

    • save(同步)

      文件策略:若存在旧RDB文件,新替换旧

      复杂度:O(N)

    • bgsave(异步)

    • 自动

  • save命令

3otM7t.png

  • bgsave命令

3oNu2F.png

  • save比较bgsave

3oN0rd.png

  • 触发机制:

    全量复制

    debug reload

    shutdown

  • 总结:

    RDB是Redis内存到硬盘的快照,用于持久化

    save通常会阻塞Redis

    bgsave不会阻塞Redis,但是会fork新进程

    save自动配置满足任一就会被执行

    有些触发机制不容忽视

AOF

  • RDB存在哪些问题?
    • 耗时,耗性能
    • 不可控,丢失数据
  • AOF运行原理

3oByIs.png

3oBLz6.png

  • 三种策略:
    • always
    • everysec
    • no
  • always策略

3oDmwQ.png

  • everysec策略(默认值)

3oD3lV.png

  • no策略

3oDr6K.png

  • 比较

3oDsOO.png

  • AOF重写:减少硬盘占用量,加速恢复速度

3orZ1x.png

  • AOF重写两种方式:

    • bgrewriteaof命令

    3or2uT.png

    • 重写配置

    3oroCR.png

  • AOF重写流程

3orObD.png

比较

3oshsf.png

主从复制

  • 主从复制的作用:作为数据副本(如果一个Redis节点宕机了,另一个Redis节点可以继续工作,相当于一个备份),扩展读性能

  • 说明:

    一个master可以有多个slave

    一个slave只能有一个master

    数据流向是单向的,master到slave

实现方式

  • 命令方式

3H3H1g.png

3H8ku9.png

  • 取消复制后再次复制一个节点,这时从节点的数据会被清除
  • 修改配置

3H8K3D.png

  • 比较

3H81ud.png

  • 全量复制:从节点复制主节点已有的数据并且开始同步主节点的数据

3HaudJ.png

  • 全量复制的开销:

    bgsave的时间

    RDB文件网络传输时间

    从节点清空数据时间

    从节点加载RDB的时间

    可能的AOF重写时间

  • 部分复制

3H0eL8.png

主从结构故障转移

  • slave宕机:
  • master宕机:

读写分离

  • 读流量分摊到从节点

3Hsi0f.png

  • 可能发生的问题:复制数据延迟,读到过期数据,从节点故障

哨兵与高可用

  • 什么是主从复制高可用:主从复制,master挂掉后需要收工操作,写能力和存储能力受限(主从复制只是备份,单节点存储能力)
  • 哨兵架构

3XuoM4.png

  • Redis sentinel故障转移:

    多个sentinel发现并确认master有问题

    选举出一个sentinel作为领导

    选出一个slave作为master

    通知其余slave成为新master的slave

    通知客户端主从变化

    等待老的master复活成为新的master的slave

  • 在jedis中的使用

JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName,sentinelSet,poolConfig,timeout);

Jedis jedis = null;
try{
  jedis = sentinelPool.getResource();
  //jedis command
}catch(Exception e){
  logger.error(e.getMessage(),e);
}finally{
  if(jedis != null){
    jedis.close();
  }
}
  • 安装配置:
    • 配置开启主从节点
    • 配置开启sentinel监控主节点,sentinel是特殊的redis
    • 实际应该多台机器
    • 详细配置节点
  • sentinel默认端口是26379,形成如下的安装配置(其实就是单机多实例)

3XKEJf.png

  • 客户端连接
    • sentinel地址集合
    • masterName
    • 不是代理模式
  • 实现原理

3XKNy4.png

3XKdm9.png

3XKf0A.png

总结

3XKOmj.png

集群

数据分区

89Cimn.png

  • 顺序分布

89Cu6J.png

  • 哈希分布

89CJfO.png

  • 比较

89cu2d.png

分布式架构

  • 分布式情况下,节点之间是可以互相通信的,每个节点都负责读写

89Iaz8.png


Comments

Content