Redis高可用-主从,哨兵,集群

主从复制 Master-Slave主从概念

同时运行多个redis服务端,其中一个作为主(master),其他的一个或多个作为从(slave),主从之间通过网络进行通讯,slave通过复制master的数据来保持与master的数据同步,实现数据冗余;

在Redis中,配置主从复制非常简单,Redis允许slave实例对master进行完整拷贝,在连接断开时,slave会自动重新连接至主实例,并尽可能与master保持同步;

三个主要机制:

当连接可用时,master将发送命令流到slave来使salve保持更新,以下操作将引发该操作,对msater数据的写入操作(包括删除更新),key过期;

master和slave节点都会进行超时检测,当连接不稳定时,slave将尽快重新连接并进行部分重新同步,即不需要完全重新同步;

若无法进行部分重新同步,则slave将发起完全重新同步,master会将最新的数据快照发送给slave,后续的操作仍然是发送命令流;

其他特性:

主从之间,采用异步复制,复制过程中依然可以正常响应客户端操作,支持一主多从,且从节点还可以类似的级联其他从节点,如图所示:

image-20200526184118562

主从复制的作用:

使用主从复制,能够避免Redis的单点故障,实现数据防灾备份;

可配置主节点执行写入,多个从节点分担查询,实现读写分离获得更好的性能

注意:使用主从来做读写分离时,意味主节点自身没有任何持久化数据;如果配置了哨兵,一旦节点重启,则将使用空数据进行同步,导致从节点覆盖所有持久化数据,这是非常危险的,墙裂建议在主节点和从节点上开启持久化,如果一定要关闭,则必须配置主节点禁止哨兵自动重启故障节点;具体故障模式:连接

配置: #配置文件中按以下方式添加主节点的ip 和端口即可 replicaof 192.168.1.1 6379 #若主节点配置了授权密码则需要指定密码 masterauth 密码 #主节点通过以下方式设置授权密码 requirepass 密码 #客户端连接后需要先验证密码 auth 密码 #可通过以下指令查看当前连接的服务的主从信息 info replication 副本只读:

默认情况下副本是只读的,若需要可以通过配置replica-read-only为no来使副本变为可写的,但是要强调的是副本写入的数据,仅写入到当前副本本地,不会同步至任何节点,包括当前副本的副本;当副本重启后这写数据将消失,即临时数据;

哨兵

哨兵(Sentinel) 是为redis提供了高可用性(high available/HA),使用Sentinel部署Redis时,可实现在无需人工干预的情况下,自动完成固定类型的故障修复;是Redis尽可能处于正常工作状态;

哨兵的主要功能:

集群监控:监控redis各个节点是否正常工作;

消息通知:当某个节点出现故障时,可通过API\通知系统管理员或是其他程序;

故障转移(failover):当master无法无法正常工作时,哨兵可以启动故障转移过程,该过程会将某一个slave节点提升为master节点,并主动通知使用redis服务器的应用程序要使用新的地址;

​ 配置中心:当客户端连接至哨兵时,可通过哨兵获取可用的Redis服务信息;

哨兵的分布式性质:

Sentinel本身是一个分布式系统,即会有多个Sentinel进程通过网络协同合作,具有以下优点:

当多个哨兵就某一master不可用这一事实达成共识,才会进行故障转移,降低了因网络波动造成误报的可能性;

即使一些哨兵进程无法工作时,其他可用的哨兵仍然能够正常工作,提供了整个系统应对故障的能力;

反过来,如果只有单独的一个哨兵进程实际上是没有办法提供高可用的;

启动哨兵

哨兵的执行文件本质就是redis的服务端,只不过运行的模式不同了,另外运行哨兵必须提供配置文件,否则将拒绝启动;

首先需要准备配置文件,在下载的源码中找到sentinel.conf 为了后续方便修改可以将其复制到bin目录下

指定master的地址和端口

sentinel monitor mymaster 127.0.0.1 6379 2

启动哨兵的命令有两种写法:

#方式1 redis-sentinel sentinel.conf #方式1 redis-server sentinel.conf --sentinel

若启动哨兵成功可以在控制台中看到其输出的master节点信息;

image-20200527114018119

默认情况下哨兵监听在26379端口上,若开启了防火墙则需要开放该端口,否则哨兵无法正常工作;

完成故障切换的过程

故障切换的定义:

​ 当master不可用时将一个可用的slave提升称为master,使结点保持正常访问;

基于网络存在不稳定性这个特性,一些时候某个哨兵进程可能无法与master正常通讯,但是这并不意味这master真的不可用了,哨兵无法就此认定master不可用这一事实,哨兵需要能够检测master是否客观的不可用了,并在master不可用成为客观事实后开始执行故障切换;

每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器 以及其他Sentinel(哨兵)进程发送一个 PING 命令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyzd.html