互联网的三高架构
高并发、高性能、高可用
高可用的介绍:全年的时间-不可服用的时长除以全年时长的比例。
业界的目标,五个9,99.999.就是全年宕机低于5.25分钟。
redis服务器是单点的,那么一点出问题就容易完蛋。
为了避免灾难性打击,所以可以建立集群,增加可用性
主从复制介绍
需要解决的问题:如何进行数据同步。
那么核心的主要工作就是:master复制到slave中。
这种形式就叫做主从复制。
高可用集群方案
要是主机出问题了,临时从从机找一个当master,来给其他的slave推数据。
如果master压力很大,也可以找一个slave追加下一级,也来当master。
master和slave是相对的概念。
主从复制的作用
读写分离:master写,slave读。提高读写的负载能力。
负载均衡:基于主从结构,配合读写分离。由slave分担master的负载,并且根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量。
故障恢复:当master出现问题,slave提供服务,实现快速故障恢复。
数据冗余:实现数据备份,是持久化之外的一种数据冗余方式
高可用基石:基于主从复制,建立哨兵模式与集群,实现Redis的高可用方案。
主从复制的工作流程
总述
第一步:slave连master
第二步:master同步数据给slave
第三步:反复同步数据
最起码得由两台计算机用来做两个服务器,有一个主客户端,有一个从客户端。主要来做指令的发送与接收。
工作流程第一阶段:建立连接阶段
保存slave的端口号是为了对slave进行监视。
同时发送指令那块进行授权可以不做,因为服务器很多是靠内网进行访问连接的。
正常的方式是走配置文件的。指定对应的连接信息。
注意断开肯定是从断开。从发出命令就可以了。
工作流程第二阶段:数据同步阶段工作流程
注意master必须执行bgsave,不可以执行save。同时master会创建一个复制缓冲区用来接收其他写进来的数据。
步骤4的请求部分同步数据是把复制缓冲区的信息进行同步。
全量复制:是复制你发指令时候的全部数据。
部分复制:把全量复制过程中的复制缓冲区的指令进行同步。
为什么需要bgrewriteaof,因为很多指令可以进行化简的。
注意数据同步阶段只包括全量复制和部分复制!
第九步发送指令是第三部分的事情了!
数据同步阶段的注意事项:
主从复制第三阶段:命令传播阶段
slave一定要保存master的id的。
复制缓冲区内部工作原理
AOF协议
杠n和杠r是换行符和回车符
同时做了编号,用来识别做到哪了,识别位置的,也就是偏移量。同时下面的叫做字节值。
也就是说如果断网了,可以通过offset来弄。
slave和master都要记住offset。但是记住的东西可以有不同。
这样做的好处是,第二次发送的时候,如果对上的offset不一样,那么就可以重新进行获取。
数据同步+命令传播阶段工作流程总结
注意事项:
第一次连的runid和offset都不知道,所以发一个?和-1,告诉master都要。
然后master就会准备这两个东西,告诉slave。
fullresync是全量同步的意思。
心跳机制
master也会反复发ping来看slave是否在线多少。
主从复制的常见问题
哨兵模式
哨兵的定义:
哨兵的作用
启用哨兵模式
系统模型如下:
sentinel.conf就是哨兵的配置文件
mymaster是自己定义的名字
2的意思是:如果有2个哨兵认为挂了那么就认为这个master挂了,通常设置的数目是哨兵一半+1
第二行的意思是:当多少秒没进行连接就认为他们是挂了
最后一行是多少秒认为同步超时。
把这个文件复制一份进行配置。
哨兵搭建过程略过。。
哨兵工作原理第一阶段:监控阶段
最开始第一个sentinel对master进行info获取信息,然后第二台sentinel获取信息,这个时候他们获取的信息是不一样的,因为第二台获取的信息中会知道master已经有sentinel连到了,但是第一台sentinel中不会有,所以sentinel之间也会进行连接,互相通信。同时也会互相ping一下。确认连接完好。
哨兵工作原理第二阶段:通知阶段
sentinel1进行一个发指令hello确认连接及状态怎么样,然后收到的信息会跟2和3进行信息互通对等。
下一次可能是3或者是2都是不确定的。跟master和slave进行确认。
哨兵模式工作原理第三阶段:故障转移阶段
当sentinel1发现master连接不上的时候,然后标记这个master一个状态,s—down,然后他同时把这个消息传播到自己的朋友圈(内网),等到同网的其他哨兵收到这个信息,也去对这个master进行连接hello,发现也不行的时候,如果超过半数的人发现连接不上,那么状态就会改成o-down。
这个时候有主观下线、客观下线两个说法。就是超过半数认为挂了,就是客观下线。
一旦标记成客观下线,就开始下一个任务。
这里有个投票机制。
如果第一轮没有选出,那么精选次数+1.
同时被选出的sentinel来开始进行处理事务。
这个哨兵开始在slave中选出一个master。
pass掉回应慢的,然后选一个响应速度快的就可以了。
同时还会选一些与原master连接密切的,连接很多的。把时间远的踢掉。
集群
业务发展中的问题
集群的数据存储
一个key开始对应多个存储空间了。
通过一些算法设计来进行设计一个key存储在哪个空间。
如果增加了一个机器增加了存储空间,那么就会把别的槽分一些给这个新的。减去也是一样的。