主数据库可以进行读写操作,当写操作导致数据发生变化时会自动将数据同步给从数据库。而一般情况下,从数据库是只读的,并接收主数据库同步过来的数据。 一个主数据库可以有多个从数据库。

1.Redis主从复制原理
2.Redis复制同步原理
3.Redis哨兵模式
4.Redis的雪崩、穿透、击穿

1.Redis主从复制原理

  1. 配从(库)不配主(库):即每新创建一个redis服务时,默认都是master主机
  2. 从机设置方式: slaveof 主库IP 主库端口
  3. 主写从读、读写分离:从机是无法进行写操作的,会出现错误提示
  4. 主断从待命:主机宕机后,从机保持不变,原地待命;主机宕机恢复后,一切恢复正常,从机自动连接主机,恢复主从复制
  5. 从断重新连:从机宕机后,主机的replication的从机连接数减一,其余从机保持不变;从机恢复后,与主机,其余从机都没有任意关系,形如一台新创建的redis服务,需要使用slaveof 主库IP 主库端口,重新设置主从关系
  6. 从机上位:当主机宕机且恢复时间很久时,若需要将从机升级为主机: Ⅰ. 主从关系切断指令 slaveof no one Ⅱ. 其余从机不需要一个个都切断与已宕机主机的主从关系,只需要将目标从机切断主从关系,它就会自动升级为主机,接下来把其余的从机使用slaveof 目标从机的ip 目标从机的端口指令,就会自动建立其余从机与目标从机的主从关系

拓展:从机宕机后,从机跟master断开联系,必须重新设置主从关系,除非写进配置文件

一台主机配多台从机,一台从机再配多台从机,从而实现了庞大的集群架构。同时也减轻了一台主机的压力,缺点是增加了服务器间的延迟

2.Redis复制同步原理

全量复制

slave启动成功连接到master后会发送一个sync命令;Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步;
slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。只要是重新连接master,一次完全同步(全量复制)将被自动执行

增量复制

Master将新的所有收集到的修改命令依次传给slave,完成同步

3.Redis哨兵模式

哨兵模式原理

从机上位的自动版。Redis提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵通过发送命令,来监控主从服务器的运行状态,如果检测到master故障了根据投票数自动将某一个slave转换master,然后通过消息订阅模式通知其它slave,让它们切换主机。然而,一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多哨兵进行监控

哨兵模式搭建

创建 redis_sentinel.conf 文件

1
2
3
4
5
sentinel monitor dc-redis 127.0.0.1 6379 1

- 127.0.0.1 指定监控主机的ip地址
- 6379 指定监控主机的端口号
- 1 得到哨兵的投票数(当哨兵投票数大于或者等于此数时切换主从关系)

新开窗口,启动哨兵:redis-sentinel redis_sentinel.conf

小结:

  1. 查看主从复制关系命令:info replication
  2. 设置主从关系命令:slaveof 主机ip 主机port
  3. 开启哨兵模式命令:./redis-sentinel sentinel.conf
  4. 主从复制原则:开始是全量复制,之后是增量复制
  5. 哨兵模式三大任务:监控,提醒,自动故障迁移
  6. 切断主从关系:slaveof no one

Redis的主从复制最大的缺点就是延迟,主机负责写,从机负责备份,这个过程有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,从机器数量的增加也会使这个问题更加严重

4.Redis的雪崩、穿透、击穿

缓存雪崩

含义:在同一时间段,大量的key失效,导致请求全部打到数据库,有可能搞垮数据库,使整个服务瘫痪。

使缓存集中失效的原因:

1、redis服务器挂掉了。

2、对缓存数据设置了相同的过期时间,导致某时间段内缓存集中失效。

如何解决缓存集中失效:

1、针对原因1,可以实现redis的高可用,Redis Cluster 或者 Redis Sentinel(哨兵) 等方案。

2、针对原因2,设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。

缓存穿透

指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库,一般是指恶意攻击者

解决方案:

1、对于像ID为负数的非法请求直接过滤掉,采用布隆过滤器(Bloom Filter)。

2、针对在数据库中找不到记录的,我们仍然将该空数据存入缓存中,当然一般会设置一个较短的过期时间。

3、接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截

缓存击穿

表示某个key的缓存非常热门,有很高的并发一直在访问,如果该缓存失效,那同时会走数据库,压垮数据库

缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。

解决方案:

1、让该热门key的缓存永不过期。

2、使用互斥锁,通过redis的setnx实现互斥锁


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议