25人参与 • 2025-09-29 • Redis
在实际生产环境中,单机redis实例存在多种风险:
通过同步机制建立主从架构,可以实现:
示例场景:电商平台商品库存数据,通过同步机制确保即使主节点宕机,从节点也能继续提供服务,避免超卖。
redis的主从架构天然支持读写分离:
优势体现:
典型应用:
redis采用智能复制策略平衡效率:
配置建议:
repl-backlog-size 16mb # 提升缓冲区大小应对网络不稳定 repl-diskless-sync yes # 启用无盘复制加速全量同步
redis通过多种机制确保同步可靠性:
为实现毫秒级同步延迟,redis采用:
info replication # 查看master_repl_offset和slave_repl_offset差值
性能指标:
主从复制是 redis 同步机制的基石,所有高级同步(哨兵、集群)均基于此扩展。其核心逻辑是通过主节点(master)和从节点(slave)的协作,实现数据的分布式存储和读写分离。从节点主动连接主节点,复制主节点的数据集,并实时同步主节点的写操作。这种架构设计不仅提高了系统的可用性,还能有效分担主节点的读请求压力。
主从复制全流程分为"建立连接"、"数据同步"、"命令传播"三个阶段,缺一不可。这三个阶段构成了一个完整的数据同步生命周期,确保主从节点之间的数据最终一致性。
从节点通过配置slaveof <master-ip> <master-port>(redis 5.0 后推荐使用更符合现代语义的replicaof)触发连接流程,具体步骤如下:
sync命令(redis 2.8 前)或更先进的psync命令(redis 2.8 后,支持增量复制)requirepass(若配置)与自身masterauth是否一致+ok响应ping命令检测连接状态pong确认连接正常这是同步的核心阶段,分为两种模式:全量复制(首次同步或从节点断线过久)和增量复制(从节点短期断线后恢复)。选择哪种模式取决于从节点的同步状态和断开时间。
当遇到以下情况时会触发全量复制:
replid(主节点标识)与主节点不一致offset不在主节点的复制积压缓冲区范围内全量复制详细流程:
psync ? -1命令(表示请求全量复制)bgsave命令在后台生成rdb快照文件set、hset)到"复制积压缓冲区"性能考量:
当从节点短期断线(如网络闪断)后重新连接,且主节点的"复制积压缓冲区"仍保留断线期间的写操作时,触发增量复制。这种模式显著提高了同步效率。
增量复制详细流程:
psync <replid> <offset>命令replid是主节点标识,offset是从节点最后一次同步的位置replid是否与自身一致offset是否在"复制积压缓冲区"的有效范围内(缓冲区保留[master_offset - backlog_size, master_offset]的操作)offset之后的写操作从缓冲区发送给从节点增量复制的关键条件:
replid和offset(存储在replica.conf中)repl-backlog-ttl(默认3600秒),避免缓冲区被清空优化建议:
repl-backlog-size数据同步完成后,主从进入"命令传播"阶段,这是维持数据一致性的关键环节。主节点每执行一次写命令,都会将该命令发送给所有从节点,从节点执行相同命令,确保数据实时同步。
命令传播的详细机制:
set key value)repl-disable-tcp-nodelay配置控制tcp特性:no(关闭tcp_nodelay):tcp会缓冲小数据包,减少网络请求数,但可能增加毫秒级延迟yes(开启tcp_nodelay):写命令立即发送,延迟降低,但网络请求数增加offsetinfo replication可以查看主从节点的master_repl_offset和slave_repl_offset| 配置项 | 示例值 | 说明 | 推荐设置 |
|---|---|---|---|
bind | 0.0.0.0 | 允许从节点远程连接 | 生产环境建议绑定具体ip |
protected-mode | no | 关闭保护模式 | 必须关闭才能远程连接 |
port | 6379 | 主节点服务端口 | 默认6379,可修改 |
requirepass | str0ngp@ss | 主节点访问密码 | 生产环境必须设置 |
masterauth | str0ngp@ss | 主从同步验证密码 | 需与从节点密码一致 |
repl-backlog-size | 32mb | 复制积压缓冲区大小 | 写频繁场景建议增大 |
repl-backlog-ttl | 3600 | 缓冲区保留时间 | 默认3600秒(1小时) |
| 配置项 | 示例值 | 说明 | 推荐设置 |
|---|---|---|---|
replicaof | 192.168.1.1 6379 | 指定主节点地址 | redis 5.0+使用 |
slaveof | 192.168.1.1 6379 | redis 5.0前使用 | 已弃用 |
requirepass | str0ngp@ss | 从节点密码 | 需与主节点masterauth一致 |
replica-read-only | yes | 从节点只读模式 | 默认开启,防止误写 |
repl-disable-tcp-nodelay | yes | tcp优化选项 | 延迟敏感场景开启 |
redis-cli -a yourpassword info replication
connected_slaves是否为预期的从节点数量,以及每个从节点的状态信息。redis-cli -a yourpassword info replication
master_host和master_port是否正确,master_link_status是否为up(表示连接正常)。master_repl_offset和从节点的slave_repl_offset,两者的差值即为复制延迟。bind配置允许远程连接repl-timeout(默认60秒)repl-backlog-size避免频繁全量同步哨兵模式是一个分布式系统,由以下三部分组成:
架构设计要点:
哨兵节点通过以下机制实现全面监控:
sentinel monitor mymaster 192.168.1.1 6379 2
mymaster:主节点别名192.168.1.1:6379:主节点地址2:判定客观下线需要的哨兵票数ping命令到所有被监控节点ponginfo replication到主节点__sentinel__:hello频道广播节点状态down-after-milliseconds(默认30秒)内未收到主节点的有效响应sentinel is-master-down-by-addr命令询问其他哨兵quorum个哨兵同意主节点不可用时,标记为"客观下线"quorum=2时,需要至少2个哨兵确认主节点故障选举过程采用多级排序策略:
replica-priority(默认100)完整的故障转移流程:
slaveof no one
replicaof <new-master-ip> <new-master-port>
info replication命令可以验证复制关系+switch-master事件通知客户端| 配置项 | 说明 | 推荐值 |
|---|---|---|
port 26379 | 哨兵服务端口 | 通常保持默认 |
sentinel monitor <name> <ip> <port> <quorum> | 定义监控的主节点 | 根据网络环境调整 |
sentinel down-after-milliseconds <name> 30000 | 主观下线判定时间 | 生产环境建议30-60秒 |
sentinel failover-timeout <name> 180000 | 故障转移超时时间 | 根据网络延迟调整 |
sentinel parallel-syncs <name> 1 | 并行同步数量 | 较大集群可适当增加 |
# 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
启动哨兵:
redis-sentinel /etc/redis/sentinel.conf
监控命令:
redis-cli -p 26379 sentinel masters # 查看所有监控的主节点 redis-cli -p 26379 sentinel slaves mymaster # 查看指定主节点的从节点
故障模拟测试:
# 模拟主节点宕机 redis-cli -p 6379 debug sleep 60 # 观察哨兵日志 tail -f /var/log/redis/sentinel.log
客户端配置:
jedissentinelpool pool = new jedissentinelpool("mymaster",
new hashset<string>(arrays.aslist(
"sentinel1:26379",
"sentinel2:26379",
"sentinel3:26379")));redis cluster 使用 crc16 算法计算 key 的哈希值,然后对 16384 取模得到对应的哈希槽。例如:
哈希槽分配示例:
每个主节点可以配置多个从节点,形成多副本保护。从节点会:
当客户端访问错误节点时,会收到两种重定向响应:
cluster meet 发现拓扑# 允许从节点处理读请求 cluster-replica-ok yes
pfail (possible failure)| 配置项 | 推荐值 | 说明 |
|---|---|---|
| cluster-require-full-coverage | no | 允许部分槽不可用时集群仍可服务 |
| cluster-migration-barrier | 1 | 主节点最少从节点数才开始迁移 |
| cluster-replica-no-failover | no | 从节点是否参与故障转移 |
准备阶段:
# 创建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启动节点:
# 启动所有节点
for port in {6379..6384}; do
redis-server /redis/${port}/redis.conf
done创建集群:
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
验证集群:
# 检查集群状态 redis-cli -p 6379 cluster nodes | grep master # 测试数据分布 redis-cli -c -p 6379 set foo bar
redis-cli --cluster reshard 进行槽迁移cluster replicate 调整拓扑cluster saveconfig从节点频繁断开与重连,每次重连都触发全量复制(rdb文件传输),导致主节点cpu和网络带宽占用过高,影响正常业务请求处理。监控中可观察到主节点cpu使用率周期性飙升,网络出口流量激增。
从节点数据与主节点差距较大,通过info replication查看master_repl_offset与slave_repl_offset差值持续增大,从节点读取到旧数据。在电商秒杀等高并发场景下,可能导致库存超卖等问题。
主节点执行写命令后,部分从节点未同步该命令,导致主从数据差异。通过redis-cli的diff命令可以检测到不一致的键值,在金融交易等场景可能导致严重问题。
min-replicas-to-write 2 min-replicas-max-lag 10
# 集群模式检查 redis-cli --cluster check <host>:<port> # 主从数据对比 redis-cli -h master --scan | while read key; do diff=$(redis-cli -h master get "$key" | diff - <(redis-cli -h slave get "$key")) [ -n "$diff" ] && echo "$key: $diff" done
在redis cluster扩容/缩容时,执行cluster setslot migrating/importing命令迁移哈希槽过程中,部分从节点同步中断,客户端请求返回moved/ask重定向错误。
# 分批迁移键空间 redis-cli --cluster rebalance \ --cluster-weight node1=1 node2=0 \ --cluster-use-empty-masters
适用场景:
推荐方案: 主从复制 + 读写分离(1主多从)
优势:
劣势:
典型应用: 电商商品详情页缓存、新闻资讯类应用
适用场景:
推荐方案: 至少3个哨兵节点+1主2从
优势:
劣势:
配置示例:
sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000
适用场景:
推荐方案: 至少3主3从(官方推荐)
优势:
劣势:
性能指标:
方案:主从复制 + 哨兵模式 实施要点:
方案:集群模式 实施步骤:
增强方案:
到此这篇关于redis 同步机制解析的文章就介绍到这了,更多相关redis 同步机制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论