当前位置: 首页 > 后端技术 > Java

那天,我被Redis主从架构支配的恐惧

时间:2023-04-01 22:23:03 Java

采访者:你说说你最近在看什么?可以拉出来一起讨论(今天不知道问什么)应试者:最近在看《Redis》面试官:嗯,我记得我已经问过Redis的基础和持久化了面试官:说说你们公司Redis的架构怎么样?考生:我之前公司的Redis架构是“shardedcluster”,它使用“Proxy”层将key分发到不同的Redis服务器。应聘者:支持动态扩容,故障恢复等。面试官:那你能说说Proxy层的架构和基本实现原理吗?候选人:抱歉,这是中间件团队的职责。我没有仔细看。应聘者:……面试官:……应聘者:不过,我可以给你讲讲现有的常见的开源Redis架构(:面试官:只能这样了,好吧,开始一种持久化机制,即使Redis重启,也可以依赖RDB或者AOF文件给Candidates重新加载数据:但是此时只有一台Redis服务器存储所有数据,此时如果Redis服务器“暂时无法修复””,那么就没有依赖Redis的服务的候选者:因此,对于Redis是“高可用”的,现在基本都会为Redis做“备份”:再启动一台Redis服务器,形成“主从”的候选者architecture”:“从服务器”的数据被“主服务器”拷贝过来,主从服务器的数据数据一致性候选:如果主服务器宕机,可以“手动”升级“从服务器”服务器”到“主服务器”,以缩短不可用时间。采访者:“主服务器”如何复制自己的数据?《对于“从服务器”?考生:“复制”也叫“同步”,在Redis中,使用“PSYNC”命令进行同步,该命令有全重同步和部分重同步两种模式。考生:可以简单理解为:如果是第一次“同步”,从服务器还没有复制过任何主服务器,或者从服务器要复制的主服务器与上次复制的主服务器不同,则“全量再同步”复制候选采用“模式:如果只是因为网络中断,只是”短期“掉线,那么复制候选将采用”部分重新同步“模式:(如果主从服务器之间的数据差距是太大了,还是会采用“全重同步”模式进行复制)面试官:能稍微解释一下“同步”的原理过程吗?考生:嗯,没问题考生:主服务器要向从服务器复制数据,首先要建立一个Socket“连接”,这个过程会做一些信息校验,身份验证等。考生:然后从服务器会向主服务器发送“PSYNC”命令请求同步(此时会包含“服务器ID”RUNID和“复制进度”偏移量参数。如果从服务器是新的,会有no)Candidate:masterserver如果发现这是一个新的slaveserver(因为没有带上参数),就会采用“fullresynchronization”模式,发送“serverID”(runId)和“replicationprogress”(偏移)到从服务器,从服务器会记录这些信息。面试官:嗯……考生:那么主服务器会在后台生成一个RDB文件,通过之前建立的连接发送给从服务器考生:收到服务器的RDB文件后,先发送自己的Clear数据,然后加载和恢复RDB文件”会被记录在“buffer”中。从服务器加载RDB后,主服务器会将“buffer”中记录的所有命令发送给备选从服务器:这样,主从服务器实现了数据一致性(复制过程是异步的,所以数据是“最终一致性”)面试官:嗯...面试官:“部分重同步”过程呢?考生:嗯,其实是靠在“偏移量”上进行部分重新同步。主服务器每传播一条命令,都会把“偏移量”给从服务器候选者:主服务器和从服务器都会保存“偏移量”(如果两边的偏移量有差异,它表示主从服务器数据没有完全同步)候选:从服务器断开连接后,会向主服务器发送“PSYNC”指令,同时还会携带RUNID和offset(重连后,这些信息仍然存在)面试官:嗯...应聘者:Masterserver收到命令后,查看RUNID是否匹配。如果匹配,则意味着其中的一部分可能已被复制。接下来,因为masterserver使用了一个ringbuffer来记录offset,如果buffer满了,之前的记录会被覆盖)Candidate:如果找到,从offer缺失的部分开始,向Slaveservercandidate发送相应的修改命令:如果没有找到slaveringbuffer,只能使用“fullresynchronization”模式重新进行master-slavereplication。面试官:我理解主从复制,所以你现在说,如果Redis主库挂了,你还是要“手动”升级从库为主库!采访者:你知道有什么方法可以“自动”恢复故障吗?应聘者:有必要,然后是《哨兵》的处女作面试官:开始表演吧。考生:“哨兵”的主要任务是:监控(监控主服务器的状态)、选主(主服务器宕机,选择其中一台从服务器作为主服务器)、通知(故障发送amessagetotheadministrator)和Configuration(作为配置中心,提供当前主服务器的信息)候选:“Sentinel”可以看作是一个运行在“特殊”模式下的Redis服务器。为了“高可用”,Sentinel也是集群架构。考生:首先需要与Redis主从服务器建立对应的连接(获取它们的信息)。考生:每个sentinel不断的使用ping命令查看master服务器是否下线。如果响应正常,当前哨兵会“主观”认为主服务器下线。候选人:其他“哨兵”也会ping主服务器。如果下线,则认为是“客观上下线”,此时必须对主服务器进行故障转移操作。面试官:嗯……考生:会在“哨兵”中选出一个“领头人”,选领头人有很多规则。“LeadingSentinel”执行离线主服务器的故障转移。面试官:嗯……候选人:首先要从“SlaveServer”中选出一个作为masterservercandidate:(这里也要注意选型,比如:从库的配置优先级,确定哪个slaveserver有最大的复制偏移量,RunID的大小,和master断开连接的时长...)候选人:那么,之前的slave服务器需要和新的master服务器进行“主从复制”Candidate:已经下线的主服务器,再次重连时,需要是新主服务器的从服务器面试官:嗯...想问一下,Redis在做主从复制和故障转移的时候会不会导致数据丢失候选:显然是的,从上面的“主从复制”过程来看,这个过程是异步的(复制过程中:master服务器会一直接收请求,然后向Slave服务器发送修改命令)候选:如果主服务器的命令还没有发送到从服务器,它会挂掉。这时候想让从服务器顶主服务器,但是从服务器的数据不全(:考生:还有一种情况:有可能哨兵认为主服务器宕机了,但是事实是主服务器并没有宕机(网络抖动),Sentinel已经选举了一个从服务器为主服务器,此时“客户端”还没有响应,继续向老主写数据候选server:等到旧主服务器重新连接时,已经包含在新主服务器中的从服务器...所以,在那段时间里,客户端向旧主服务器写入的数据丢失了候选者:以上两种情况(master-slavereplicationdelay&&splitbrain),可以通过配置来“尽可能”的避免数据丢失?考生:嗯……说白了,一个shardedcluster就是把一部分数据存储在每个Redis服务器,所有Redis服务器的数据加起来形成一个完整的数据(分布式)考生:如果要组成分片集群,那么需要对不同的key进行“路由”(分片)考生:现在有两种通用的路由方案:“客户端路由”(SDK)和“服务端路由”(Proxy)考生:客户端路由(RedisCluster)代表,服务端路由(Codis)代表面试官:请详细解释一下它们的区别?应聘者:今天有点困了,下次呢?本文总结:Redis实现高可用:AOF/RDB持久化机制主从架构(主服务器挂掉,从服务器手动top)引入sentinel机制失效自动逃逸主从复制原理:PSYNC命令两种模式:全重同步,部分重同步完全重同步:主从服务器建立连接,主服务器生成RDB文件发送给从服务器,主服务器不阻塞(相关修改命令记录在缓冲区),修改命令发送给从服务器。部分重同步:从服务器断开重连,并将RunId和offset发送给主服务器,主服务器判断offset和runId,将未同步的offset相关指令发送给从服务器。哨兵机制:哨兵可以理解为一个特殊的Redis服务器,一般形成一个哨兵集群。哨兵的主要工作是监控、告警、配置和选主,当主服务器出现故障时,会“选出”一台从服务器来代替“客观下线”的服务器,“领头哨兵”进行切换。数据丢失:Redis主从复制和故障转移阶段都可能发生数据丢失(通过配置尽量避免)【在线面试官-手机】系列每周更新两期!【在线面试官-电脑】系列每周更新两期!原创不易!!一连求三!!