redis哨兵模式及集群

哨兵模式

在很久以前,服务器挂了,需要运维人员手动把从服务器切换为主服务器,已便恢复正常服务。该方案的缺点很
明显,就是需要人工干预,另外,在修复的时间内,服务不可用。
针对这种问题,redis推出了哨兵模式,所谓哨兵模式,即启动另一个线程,负责监控主服务是否正常,若主服务
异常,哨兵可通过选举模式,在从服务器器中,选出一名候选者担任master。
观看以上描述,我们可以联想,假如这个哨兵比master先挂了呢?因此,我们通常配置多哨兵。多个哨兵服务监控
master服务是否正常,同时,哨兵之前也相互监控,从而保证了redis服务的高可用。

缺点

哨兵也是一个进程,多哨兵意味着多个进程,它会占用内存资源。其次,redis的主从服务,数据是一摸一样的,意味的
会多占用空间。

优点

读写分离,master节点负责写,slaver节点服务读,提高了系统的并发量及吞吐量。

主从配置,如何进行数据同步

  1. slave启动后,通过发送sync命令给master节点,
  2. master节点收到命令后,开始执行bgsave命令生成rdb文件,并同时通过缓冲区纪律之后收到的执行的写命令
  3. 主数据库执行完bgsave命令户,会将rdf文件发送给所有的slaver,并在发送期间继续记录执行的写命令
  4. slave收到rdb文件后,会抛弃所有旧数据,开始执行读取rdb文件。
  5. 主数据库在快照发送完后,开始向从数据库发送缓冲区的写命令
  6. 从数据库完成对rdb文件的载入后,开始接收命令请求,并写入主数据库发来的缓冲区的写命令。到这这一步,从数据库初始化完成
  7. 主数据库每执行完一个写命令后,都会向从数据库发送缓冲区命令,从数据库接收命令并执行
  8. 出现断开重接后,2.8之后的版本会将断线期间的命令传给重数据库,增量复制。
  9. 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步

rdb和aof的区别

rdb体积小,恢复速度快。aof体制大,恢复快。
rdb由缓冲区写入,非实时写入,若服务器在写入之前挂了,则丢失数据。aof实时写入,不容易丢数据,恢复慢。

cluster 集群模式

上面提到的主从模式,由于它主从服务器存储相同的数据,造成内存严重浪费,因此,redis在后来推出了cluster集群
模式。
集群模式,redis建议配置3主3从,也就是6个实例保证服务的高可用。在集群模式下,节点间的数据互不相同,

哈希槽

redis每个节点有16384个哈希槽,每个节点提供2个端口,6379为监听端口,16379为通知端口。数据key通过crc算法计算后,对16384取值,计算数据该存放哪个
槽中。为什么是16384呢?为什么用哈希槽?

基本思想:

(1)一共有16384个槽,每台服务器分管其中的一部分

(2)插入一个数据的时候,先根据CRC16算法计算key对应的值,然后用该值对16384取余数(即CRC16(key) mod 16384),确定将数据放到哪个槽里面

(3)在增加的时候,之前的节点各自分出一些槽给新节点,对应的数据也一起迁出

(4)客户端可以向任何一个Redis节点发送请求,然后由节点将请求重定向到正确的节点上

为什么要选择的槽是16384个呢?
crc16会输出16bit的结果,可以看作是一个分布在0-216-1之间的数,redis的作者测试发现这个数对2{14}求模的会将key在0-2^{14-1}之间分布得很均匀,因此选了这个值。

作者:尚亦汐
链接:https://www.jianshu.com/p/fa623e59fdcf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

集群下,也引入了主从模式,一个主节点对应多个从节点,

什么情况下会数据丢失?

  1. 主节点在执行完客户端发来的写命令后,返回客户端之后在通知从节点之前,挂了。然后,选举协议推选了新的主
    节点,已挂节点在恢复后成为从节点,当时,它没法同步数据,因此,该数据被丢失
    解决方案:
    通过wait命令,使得异步操作变同步,等待主节点写操作在成功通知从节点后返回,wait 1代表最高不嫩延迟超过1秒
    。也可以使用wait 1 1000,延迟1秒后返回成功通知节点个数。

  2. 脑裂。
    现哟集群主节点 A,B,C,及他们的从节点a,b,c,若C节点由于网络抖动或者其他异常,被哨兵发现,通过选举协议,
    推选从节点c升级为主节点。这时候,集群变成了A,B,c主节点,a,b为从节点,后来,C节点恢复正常,C成为c主节点
    的从节点。在网络分裂时期,对C节点的写入数据失败。
    解决方案:主节点子超过一定的时间后无法感应大多数其他主节点,拒绝写入。

你可能感兴趣的:(数据库)