空念 發表於 2025-9-29 09:35:49

Redis 同步机制全面解析

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、Redis 同步机制的核心与价值</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.1 核心需求:数据备份与读写分离</a></li><ul class="third_class_ul"><li><a href="#_label3_0_0_0">数据备份</a></li><li><a href="#_label3_0_0_1">读写分离</a></li></ul><li><a href="#_lab2_0_1">1.2 关键目标:高效、可靠、低延迟</a></li><ul class="third_class_ul"><li><a href="#_label3_0_1_2">高效性实现</a></li><li><a href="#_label3_0_1_3">可靠性保障</a></li><li><a href="#_label3_0_1_4">低延迟优化</a></li></ul></ul><li><a href="#_label1">二、基础同步:主从复制(Master-Slave Replication)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">2.1 主从复制的三个核心阶段</a></li><ul class="third_class_ul"><li><a href="#_label3_1_2_5">阶段 1:建立连接(握手阶段)</a></li><li><a href="#_label3_1_2_6">阶段 2:数据同步(全量 / 增量复制)</a></li><li><a href="#_label3_1_2_7">阶段 3:命令传播(实时同步写操作)</a></li></ul><li><a href="#_lab2_1_3">2.2 主从复制的核心配置</a></li><ul class="third_class_ul"><li><a href="#_label3_1_3_8">主节点配置</a></li><li><a href="#_label3_1_3_9">从节点配置</a></li><li><a href="#_label3_1_3_10">配置验证方法</a></li><li><a href="#_label3_1_3_11">常见问题处理</a></li></ul></ul><li><a href="#_label2">三、高可用同步:哨兵模式(Sentinel)</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_4">3.1 哨兵模式的核心角色与架构</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_2_5">3.2 哨兵模式的同步逻辑(故障转移流程)</a></li><ul class="third_class_ul"><li><a href="#_label3_2_5_12">步骤1:监控(Sentinel Monitoring)</a></li><li><a href="#_label3_2_5_13">步骤2:主观下线与客观下线</a></li><li><a href="#_label3_2_5_14">步骤3:选举新主节点</a></li><li><a href="#_label3_2_5_15">步骤4:故障转移执行</a></li></ul><li><a href="#_lab2_2_6">3.3 哨兵模式的核心配置(实战)</a></li><ul class="third_class_ul"><li><a href="#_label3_2_6_16">关键配置详解</a></li><li><a href="#_label3_2_6_17">配置示例</a></li><li><a href="#_label3_2_6_18">运维检查清单</a></li></ul></ul><li><a href="#_label3">四、分布式同步:Redis Cluster(集群模式)</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_7">4.1 集群模式的核心概念</a></li><ul class="third_class_ul"><li><a href="#_label3_3_7_19">分片机制详解</a></li><li><a href="#_label3_3_7_20">主从复制架构</a></li><li><a href="#_label3_3_7_21">客户端重定向机制</a></li></ul><li><a href="#_lab2_3_8">4.2 集群模式的同步逻辑</a></li><ul class="third_class_ul"><li><a href="#_label3_3_8_22">4.2.1 分片内同步优化</a></li><li><a href="#_label3_3_8_23">4.2.2 故障转移流程详解</a></li></ul><li><a href="#_lab2_3_9">4.3 集群模式的核心配置与实战</a></li><ul class="third_class_ul"><li><a href="#_label3_3_9_24">配置参数详解</a></li><li><a href="#_label3_3_9_25">集群搭建完整流程</a></li><li><a href="#_label3_3_9_26">生产环境建议</a></li></ul></ul><li><a href="#_label4">五、Redis 同步机制的常见问题与优化方案</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_10">5.1 问题1:全量复制频繁触发</a></li><ul class="third_class_ul"><li><a href="#_label3_4_10_27">现象表现</a></li><li><a href="#_label3_4_10_28">原因分析</a></li><li><a href="#_label3_4_10_29">优化方案</a></li></ul><li><a href="#_lab2_4_11">5.2 问题2:从节点同步延迟高</a></li><ul class="third_class_ul"><li><a href="#_label3_4_11_30">现象表现</a></li><li><a href="#_label3_4_11_31">原因分析</a></li><li><a href="#_label3_4_11_32">优化方案</a></li></ul><li><a href="#_lab2_4_12">5.3 问题3:主从数据不一致</a></li><ul class="third_class_ul"><li><a href="#_label3_4_12_33">现象表现</a></li><li><a href="#_label3_4_12_34">原因分析</a></li><li><a href="#_label3_4_12_35">优化方案</a></li></ul><li><a href="#_lab2_4_13">5.4 问题4:集群模式哈希槽迁移导致同步中断</a></li><ul class="third_class_ul"><li><a href="#_label3_4_13_36">现象表现</a></li><li><a href="#_label3_4_13_37">原因分析</a></li><li><a href="#_label3_4_13_38">优化方案</a></li><li><a href="#_label3_4_13_39">1. 主从复制(Replication)</a></li><li><a href="#_label3_4_13_40">2. 哨兵模式(Sentinel)</a></li><li><a href="#_label3_4_13_41">3. 集群模式(Cluster)</a></li><li><a href="#_label3_4_13_42">最终建议:</a></li></ul></ul><li><a href="#_label5">六、Redis 同步机制的选型建议</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、Redis 同步机制的核心与价值</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.1 核心需求:数据备份与读写分离</h3>
<p class="maodian"><a name="_label3_0_0_0"></a></p><h4>数据备份</h4>
<p>在实际生产环境中,单机Redis实例存在多种风险:</p>
<ul><li>服务器硬件故障导致数据永久丢失</li><li>操作系统崩溃导致内存数据未持久化</li><li>误操作删除关键数据</li></ul>
<p>通过同步机制建立主从架构,可以实现:</p>
<ol><li><strong>多副本存储</strong>:数据至少存在于2个节点(1主1从),典型配置为1主2从</li><li><strong>容灾恢复</strong>:当主节点故障时,可快速提升从节点为新主节点</li><li><strong>数据持久化保障</strong>:结合RDB和AOF持久化策略,即使主节点完全损坏,从节点也能提供完整的数据恢复点</li></ol>
<p><strong>示例场景</strong>:电商平台商品库存数据,通过同步机制确保即使主节点宕机,从节点也能继续提供服务,避免超卖。</p>
<p class="maodian"><a name="_label3_0_0_1"></a></p><h4>读写分离</h4>
<p>Redis的主从架构天然支持读写分离:</p>
<ul><li><strong>主节点(Master)</strong>:处理所有写入操作(SET, INCR等)和部分关键读请求</li><li><strong>从节点(Slave)</strong>:处理90%以上的读请求(GET, HGET等),支持配置多个从节点实现水平扩展</li></ul>
<p><strong>优势体现</strong>:</p>
<ul><li>提升系统整体吞吐量:读性能随从节点数量线性增长</li><li>降低主节点负载:将CPU密集型操作(如复杂Lua脚本)分流到从节点</li><li>实现地域就近访问:在不同机房部署从节点,减少网络延迟</li></ul>
<p><strong>典型应用</strong>:</p>
<ul><li>社交平台:主节点处理发帖/点赞等写操作,从节点处理信息流展示</li><li>内容管理系统:主节点处理内容更新,从节点处理内容查询</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>1.2 关键目标:高效、可靠、低延迟</h3>
<p class="maodian"><a name="_label3_0_1_2"></a></p><h4>高效性实现</h4>
<p>Redis采用智能复制策略平衡效率:</p>
<ul><li><strong>全量复制</strong>:
<ul><li>初次连接时执行</li><li>通过RDB快照完成</li><li>优化措施:支持无盘复制(diskless replication)</li></ul></li><li><strong>增量复制</strong>:<ul><li>基于复制积压缓冲区(repl-backlog-buffer)</li><li>默认大小1MB,可根据网络质量调整</li><li>仅传输变更命令,大幅减少带宽占用</li></ul></li></ul>
<p><strong>配置建议</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">repl-backlog-size 16mb# 提升缓冲区大小应对网络不稳定
repl-diskless-sync yes# 启用无盘复制加速全量同步</pre></div>
<p class="maodian"><a name="_label3_0_1_3"></a></p><h4>可靠性保障</h4>
<p>Redis通过多种机制确保同步可靠性:</p>
<ul><li><strong>断点续传</strong>:基于复制偏移量(replication offset)记录同步进度</li><li><strong>心跳检测</strong>:主从定期(默认10秒)PING-PONG通信</li><li><strong>自动重连</strong>:网络恢复后自动重新建立同步连接</li><li><strong>数据校验</strong>:使用CRC64校验和验证数据一致性</li></ul>
<p class="maodian"><a name="_label3_0_1_4"></a></p><h4>低延迟优化</h4>
<p>为实现毫秒级同步延迟,Redis采用:</p>
<ol><li><strong>TCP长连接</strong>:避免频繁建立连接的开销</li><li><strong>异步复制</strong>:主节点不等待从节点ACK继续处理请求</li><li><strong>延迟监控</strong>:<div class="jb51code"><pre class="brush:plain;">INFO replication# 查看master_repl_offset和slave_repl_offset差值</pre></div></li><li><strong>硬件优化</strong>:<ul><li>主从节点部署在同一可用区减少网络延迟</li><li>使用高性能网卡(如10Gbps)</li></ul></li></ol>
<p><strong>性能指标</strong>:</p>
<ul><li>同机房延迟:通常&lt;1ms</li><li>跨机房延迟:取决于网络质量,通常&lt;10ms</li><li>极端情况下可配置WAIT命令实现同步写(牺牲性能换取更强一致性)</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、基础同步:主从复制(Master-Slave Replication)</h2>
<p>主从复制是 Redis 同步机制的基石,所有高级同步(哨兵、集群)均基于此扩展。其核心逻辑是通过主节点(Master)和从节点(Slave)的协作,实现数据的分布式存储和读写分离。从节点主动连接主节点,复制主节点的数据集,并实时同步主节点的写操作。这种架构设计不仅提高了系统的可用性,还能有效分担主节点的读请求压力。</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.1 主从复制的三个核心阶段</h3>
<p>主从复制全流程分为&quot;建立连接&quot;、&quot;数据同步&quot;、&quot;命令传播&quot;三个阶段,缺一不可。这三个阶段构成了一个完整的数据同步生命周期,确保主从节点之间的数据最终一致性。</p>
<p class="maodian"><a name="_label3_1_2_5"></a></p><h4>阶段 1:建立连接(握手阶段)</h4>
<p>从节点通过配置<code>slaveof &lt;master-ip&gt; &lt;master-port&gt;</code>(Redis 5.0 后推荐使用更符合现代语义的<code>replicaof</code>)触发连接流程,具体步骤如下:</p>
<ul><li><strong>初始化连接</strong>:
<ul><li>从节点启动后,向主节点发送<code>SYNC</code>命令(Redis 2.8 前)或更先进的<code>PSYNC</code>命令(Redis 2.8 后,支持增量复制)</li><li>主节点收到命令后,首先验证从节点的<code>requirepass</code>(若配置)与自身<code>masterauth</code>是否一致</li><li>验证通过后,主节点返回<code>+OK</code>响应</li></ul></li><li><strong>建立通信通道</strong>:<ul><li>主节点创建一个专门的&quot;复制客户端&quot;(用于向从节点发送数据)</li><li>从节点创建&quot;复制监听器&quot;(用于接收主节点发送的数据)</li><li>双方完成TCP连接初始化,为后续数据传输做好准备</li></ul></li><li><strong>连接确认</strong>:<ul><li>从节点会定期发送<code>PING</code>命令检测连接状态</li><li>主节点响应<code>PONG</code>确认连接正常</li></ul></li></ul>
<p class="maodian"><a name="_label3_1_2_6"></a></p><h4>阶段 2:数据同步(全量 / 增量复制)</h4>
<p>这是同步的核心阶段,分为两种模式:全量复制(首次同步或从节点断线过久)和增量复制(从节点短期断线后恢复)。选择哪种模式取决于从节点的同步状态和断开时间。</p>
<h5>2.2.1 全量复制:从 0 到 1 复制完整数据集</h5>
<p>当遇到以下情况时会触发全量复制:</p>
<ul><li>从节点是全新节点,从未同步过数据</li><li>从节点的<code>replid</code>(主节点标识)与主节点不一致</li><li>从节点的复制偏移量<code>offset</code>不在主节点的复制积压缓冲区范围内</li></ul>
<p><strong>全量复制详细流程</strong>:</p>
<ul><li><strong>发起请求</strong>:
<ul><li>从节点发送<code>PSYNC ? -1</code>命令(表示请求全量复制)</li></ul></li><li><strong>主节点准备RDB</strong>:<ul><li>主节点接收到请求后,执行<code>bgsave</code>命令在后台生成RDB快照文件</li><li>在生成RDB期间,主节点会缓存所有写操作(如<code>SET</code>、<code>HSET</code>)到&quot;复制积压缓冲区&quot;</li></ul></li><li><strong>传输RDB文件</strong>:<ul><li>RDB生成完成后,主节点通过专用连接将RDB文件分块传输给从节点</li><li>传输过程中使用TCP滑动窗口机制优化网络传输效率</li></ul></li><li><strong>从节点加载数据</strong>:<ul><li>从节点收到RDB文件后,首先安全地清空自身数据集</li><li>然后将RDB文件加载到内存中,重建数据库</li></ul></li><li><strong>同步缓冲命令</strong>:<ul><li>主节点发送完RDB后,将&quot;复制积压缓冲区&quot;中的写操作按顺序发送给从节点</li><li>从节点执行这些命令,确保与主节点数据完全一致</li></ul></li></ul>
<p><strong>性能考量</strong>:</p>
<ul><li>RDB生成过程会fork子进程,可能导致短暂延迟</li><li>网络传输大数据量可能成为瓶颈</li><li>从节点加载RDB时会出现服务暂停</li><li>建议在业务低峰期执行全量复制,并确保网络带宽充足</li></ul>
<h5>2.2.2 增量复制:仅同步断线期间的增量数据</h5>
<p>当从节点短期断线(如网络闪断)后重新连接,且主节点的&quot;复制积压缓冲区&quot;仍保留断线期间的写操作时,触发增量复制。这种模式显著提高了同步效率。</p>
<p><strong>增量复制详细流程</strong>:</p>
<ul><li><strong>重新连接</strong>:
<ul><li>从节点重新连接主节点时,发送<code>PSYNC &lt;replid&gt; &lt;offset&gt;</code>命令</li><li><code>replid</code>是主节点标识,<code>offset</code>是从节点最后一次同步的位置</li></ul></li><li><strong>主节点验证</strong>:<ul><li>主节点验证<code>replid</code>是否与自身一致</li><li>检查<code>offset</code>是否在&quot;复制积压缓冲区&quot;的有效范围内(缓冲区保留的操作)</li></ul></li><li><strong>执行增量同步</strong>:<ul><li>验证通过后,主节点仅将<code>offset</code>之后的写操作从缓冲区发送给从节点</li><li>从节点执行这些增量命令,快速追上主节点数据状态</li></ul></li></ul>
<p><strong>增量复制的关键条件</strong>:</p>
<ol><li>从节点需正确记录上一次同步的<code>replid</code>和<code>offset</code>(存储在<code>replica.conf</code>中)</li><li>主节点的&quot;复制积压缓冲区&quot;需足够大,能够容纳断线期间的写操作</li><li>断线时间未超过<code>repl-backlog-ttl</code>(默认3600秒),避免缓冲区被清空</li></ol>
<p><strong>优化建议</strong>:</p>
<ul><li>对于写操作频繁的场景,适当增大<code>repl-backlog-size</code></li><li>监控从节点的复制延迟,及时发现潜在问题</li><li>定期检查复制积压缓冲区的使用情况</li></ul>
<p class="maodian"><a name="_label3_1_2_7"></a></p><h4>阶段 3:命令传播(实时同步写操作)</h4>
<p>数据同步完成后,主从进入&quot;命令传播&quot;阶段,这是维持数据一致性的关键环节。主节点每执行一次写命令,都会将该命令发送给所有从节点,从节点执行相同命令,确保数据实时同步。</p>
<p><strong>命令传播的详细机制</strong>:</p>
<ul><li><strong>写命令传播流程</strong>:
<ul><li>客户端向主节点发送写命令(如<code>SET key value</code>)</li><li>主节点执行命令并修改本地数据</li><li>主节点将命令封装为Redis协议格式,发送给所有从节点</li><li>从节点接收并执行相同命令</li></ul></li><li><strong>性能优化策略</strong>:<ul><li>主节点采用&quot;异步发送&quot;模式:写命令执行后立即返回客户端,随后异步将命令发送给从节点</li><li>从节点通过<code>repl-disable-tcp-nodelay</code>配置控制TCP特性:</li><li>默认<code>no</code>(关闭TCP_NODELAY):TCP会缓冲小数据包,减少网络请求数,但可能增加毫秒级延迟</li><li>设为<code>yes</code>(开启TCP_NODELAY):写命令立即发送,延迟降低,但网络请求数增加</li></ul></li><li><strong>复制偏移量监控</strong>:<ul><li>主从节点都会维护复制偏移量<code>offset</code></li><li>通过<code>INFO replication</code>可以查看主从节点的<code>master_repl_offset</code>和<code>slave_repl_offset</code></li><li>两者的差值反映了复制延迟</li></ul></li></ul>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.2 主从复制的核心配置</h3>
<p class="maodian"><a name="_label3_1_3_8"></a></p><h4>主节点配置</h4>
<table><thead><tr><th>配置项</th><th>示例值</th><th>说明</th><th>推荐设置</th></tr></thead><tbody><tr><td><code>bind</code></td><td><code>0.0.0.0</code></td><td>允许从节点远程连接</td><td>生产环境建议绑定具体IP</td></tr><tr><td><code>protected-mode</code></td><td><code>no</code></td><td>关闭保护模式</td><td>必须关闭才能远程连接</td></tr><tr><td><code>port</code></td><td><code>6379</code></td><td>主节点服务端口</td><td>默认6379,可修改</td></tr><tr><td><code>requirepass</code></td><td><code>Str0ngP@ss</code></td><td>主节点访问密码</td><td>生产环境必须设置</td></tr><tr><td><code>masterauth</code></td><td><code>Str0ngP@ss</code></td><td>主从同步验证密码</td><td>需与从节点密码一致</td></tr><tr><td><code>repl-backlog-size</code></td><td><code>32mb</code></td><td>复制积压缓冲区大小</td><td>写频繁场景建议增大</td></tr><tr><td><code>repl-backlog-ttl</code></td><td><code>3600</code></td><td>缓冲区保留时间</td><td>默认3600秒(1小时)</td></tr></tbody></table>
<p class="maodian"><a name="_label3_1_3_9"></a></p><h4>从节点配置</h4>
<table><thead><tr><th>配置项</th><th>示例值</th><th>说明</th><th>推荐设置</th></tr></thead><tbody><tr><td><code>replicaof</code></td><td><code>192.168.1.1 6379</code></td><td>指定主节点地址</td><td>Redis 5.0+使用</td></tr><tr><td><code>slaveof</code></td><td><code>192.168.1.1 6379</code></td><td>Redis 5.0前使用</td><td>已弃用</td></tr><tr><td><code>requirepass</code></td><td><code>Str0ngP@ss</code></td><td>从节点密码</td><td>需与主节点masterauth一致</td></tr><tr><td><code>replica-read-only</code></td><td><code>yes</code></td><td>从节点只读模式</td><td>默认开启,防止误写</td></tr><tr><td><code>repl-disable-tcp-nodelay</code></td><td><code>yes</code></td><td>TCP优化选项</td><td>延迟敏感场景开启</td></tr></tbody></table>
<p class="maodian"><a name="_label3_1_3_10"></a></p><h4>配置验证方法</h4>
<ul><li><strong>主节点检查</strong>:</li><li><div class="jb51code"><pre class="brush:plain;">redis-cli -a yourpassword info replication</pre></div></li><li>查看<code>connected_slaves</code>是否为预期的从节点数量,以及每个从节点的状态信息。</li><li><strong>从节点检查</strong>:</li><li><div class="jb51code"><pre class="brush:plain;">redis-cli -a yourpassword info replication</pre></div></li><li>确认<code>master_host</code>和<code>master_port</code>是否正确,<code>master_link_status</code>是否为<code>up</code>(表示连接正常)。</li><li><strong>复制延迟监控</strong>: 比较主节点的<code>master_repl_offset</code>和从节点的<code>slave_repl_offset</code>,两者的差值即为复制延迟。</li></ul>
<p class="maodian"><a name="_label3_1_3_11"></a></p><h4>常见问题处理</h4>
<ul><li><strong>连接失败</strong>:
<ul><li>检查防火墙设置</li><li>验证密码配置是否正确</li><li>确认主节点<code>bind</code>配置允许远程连接</li></ul></li><li><strong>同步中断</strong>:<ul><li>检查网络连接状态</li><li>查看日志文件定位问题</li><li>适当增大<code>repl-timeout</code>(默认60秒)</li></ul></li><li><strong>性能优化</strong>:<ul><li>对于大型数据集,考虑在低峰期执行全量同步</li><li>适当调整<code>repl-backlog-size</code>避免频繁全量同步</li><li>监控复制延迟,及时发现性能瓶颈</li></ul></li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>三、高可用同步:哨兵模式(Sentinel)</h2>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>3.1 哨兵模式的核心角色与架构</h3>
<p>哨兵模式是一个分布式系统,由以下三部分组成:</p>
<ul><li><strong>哨兵节点(Sentinel)</strong>:
<ul><li>独立的Redis进程,不存储业务数据</li><li>主要职责:</li><li>持续监控主从节点健康状态</li><li>检测到主节点故障时自动触发故障转移</li><li>通知客户端主从拓扑变更</li><li>充当服务发现的配置中心</li></ul></li><li><strong>主节点(Master)</strong>:<ul><li>与普通Redis主节点功能相同</li><li>需要响应哨兵的监控请求</li><li>向哨兵报告其从节点列表</li></ul></li><li><strong>从节点(Slave)</strong>:<ul><li>与普通Redis从节点功能相同</li><li>自动被哨兵发现并监控</li><li>在故障转移时可能被提升为新主节点</li></ul></li></ul>
<p><strong>架构设计要点</strong>:</p>
<ul><li>哨兵节点数量必须&ge;3且为奇数(推荐3或5个)<ul><li>原因:避免脑裂,确保故障转移需要&quot;多数哨兵同意&quot;的机制能正常工作</li><li>示例:3个哨兵时,至少需要2个哨兵达成共识才能执行故障转移</li></ul></li><li>主从节点数量可根据业务需求灵活配置<ul><li>典型配置:1主2从+3哨兵(适合中小规模应用)</li><li>大型系统可能采用:1主5从+5哨兵</li></ul></li></ul>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>3.2 哨兵模式的同步逻辑(故障转移流程)</h3>
<p class="maodian"><a name="_label3_2_5_12"></a></p><h4>步骤1:监控(Sentinel Monitoring)</h4>
<p>哨兵节点通过以下机制实现全面监控:</p>
<ul><li><strong>初始配置</strong>:</li><li><div class="jb51code"><pre class="brush:plain;">sentinel monitor mymaster 192.168.1.1 6379 2</pre></div>
<ul><li><code>mymaster</code>:主节点别名</li><li><code>192.168.1.1:6379</code>:主节点地址</li><li><code>2</code>:判定客观下线需要的哨兵票数</li></ul></li><li><strong>健康检查机制</strong>:<ul><li>每1秒发送<code>PING</code>命令到所有被监控节点</li><li>正常响应:返回<code>PONG</code></li><li>每10秒发送<code>INFO replication</code>到主节点</li><li>获取从节点列表及其复制状态</li><li>自动发现新增的从节点</li></ul></li><li><strong>哨兵集群通信</strong>:<ul><li>使用Redis的Pub/Sub功能</li><li>每2秒通过<code>__sentinel__:hello</code>频道广播节点状态</li><li>维护哨兵之间的共识状态</li></ul></li></ul>
<p class="maodian"><a name="_label3_2_5_13"></a></p><h4>步骤2:主观下线与客观下线</h4>
<ul><li><strong>主观下线(SDOWN)</strong>:
<ul><li>触发条件:单个哨兵在<code>down-after-milliseconds</code>(默认30秒)内未收到主节点的有效响应</li><li>处理动作:该哨兵将主节点标记为&quot;主观下线&quot;</li></ul></li><li><strong>客观下线(ODOWN)</strong>:</li><li>触发流程:<ul><li>发起投票:哨兵发送<code>SENTINEL is-master-down-by-addr</code>命令询问其他哨兵</li><li>收集响应:等待其他哨兵回复(包含它们对主节点状态的判断)</li><li>达成共识:当&ge;<code>quorum</code>个哨兵同意主节点不可用时,标记为&quot;客观下线&quot;</li><li>示例:配置<code>quorum=2</code>时,需要至少2个哨兵确认主节点故障</li></ul></li></ul>
<p class="maodian"><a name="_label3_2_5_14"></a></p><h4>步骤3:选举新主节点</h4>
<p>选举过程采用多级排序策略:</p>
<ul><li><strong>第一优先级:replica-priority</strong>
<ul><li>配置项:<code>replica-priority</code>(默认100)</li><li>规则:数值越小优先级越高</li><li>应用场景:可以手动指定某些从节点优先被选为主节点</li></ul></li><li><strong>第二优先级:复制偏移量(offset)</strong><ul><li>比较各从节点与主节点的数据同步进度</li><li>选择复制进度最接近原主节点的从节点</li><li>确保数据丢失最少</li></ul></li><li><strong>第三优先级:runid</strong><ul><li>Redis实例启动时生成的唯一标识</li><li>按字典序选择runid较小的节点</li><li>作为最终裁决条件</li></ul></li></ul>
<p class="maodian"><a name="_label3_2_5_15"></a></p><h4>步骤4:故障转移执行</h4>
<p>完整的故障转移流程:</p>
<ul><li><strong>提升新主</strong>:</li><li><div class="jb51code"><pre class="brush:sql;">SLAVEOF NO ONE
</pre></div>
<ul><li>取消新主节点的从属关系</li><li>使其开始接受写请求</li></ul></li><li><strong>重配置从节点</strong>:</li><li><div class="jb51code"><pre class="brush:sql;">REPLICAOF &lt;new-master-ip&gt; &lt;new-master-port&gt;
</pre></div></li><li>所有从节点开始同步新主节点的数据</li><li>采用增量复制或全量复制(取决于复制偏移量)</li><li><strong>旧主节点处理</strong>:<ul><li>当旧主节点恢复后,自动被配置为新主节点的从节点</li><li>通过<code>INFO replication</code>命令可以验证复制关系</li></ul></li><li><strong>客户端通知</strong>:<ul><li>哨兵通过<code>+switch-master</code>事件通知客户端</li><li>客户端应实现自动重连机制</li></ul></li></ul>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>3.3 哨兵模式的核心配置(实战)</h3>
<p class="maodian"><a name="_label3_2_6_16"></a></p><h4>关键配置详解</h4>
<table><thead><tr><th>配置项</th><th>说明</th><th>推荐值</th></tr></thead><tbody><tr><td><code>port 26379</code></td><td>哨兵服务端口</td><td>通常保持默认</td></tr><tr><td><code>sentinel monitor &lt;name&gt; &lt;ip&gt; &lt;port&gt; &lt;quorum&gt;</code></td><td>定义监控的主节点</td><td>根据网络环境调整</td></tr><tr><td><code>sentinel down-after-milliseconds &lt;name&gt; 30000</code></td><td>主观下线判定时间</td><td>生产环境建议30-60秒</td></tr><tr><td><code>sentinel failover-timeout &lt;name&gt; 180000</code></td><td>故障转移超时时间</td><td>根据网络延迟调整</td></tr><tr><td><code>sentinel parallel-syncs &lt;name&gt; 1</code></td><td>并行同步数量</td><td>较大集群可适当增加</td></tr></tbody></table>
<p class="maodian"><a name="_label3_2_6_17"></a></p><h4>配置示例</h4>
<div class="jb51code"><pre class="brush:plain;"># sentinel.conf
port 26379
sentinel monitor mycluster 10.0.0.1 6379 2
sentinel down-after-milliseconds mycluster 50000
sentinel failover-timeout mycluster 120000
sentinel auth-pass mycluster MySecurePassword
sentinel parallel-syncs mycluster 2</pre></div>
<p class="maodian"><a name="_label3_2_6_18"></a></p><h4>运维检查清单</h4>
<ol><li><p><strong>启动哨兵</strong>:</p>
<div class="jb51code"><pre class="brush:bash;">redis-sentinel /etc/redis/sentinel.conf</pre></div></li><li><p><strong>监控命令</strong>:</p>
<div class="jb51code"><pre class="brush:bash;">redis-cli -p 26379 sentinel masters# 查看所有监控的主节点
redis-cli -p 26379 sentinel slaves mymaster# 查看指定主节点的从节点</pre></div></li><li><p><strong>故障模拟测试</strong>:</p>
<div class="jb51code"><pre class="brush:bash;"># 模拟主节点宕机
redis-cli -p 6379 DEBUG sleep 60
# 观察哨兵日志
tail -f /var/log/redis/sentinel.log</pre></div></li><li><p><strong>客户端配置</strong>:</p>
<ul><li>应配置连接所有哨兵节点地址</li><li>实现自动故障转移处理逻辑</li><li>示例Java客户端配置:<div class="jb51code"><pre class="brush:plain;">JedisSentinelPool pool = new JedisSentinelPool("mymaster",
    new HashSet&lt;String&gt;(Arrays.asList(
      "sentinel1:26379",
      "sentinel2:26379",
      "sentinel3:26379")));</pre></div></li></ul></li></ol>
<p class="maodian"><a name="_label3"></a></p><h2>四、分布式同步:Redis Cluster(集群模式)</h2>
<p class="maodian"><a name="_lab2_3_7"></a></p><h3>4.1 集群模式的核心概念</h3>
<p class="maodian"><a name="_label3_3_7_19"></a></p><h4>分片机制详解</h4>
<p>Redis Cluster 使用 CRC16 算法计算 key 的哈希值,然后对 16384 取模得到对应的哈希槽。例如:</p>
<ul><li>key &quot;user:1001&quot; 的 CRC16 值为 12345,则哈希槽为 12345 % 16384 = 12345</li><li>key &quot;product:2002&quot; 的 CRC16 值为 54321,则哈希槽为 54321 % 16384 = 54321</li></ul>
<p>哈希槽分配示例:</p>
<ul><li>3 节点集群:节点1(0-5460)、节点2(5461-10922)、节点3(10923-16383)</li><li>5 节点集群:每个节点约 3276 个槽</li></ul>
<p class="maodian"><a name="_label3_3_7_20"></a></p><h4>主从复制架构</h4>
<p>每个主节点可以配置多个从节点,形成多副本保护。从节点会:</p>
<ul><li>实时同步主节点数据</li><li>在主节点故障时参与选举</li><li>可配置为可读副本分担读压力</li></ul>
<p class="maodian"><a name="_label3_3_7_21"></a></p><h4>客户端重定向机制</h4>
<p>当客户端访问错误节点时,会收到两种重定向响应:</p>
<ol><li><strong>MOVED</strong>:永久重定向,表示槽已迁移到指定节点</li><li><strong>ASK</strong>:临时重定向,发生在集群扩容/缩容期间</li></ol>
<p class="maodian"><a name="_lab2_3_8"></a></p><h3>4.2 集群模式的同步逻辑</h3>
<p class="maodian"><a name="_label3_3_8_22"></a></p><h4>4.2.1 分片内同步优化</h4>
<ul><li><strong>集群感知复制</strong>:
<ul><li>从节点加入时通过 <code>CLUSTER MEET</code> 发现拓扑</li><li>只同步所属分片的槽数据</li><li>定期交换集群状态信息</li></ul></li><li><strong>读写分离配置</strong>:</li><li><div class="jb51code"><pre class="brush:plain;"># 允许从节点处理读请求
cluster-replica-ok yes</pre></div>
<ul><li>启用后,从节点可以:</li><li>响应本地持有的槽的读请求</li><li>其他槽请求仍返回 MOVED</li></ul></li></ul>
<p class="maodian"><a name="_label3_3_8_23"></a></p><h4>4.2.2 故障转移流程详解</h4>
<ul><li><strong>故障检测阶段</strong>:
<ul><li>从节点每秒发送 PING</li><li>超时后标记主节点为 <code>PFail</code> (Possible Failure)</li><li>收集其他节点的确认信息</li></ul></li><li><strong>选举投票规则</strong>:<ul><li>每个主节点有且只有一票</li><li>从节点按以下条件竞选:</li><li>复制偏移量最新</li><li>节点运行时间最长</li><li>节点ID字典序最小</li></ul></li><li><strong>数据同步阶段</strong>:<ul><li>新主节点生成新的复制ID</li><li>其他从节点执行部分重同步(PSYNC)</li><li>故障期间写入使用故障转移标记</li></ul></li></ul>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>4.3 集群模式的核心配置与实战</h3>
<p class="maodian"><a name="_label3_3_9_24"></a></p><h4>配置参数详解</h4>
<table><thead><tr><th>配置项</th><th>推荐值</th><th>说明</th></tr></thead><tbody><tr><td>cluster-require-full-coverage</td><td>no</td><td>允许部分槽不可用时集群仍可服务</td></tr><tr><td>cluster-migration-barrier</td><td>1</td><td>主节点最少从节点数才开始迁移</td></tr><tr><td>cluster-replica-no-failover</td><td>no</td><td>从节点是否参与故障转移</td></tr></tbody></table>
<p class="maodian"><a name="_label3_3_9_25"></a></p><h4>集群搭建完整流程</h4>
<p><strong>准备阶段</strong>:</p>
<div class="jb51code"><pre class="brush:bash;"># 创建6个实例配置
for port in {6379..6384}; do
mkdir -p /redis/${port}
cp redis.conf /redis/${port}/
sed -i "s/port 6379/port ${port}/" /redis/${port}/redis.conf
done</pre></div>
<p><strong>启动节点</strong>:</p>
<div class="jb51code"><pre class="brush:plain;"># 启动所有节点
for port in {6379..6384}; do
redis-server /redis/${port}/redis.conf
done</pre></div>
<p><strong>创建集群</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">redis-cli --cluster create \
127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 \
127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 \
--cluster-replicas 1 \
--cluster-yes</pre></div>
<p><strong>验证集群</strong>:</p>
<div class="jb51code"><pre class="brush:plain;"># 检查集群状态
redis-cli -p 6379 cluster nodes | grep master
# 测试数据分布
redis-cli -c -p 6379 set foo bar</pre></div>
<p class="maodian"><a name="_label3_3_9_26"></a></p><h4>生产环境建议</h4>
<ul><li><strong>节点规划</strong>:
<ul><li>至少3个物理机部署</li><li>每个物理机部署主从节点对</li><li>预留30%内存用于故障转移</li></ul></li><li><strong>监控指标</strong>:<ul><li>槽分布均衡性</li><li>节点间延迟</li><li>故障转移次数</li><li>集群状态变化</li></ul></li><li><strong>运维操作</strong>:<ul><li>使用 <code>redis-cli --cluster reshard</code> 进行槽迁移</li><li>定期执行 <code>CLUSTER REPLICATE</code> 调整拓扑</li><li>备份时使用 <code>CLUSTER SAVECONFIG</code></li></ul></li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>五、Redis 同步机制的常见问题与优化方案</h2>
<p class="maodian"><a name="_lab2_4_10"></a></p><h3>5.1 问题1:全量复制频繁触发</h3>
<p class="maodian"><a name="_label3_4_10_27"></a></p><p class="maodian"><a name="_label3_4_11_30"></a></p><p class="maodian"><a name="_label3_4_12_33"></a></p><p class="maodian"><a name="_label3_4_13_36"></a></p><h4>现象表现</h4>
<p>从节点频繁断开与重连,每次重连都触发全量复制(RDB文件传输),导致主节点CPU和网络带宽占用过高,影响正常业务请求处理。监控中可观察到主节点CPU使用率周期性飙升,网络出口流量激增。</p>
<p class="maodian"><a name="_label3_4_10_28"></a></p><p class="maodian"><a name="_label3_4_11_31"></a></p><p class="maodian"><a name="_label3_4_12_34"></a></p><p class="maodian"><a name="_label3_4_13_37"></a></p><h4>原因分析</h4>
<ol><li><strong>复制缓冲区过期</strong>:从节点断线时间超过repl-backlog-ttl(默认3600秒)后,复制积压缓冲区被清空,无法支持增量复制</li><li><strong>缓冲区容量不足</strong>:复制积压缓冲区(repl-backlog-size)设置过小(默认16MB),断线期间的写操作超出缓冲区容量</li><li><strong>主节点标识变更</strong>:主节点runid因重启等原因变更,导致从节点保存的replid与主节点不一致</li><li><strong>网络环境不稳定</strong>:网络抖动或带宽不足导致连接频繁中断</li></ol>
<p class="maodian"><a name="_label3_4_10_29"></a></p><p class="maodian"><a name="_label3_4_11_32"></a></p><p class="maodian"><a name="_label3_4_12_35"></a></p><p class="maodian"><a name="_label3_4_13_38"></a></p><h4>优化方案</h4>
<ul><li><strong>调整缓冲区参数</strong>:
<ul><li>将repl-backlog-size从16MB调整为64-128MB(根据业务写入量计算:缓冲区大小=平均写入速率&times;最大预期断线时间)</li><li>将repl-backlog-ttl从3600秒延长至86400秒(1天)</li></ul></li><li><strong>保障主节点稳定性</strong>:<ul><li>主节点配置appendonly yes,开启AOF持久化</li><li>使用config set命令动态调整参数,避免重启</li><li>部署主节点高可用方案(如哨兵)</li></ul></li><li><strong>网络优化</strong>:<ul><li>主从节点部署在同一机房或可用区</li><li>使用专线连接跨机房节点</li><li>避免在网络拥堵时段进行部署或维护</li></ul></li><li><strong>监控与告警</strong>:<ul><li>监控info replication中的connected_slaves和master_repl_offset</li><li>设置全量复制次数阈值告警</li></ul></li></ul>
<p class="maodian"><a name="_lab2_4_11"></a></p><h3>5.2 问题2:从节点同步延迟高</h3>
<h4>现象表现</h4>
<p>从节点数据与主节点差距较大,通过info replication查看master_repl_offset与slave_repl_offset差值持续增大,从节点读取到旧数据。在电商秒杀等高并发场景下,可能导致库存超卖等问题。</p>
<h4>原因分析</h4>
<ol><li><strong>主节点写入压力大</strong>:QPS过高导致命令传播不及时</li><li><strong>TCP缓冲延迟</strong>:repl-disable-tcp-nodelay设为no(默认)时,TCP会缓冲数据导致延迟</li><li><strong>从节点性能瓶颈</strong>:<ul><li>CPU资源不足,无法及时处理命令</li><li>内存不足,频繁触发swap</li><li>磁盘IO性能差(RDB加载慢)</li></ul></li><li><strong>从节点数量过多</strong>:单个主节点挂载过多从节点(&gt;5个)</li></ol>
<h4>优化方案</h4>
<ul><li><strong>网络传输优化</strong>:
<ul><li>从节点配置repl-disable-tcp-nodelay yes</li><li>调整TCP内核参数(net.ipv4.tcp_slow_start_after_idle=0)</li></ul></li><li><strong>架构优化</strong>:<ul><li>使用Redis Cluster分散写入压力</li><li>实现读写分离,将读请求分散到多个从节点</li><li>限制单个主节点的从节点数量(建议&le;5)</li></ul></li><li><strong>硬件升级</strong>:<ul><li>为从节点配置多核CPU(&ge;8核)</li><li>使用SSD替代HDD</li><li>增加内存容量,避免swap</li></ul></li><li><strong>监控措施</strong>:<ul><li>实时监控slave_repl_offset差值</li><li>设置延迟阈值告警(如&gt;100MB)</li></ul></li></ul>
<p class="maodian"><a name="_lab2_4_12"></a></p><h3>5.3 问题3:主从数据不一致</h3>
<h4>现象表现</h4>
<p>主节点执行写命令后,部分从节点未同步该命令,导致主从数据差异。通过redis-cli的diff命令可以检测到不一致的键值,在金融交易等场景可能导致严重问题。</p>
<h4>原因分析</h4>
<ol><li><strong>异步复制特性</strong>:Redis默认采用异步复制,主节点宕机可能导致数据丢失</li><li><strong>从节点误写入</strong>:replica-read-only配置为no(默认yes)时,从节点可能被误写入</li><li><strong>网络分区</strong>:部分从节点长时间无法连接主节点</li><li><strong>命令传播失败</strong>:主节点在命令传播过程中崩溃</li></ol>
<h4>优化方案</h4>
<ul><li><strong>一致性配置</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;">min-replicas-to-write 2
min-replicas-max-lag 10
</pre></div>
<ul><li>表示至少2个从节点延迟不超过10秒才允许写入</li><li><strong>从节点保护</strong>:<ul><li>强制所有从节点配置replica-read-only yes</li><li>定期检查从节点配置</li></ul></li><li><strong>高可用部署</strong>:<ul><li>部署Redis Sentinel自动故障转移</li><li>使用Redis Cluster分区容错</li><li>跨机房部署时考虑网络分区场景</li></ul></li><li><strong>数据校验机制</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;"># 集群模式检查
redis-cli --cluster check &lt;host&gt;:&lt;port&gt;

# 主从数据对比
redis-cli -h master --scan | while read key; do
diff=$(redis-cli -h master GET "$key" | diff - &lt;(redis-cli -h slave GET "$key"))
[ -n "$diff" ] &amp;&amp; echo "$key: $diff"
done
</pre></div>
<ul><li><strong>定期修复</strong>:
<ul><li>设置定时任务校验数据一致性</li><li>发现不一致时触发从节点resync</li></ul></li></ul>
<p class="maodian"><a name="_lab2_4_13"></a></p><h3>5.4 问题4:集群模式哈希槽迁移导致同步中断</h3>
<h4>现象表现</h4>
<p>在Redis Cluster扩容/缩容时,执行CLUSTER SETSLOT MIGRATING/IMPORTING命令迁移哈希槽过程中,部分从节点同步中断,客户端请求返回MOVED/ASK重定向错误。</p>
<h4>原因分析</h4>
<ol><li><strong>数据变更频繁</strong>:迁移过程中大量键被修改,增量复制压力大</li><li><strong>网络波动</strong>:迁移期间网络不稳定导致连接中断</li><li><strong>资源竞争</strong>:迁移过程占用大量CPU和网络资源</li><li><strong>配置不一致</strong>:迁移后集群拓扑信息未及时同步</li></ol>
<h4>优化方案</h4>
<ul><li><strong>迁移时机选择</strong>:
<ul><li>选择业务低峰期(如凌晨2-4点)执行迁移</li><li>监控QPS和系统负载,在负载较低时操作</li></ul></li><li><strong>参数调优</strong>:<ul><li>迁移前调大repl-backlog-size(如调整为256MB)</li><li>设置cluster-node-timeout(默认15秒)为更合理的值</li></ul></li><li><strong>迁移过程控制</strong>:</li></ul>
<div class="jb51code"><pre class="brush:sql;"># 分批迁移键空间
redis-cli --cluster rebalance \
--cluster-weight node1=1 node2=0 \
--cluster-use-empty-masters
</pre></div>
<ul><li><strong>监控与恢复</strong>:
<ul><li>使用cluster slots实时监控迁移进度</li><li>迁移完成后检查所有节点cluster_state状态</li><li>对同步中断的从节点执行cluster failover强制重新同步</li></ul></li><li><strong>客户端处理</strong>:<ul><li>客户端实现ASK/MOVED重试逻辑</li><li>使用Redis集群代理屏蔽复杂度</li></ul></li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>六、Redis 同步机制的选型建议</h2>
<p class="maodian"><a name="_label3_4_13_39"></a></p><h4>1. 主从复制(Replication)</h4>
<p><strong>适用场景</strong>:</p>
<ul><li>单机扩展、读写分离</li><li>数据备份容灾</li><li>测试/开发环境</li></ul>
<p><strong>推荐方案</strong>: 主从复制 + 读写分离(1主多从)</p>
<p><strong>优势</strong>:</p>
<ul><li>配置简单(通过replicaof命令即可完成)</li><li>性能开销低(异步复制)</li><li>从节点可分担读请求(如QPS 10万+的场景)</li></ul>
<p><strong>劣势</strong>:</p>
<ul><li>主节点宕机需人工切换(需要运维介入)</li><li>可用性较低(无自动故障转移)</li><li>数据延迟(异步复制导致)</li></ul>
<p><strong>典型应用</strong>: 电商商品详情页缓存、新闻资讯类应用</p>
<p class="maodian"><a name="_label3_4_13_40"></a></p><h4>2. 哨兵模式(Sentinel)</h4>
<p><strong>适用场景</strong>:</p>
<ul><li>高可用需求</li><li>自动故障转移</li><li>7x24小时服务</li></ul>
<p><strong>推荐方案</strong>: 至少3个哨兵节点+1主2从</p>
<p><strong>优势</strong>:</p>
<ul><li>自动监控和故障转移(30秒内完成切换)</li><li>支持通知机制(可通过API对接监控系统)</li><li>配置中心(自动更新客户端连接信息)</li></ul>
<p><strong>劣势</strong>:</p>
<ul><li>仅支持单主架构(写入瓶颈)</li><li>无法解决数据分片问题</li><li>脑裂问题需要特殊处理</li></ul>
<p><strong>配置示例</strong>:</p>
<div class="jb51code"><pre class="brush:plain;">sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000</pre></div>
<p class="maodian"><a name="_label3_4_13_41"></a></p><h4>3. 集群模式(Cluster)</h4>
<p><strong>适用场景</strong>:</p>
<ul><li>大数据量(TB级)</li><li>高并发写入</li><li>需要水平扩展</li></ul>
<p><strong>推荐方案</strong>: 至少3主3从(官方推荐)</p>
<p><strong>优势</strong>:</p>
<ul><li>自动数据分片(16384个slot)</li><li>支持水平扩展(可动态增删节点)</li><li>高可用(主从自动切换)</li></ul>
<p><strong>劣势</strong>:</p>
<ul><li>配置复杂(需要规划槽位分配)</li><li>客户端需要支持集群协议</li><li>跨slot操作受限(如事务、Lua脚本)</li></ul>
<p><strong>性能指标</strong>:</p>
<ul><li>单节点:8-10万QPS</li><li>集群:线性扩展(如10节点可达80-100万QPS)</li></ul>
<p class="maodian"><a name="_label3_4_13_42"></a></p><h4>最终建议:</h4>
<h5>中小规模业务(数据量 &lt;10GB,读多写少)</h5>
<p><strong>方案</strong>:主从复制 + 哨兵模式 <strong>实施要点</strong>:</p>
<ol><li>部署1主2从架构</li><li>配置3个哨兵节点</li><li>设置合理的down-after-milliseconds(建议5000ms)</li><li>客户端实现自动重连机制</li></ol>
<h5>大规模业务(数据量 &gt; 10GB,高并发)</h5>
<p><strong>方案</strong>:集群模式 <strong>实施步骤</strong>:</p>
<ol><li>使用redis-cli --cluster create初始化集群</li><li>确保每个主节点有1-2个从节点</li><li>配置cluster-require-full-coverage为no</li><li>监控集群状态(cluster nodes/cluster info)</li></ol>
<h5>对数据一致性要求极高的业务(如金融支付)</h5>
<p><strong>增强方案</strong>:</p>
<ol><li>在集群模式基础上:<ul><li>设置min-replicas-to-write 2</li><li>配置min-replicas-max-lag 10</li></ul></li><li>定期校验:<ul><li>使用redis-check-aof工具</li><li>实现CRC校验机制</li></ul></li><li>建议搭配:<ul><li>持久化采用AOF+fsync everysec</li><li>部署跨机房容灾方案</li></ul></li></ol>
頁: [1]
查看完整版本: Redis 同步机制全面解析