绍兴建站服务,如何快速使用模版做网站,两学一做网站网站,海南棋牌网站建设返回目录
说明
clusterCron 每秒执行10次clusterCron 内置了一个iteration计数器。每一次运行clusterCron#xff0c;iteration都加1。当 iteration % 10 0的时候#xff0c;就会随机选取一个节点#xff0c;给它发送PING。而由于clusterCron每秒执行10次#xff0c;所以…返回目录
说明
clusterCron 每秒执行10次clusterCron 内置了一个iteration计数器。每一次运行clusterCroniteration都加1。当 iteration % 10 0的时候就会随机选取一个节点给它发送PING。而由于clusterCron每秒执行10次所以实际上每秒才会PING一次随机节点。
过程
iteration /* 每次运行clusterCron都加一 */
if 配置的cluster-announce-hostname发生了变化:更新myself的hostname
计算handshakeTimeout max(cluster-node-timeout, 3000)
statsPfailNodes 0 /* 重新计算timeout的node数 */
遍历cluster节点字典中的每个node:对于node的inbound link和outbound link:1. 检查它们的发送buffer能否收缩从而节省内存2. 如果配置的cluster-link-sendbuf-limit ! 0检查它们的发送buffer可能经过1的收缩是否超过了限制若是则释放掉相应的link3. 更新统计它们对内存的使用量跳过myself跳过处于NOADDR的node /* 没有地址没法建立连接 */if node处于PFAIL状态:statsPfailNodes /* 计算timeout节点数 */if node处于handshake (当前时间 - node的创建时间 handshakeTimeout:删除node /* 规定时间内没有完成handshake则认为它是未知的节点 */检查node是否disconnected若是,则重建连接在连接创建成功之后: /* 这里是异步执行的 */if node处于MEET状态: /* 我们需要MEET它 */向它发送MEET消息else:向它发送PING消息清除node的MEET标记/* 每秒随机选取一个节点给它发PING */
if iteration % 10 0: /* 每秒clusterCron调度10次每10次发一次PING */从cluster节点字典中随机选取5个node它们满足以下条件:1. 已连接上有outbound link2. pingSent 0 没有在等待PONG3. 不是myself4. 没有处于handshake再从这5个node中选取pongReceived最小的node /* 最久没收到PONG的node*/if 这样的node存在:给它发送PING消息/* 检查节点是否timeout顺便为migrate收集信息 */
orphanedMasters 0 /* 统计orphaned master数 */
maxSlaves 0 /* 统计单个节点拥有的最大slave数 */
thisSlaves 0 /* 如果myself是master表示拥有的slave数如果myself是slave表示它的master所拥有的slave数 */
遍历cluster节点字典的每个node:跳过myself跳过没有地址(NOADDR)的node跳过处于handshake的node/* 检查node是否为orphaned master主要是先收集信息 */if myself是slave node是master node没有FAIL:okSlaves node上没有处于FAIL的slave数/* node是orphaned master的条件:1. slots 02. 当前没有正常运作的slave3. 带有MIGRATE_TO标记曾经有至少一个slave或者被它failover的master曾经拥有slave */if okSlaves 0 node的slots 0 node有MIGRATE_TO标记:orphanedMastersmaxSlaves max(okSlaves, maxSlaves)if node是myself的master:thisSlaves okSlaves/* 如果超过 cluster-node-timeout/2 都没有收到来自node的数据有可能只是连接出了问题尝试重连 */pingDelay 当前时间 - node的pingSentdataDelay 当前时间 - node的dataReceivedif node的link存在 /* 存在连接的才需要检查 */当前时间 - link的创建时间 cluser-node-timeout /* 还没有重连 */node的pingSent 0 /* 已经对node发出了PING */pingDelay cluster-node-timeout/2 /* 超时没有收到PONG */dataDelay cluster-node-timeout/2: /* 超时没有收到其他数据 */释放掉link下次会自动重连参考上面的逻辑/* 检查是否需要PING一下node以保证cluster信息的有效性 */if node的link存在 node的pingSent 0 /* 没有在等待PONG *//* 太久没PING需要PING一下node */当前时间 - node的pongReceived cluster-node-timeout/2: 给node发送PING消息if 我们是node的master而它对我们请求了manual failover:给node发送PING消息/* 如果timeout了就改变node的状态 */if node的pingSent 0: /* 正在等待PONG *//* 加载大量数据时PONG有可能会延时所以如果能收到数据也能说明node还活着 */nodeDelay min(pingDelay, dataDelay) /* 最近一次收到的数据间隔 */if nodeDelay cluster-node-timeout /* node真的timeout了 */node没有处于PFAIL或FAIL:把node设置成timeoutPFAIL状态/* 检查是否可以复制master */
if myself是slave master有地址了 还没开始复制master:更新master的IP和port开始复制/* 检查manual failover是否已经timeout */
if manual failover已经timeout:重置manual failover的状态if myself是slave:处理 Manual Failover /* 在Failover章节叙述 */处理 Slave Failover /* 在Failover章节叙述 *//* 检查我们是否需要migrate到orphaned master */if orphanedMasters 0 /* 存在orphaned master *//* 我们的master拥有最多冗余的slave所以我们可以分离出来成为其中一个orphaned master的slave */maxSlaves 2 thisSlaves maxSlaves cluster-allow-replica-migration: /* 配置允许我们这么做 *//* Step 1: 检查cluster的状态 */if 我们认为当前cluster处于FAIL:跳过migration/* Step 2: 检查我们的master是否拥有多余的slave */if 我们的master拥有的正常slave数 cluster-migration-barrier:跳过migration /* 不能少于配置要求的最少slave数才能做 *//* Step 3查找orphaned master */target null遍历cluster节点字典中的每个node:okSlaves 0isOrphaned 1/* 必须是正常工作没有slave的master而且带有MIGRATE_TO标记含义参考上面 */if node是slave || node处于FAIL || node没有MIGRATE_TO标记):isOrphaned 0 if node是master:okSlaves node拥有的没有处于FAIL的slave数if okSlaves 0:isOrphaned 0if isOrphaned:if target null /* 只查找第一个符合要求的node */node的slots 0: /* 没有slots的master不需要slave */target nodeif node的orphanedTime 0: /* 跟踪记录开始时间 */设置为当前时间else:重置node的orphanedTime为0if okSlaves maxSlaves: /* 我们的master拥有最多的slaves */minID 从node的slaves中查找出最小的IDif myself的ID minID:candidate myself /* 我们当选了 *//* Step 4: 执行migration */ if target ! null /* 找到了orphaned master */candidate myself /* 我们当选了 *//* 需要保持orphaned一段时间如果期间发生failover有可能使得slave和master之间的关系发生变化 */当前时间 - target的orphanedTime 5000ms: 把target设置为我们的新master/* 结束本轮调度前保存cluster的变化 */
if cluster信息发生了变化 || 我们认为cluster处于FAIL状态:更新nodes.conf文件