免费cms建站系统,女生学动漫制作技术好就业吗,企业培训课程有哪些内容,宣传页模板Redis知识点总结#xff08;六#xff09;——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步
redis的主从同步#xff0c;一般是一个主节点#xff0c;加上多个从节点。只有主节点可以接收写命令#xff0c;主节点接收到的写命令#xff0c;会同步给从节点#… Redis知识点总结六——主从同步、哨兵模式、集群 主从同步哨兵集群 主从同步
redis的主从同步一般是一个主节点加上多个从节点。只有主节点可以接收写命令主节点接收到的写命令会同步给从节点从节点接收到主节点同步过来的写命令会执行该命令把数据写操作应用到内存。主节点和从节点都可以接收读命令从节点可以分担主节点的读请求压力这样就实现了读写分离。 以下是redis主从同步的原理 要开启主从同步我们要在主节点以外多部署一个从节点。然后我们要登上从节点执行replicaof {主节点ip} {主节点port} 的命令。
主从同步开启后从节点会向主节点发送 psync {runid} {offset} 命令。runid是每个节点启动时都会被分配的一个唯一的id值这里psync命令发送的runid是主节点的id如果是重连发送的psyncrunid是之前同步的主节点的id值如果是第一次连接主节点那么runid就是个问号“?”。offset是从节点当前复制到的偏移量因为此时是第一次连接从未进行过主从复制那么发送的offset就是“-1”于是第一次发送的psync命令就是“psync ? -1”。
当主节点接收到从节点发来的psync命令分析发现从节点是第一次同步会给从节点返回一个FULLREPLICA命令表示接下来要进行全量同步。FULLREPLICA命令会带上主节点自己的runid以及主节点目前的写入的偏移量offset。
然后主节点会执行bgsave命令fork出一个子进程子进程会dump出一个rdb快照发给从节点。
从节点接收到rdb快照会首先清空自己的数据然后加载rdb快照。
在主节点执行完bgsave命令之后主节点会继续接收客户端请求期间的写命令会缓存在replication buffer缓冲区中待从节点加载完rdb快照后主节点会把replication buffer中的命令发送给从节点从节点会执行这些命令把它们应用到缓存中。
最后主节点与从节点之间会维持一个长连接基于这个长连接进行命令传播。
如果从节点与主节点的连接断开了从节点会尝试重连流程如下 在断开连接的这一段期间主节点会继续接受请求写命令会被写入一个名叫repl_backlog_buffer的环形缓冲区中这个环形缓冲区在写满后会回到开头进行覆盖写。
当从节点重新连上主节点后从节点会发送 psync {runid} {offset} 命令。
主节点接收到从节点发来的psync命令后会根据里面的offset判断repl_backlog_buffer中对应的写命令是否已被覆盖。如果没有被覆盖那么会把repl_backlog_buffer中从节点的offset到主节点的offset之间的命令发送给从节点这个就是增量同步如果已经被覆盖了那么就要进行全量同步了。
哨兵
当主节点挂掉之后从节点是不会自动切换为主节点的需要我们手动进行切换但是这样就太麻烦了于是就引入了哨兵集群。
哨兵集群由多个哨兵实例组成每个哨兵实例其实就是一个redis节点只是这个节点它不负责数据的读写这个节点以哨兵的角色启动负责对进行数据读写的redis节点进行监控选主和通知这三个工作
监控监控主节点和从节点是否正常运行。选主当主节点下线之后在从节点之中挑选一个提升为主节点。通知发生主从切换之后通知其他从节点与新主节点进行同步通知客户端。 我们只需要给哨兵节点配置主节点的ip地址和端口号即可哨兵节点启动之后就会自动组成哨兵集群。哨兵节点自动组成集群是通过主节点完成的它们在主节点的“__sentinel__:hello”频道执行pub和sub命令也就是进行发布订阅pub命令把自己的ip地址和端口号发布到主节点的“__sentinel__:hello”频道上sub命令订阅主节点的“__sentinel__:hello”频道当其他哨兵节点把自己的ip地址和端口号发布到主节点的该频道当前哨兵节点就可以订阅到其他节点的ip地址和端口号。 哨兵也要对从节点进行监控但是我们启动哨兵的时候并没有配置从节点的ip地址和端口号哨兵也是通过主节点得知从节点的ip地址和端口号的。哨兵节点会向主节点发送一个INFO命令主节点接收到哨兵节点发来的INFO命令会把从节点信息列表返回给哨兵。哨兵获取到主节点返回的从节点信息列表就可以向从节点发起连接。 哨兵持续监控着每一个节点当有节点下线时哨兵会把它标记为主观下线。如果下线的是从节点那么就仅仅是标记为主观下线。如果是发现下线的是主节点则流程稍微复杂一点
首先标记主节点为主观下线询问哨兵集群中的其他节点看是否也把主节点标记为主观下线如果达到quorum配置项指定个数的哨兵节点标记主节点为主观下线则标记主节点为客观下线并且要进行重新选主 重新选主的过程也是比较复杂的。当一个哨兵节点把主节点标记为客观下线后并不是马上进行重新选主而是要在哨兵集群内进行投票选出一个leader它要向哨兵集群内每一个哨兵节点请求投自己一票如果超过半数的哨兵节点都投了赞成票该节点才成为选主的leader由该哨兵节点来进行重新选主。如果该哨兵节点没有成功当上leader那么就看一下哨兵集群中是否已经选出了leader如果哨兵集群中已经选出了leader那么它就啥也不用干了否则就要等待一段时间重新发起选举投票。 重新选主就是从众多从节点当中挑选一个把它提升为主节点。挑选的规则就是先过滤掉有问题的节点然后对剩下的节点进行筛选打分具体流程如下
先过滤掉已下线的从节点以及经常断连的从节点从剩下的从节点中选出一个优先级最高的如果有两个以上的从节点有相同的优先级则选出一个复制进度offset离主节点写入进度最近的如果有两个以上的从节点offset相等并且离主节点的写入进度最近那么从它们之间选出ID最小的一个
选出主节点之后该哨兵节点还要通知其他从节点与新的主节点进行同步还要通知客户端与新的主节点连接。 集群
redis集群Redis Cluster是redis3.0版本提供的redis集群方案。redis集群采用了hash slot哈希槽集群中一共有16384个hash slot。当要往集群中set或get一个key时会用CRC16算法根据key算出一个hash值然后利用该hash值对16384取模得知该key位于哪个hash槽再请求该hash槽被分配到的redis节点进行读写。 我们可以使用 cluster create命令创建redis集群并自动分配hash槽也可以使用cluster meet命令手动建立实例间的连接然后使用cluster addslots命令手动分配hash槽。 分配好hash槽后redis集群中的节点之间会互相交换信息然后集群中的每个节点都拥有了整个集群的hash槽分配情况。 然后当redis客户端连接上集群中的其中一个节点时就能获取到集群中所有hash槽的分配情况客户端会缓存集群信息在本地。 那么当redis客户端要向集群set一个key或者get一个key时就会按照规则进行计算CRC16(key) % 16384得到目标hash槽然后查询本地缓存看看该hash槽属于哪一个redis节点然后再向该节点发起请求。 但是有时候由于发生了集群内hash槽的迁移可能该hash槽已不归该redis节点管理那么该redis节点上就没有对应的key了。此时redis节点会根据情况返回MOVED命令或ASK命令中的其中一个
如果hash槽里的所有key都完成了迁移那么返回MOVED命令并带上该hash槽最新的所属redis节点的ip地址和端口号。如果hash槽里还有部分key没有完成迁移那么返回ASK命令并带上该hash槽最新的所属redis节点的ip地址和端口号。 如果返回的时MOVED命令redis客户端会直接向MOVED命令指定的redis节点发送请求然后会更新本地缓存。 如果返回的是ASK命令redis客户端会先向ASK命令指定的redis节点发送一个ASKING命令表示允许该redis节点执行接下来该客户端发送的命令然后客户端再发送真正的请求但是不会更新本地缓存。