当前位置: 首页 > ai >正文

redis主从同步于对象模型

一、redis持久化

        redis 的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证 Redis 的 数据不会因为故障而丢失,redis 重启的时候可以重新加载持久化文件来恢复数据;

Redis 持久化相关的配置:
###### aof ######
# redis.cnf
appendonly no
appendfilename "appendonly.aof"
# aof read write invert
# appendfsync always
appendfsync everysec
# appendfsync no
# auto-aof-rewrite-percentage 为 0 则关闭 aof 复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# yes 如果 aof 数据不完整,尽量读取最多的格式正确的数据;
# no 如果 aof 数据不完整 报错,可以通过 redis-check-aof 来修复 aof 文件;
aof-load-truncated yes
# 开启混合持久化
aof-use-rdb-preamble yes
###### rdb ######
# save ""
# save 3600 1
# save 300 100
# save 60 10000

        默认配置下,只开启 rdb 持久化;

二、aof

        append only file

        aof 日志存储的是 Redis 服务器的顺序指令序列,aof 日志只记录对内存修改的指令记录;

Redis 中的 AOF(Append Only File,仅追加文件)是一种持久化机制,通过记录每一个写操作命令到磁盘文件,在 Redis 重启时重放命令以恢复数据。相比 RDB(快照持久化),AOF 数据丢失风险更低,但磁盘写入负载更高。以下是其详细讲解及配置使用方法:

一、AOF 核心配置项

  1. 启用 AOF
    在 redis.conf 中设置 appendonly yes,开启 AOF 持久化。
  2. 同步策略(appendfsync
    • appendfsync always:每次写操作都同步到 AOF 文件,数据最安全但性能最差。
    • appendfsync everysec:每秒同步一次,在性能和安全性间平衡,是常用配置。
    • appendfsync no:由操作系统决定同步时机,性能最佳但数据丢失风险最大。
  3. AOF 重写配置
    • auto-aof-rewrite-percentage:默认 100,当 AOF 文件大小比最后一次重写后增加 100%(翻倍)时,触发自动重写。
    • auto-aof-rewrite-min-size:默认 64mb,设置触发自动重写的 AOF 文件最小大小。
  4. 其他配置
    • appendfilename "appendonly.aof":指定 AOF 文件名称(默认 appendonly.aof)。
    • no-appendfsync-on-rewrite:默认 yes,表示 AOF 重写期间不进行同步,避免磁盘 IO 影响重写。

二、配置与使用步骤

  1. 修改配置文件
    编辑 redis.conf,示例配置:
    appendonly yes  
    appendfsync everysec  
    auto-aof-rewrite-percentage 100  
    auto-aof-rewrite-min-size 64mb  
    

    保存并关闭文件。
  2. 重启 Redis
    执行 redis-server 重启 Redis(或通过系统服务命令如 systemctl restart redis)。
  3. 执行写操作
    打开 redis-cli 客户端,执行写命令:
    $ redis-cli  
    > SET key1 value1  
    > HSET key2 field1 value1  
    > LPUSH key3 value1  
    
  4. 查看 AOF 文件
    通过 cat appendonly.aof(需确认文件路径,可查 redis.conf 中 dir 配置项)查看记录的写操作:

    plaintext

    *2  
    $6  
    SELECT  
    $1  
    0  
    *3  
    $3  
    SET  
    $4  
    key1  
    $6  
    value1  
    *4  
    $4  
    HSET  
    $4  
    key2  
    $6  
    field1  
    $6  
    value1  
    *3  
    $5  
    LPUSH  
    $4  
    key3  
    $6  
    value1  
    
  5. 测试数据恢复
    重启 Redis 后,验证数据是否恢复:
    $ redis-server  
    $ redis-cli  
    > GET key1  
    "value1"  
    > HGET key2 field1  
    "value1"  
    > LRANGE key3 0 -1  
    1) "value1"  
    

三、AOF 重写

        随着写操作增加,AOF 文件会变大,影响恢复速度和磁盘空间。AOF 重写会生成包含最少恢复命令的新文件。可通过 BGREWRITEAOF 手动触发,或依赖自动重写配置(auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size)。例如,多次修改同一键,重写后仅保留最后一次有效命令。

三、aof-rewrite

aof 持久化策略会持久化所有修改命令;里面的很多命令其实可以合并或者删除;
aof rewrite aof 的基础上,满足一定策略则 fork 进程,根据当前内存状态,转换成一系列的
redis 命令,序列化成一个新的 aof 日志文件中,序列化完毕后再将操作期间发生的增量 aof 日志
追加到新的 aof 日志文件中,追加完毕后替换旧的 aof 日志文件;以此达到对 aof 日志瘦身的目
的;
注意: aof rewrite 开启的前提是开启 aof

一、AOF Rewrite 的原理

AOF Rewrite 是 Redis 优化 AOF 文件的核心机制,通过 遍历当前数据库状态,用最少的命令重新记录数据,替代冗余的历史操作日志,从而缩小文件体积并提升恢复效率。

 
  • 不依赖原 AOF 文件:直接读取内存中的键值对,按最终状态生成最简命令(如对 hash 多次 HSET 后仅保留最终字段,对 list 多次 RPUSH/LPOP 后仅保留最终元素)。
  • 时间换空间:遍历和重组命令需消耗 CPU 时间,但生成的新 AOF 文件更紧凑,节省磁盘空间,同时加快后续重放速度。

二、AOF Rewrite 的实现过程

  1. 触发重写

    • 自动触发:通过 redis.conf 配置两个核心参数控制:
      • auto-aof-rewrite-percentage 100(默认):AOF 文件大小较上次重写后增长 100%(翻倍)时触发。
      • auto-aof-rewrite-min-size 64mb(默认):AOF 文件至少达到 64MB 才触发自动重写(避免小文件频繁重写)。
    • 手动触发:执行 BGREWRITEAOF 命令(适用于业务低峰期主动优化)。
  2. 子进程处理

    • 主进程通过 fork 生成子进程,子进程负责遍历数据库并构建新的 AOF 文件。
    • 主进程继续处理客户端请求,新写操作会暂存到 内存缓冲区(aof_rewrite_buf_blocks,确保子进程重写期间数据不丢失。
  3. 合并缓冲区与替换文件

    • 子进程完成重写后,主进程将缓冲区中的写操作追加到新 AOF 文件,最终用新文件替换旧文件,完成重写。

三、AOF Rewrite 配置与使用步骤

1. 配置自动触发条件(修改 redis.conf
  • 参数说明
    • auto-aof-rewrite-percentage:可根据业务写入频率调整(如写入频繁场景设为 200,即增长 200% 触发)。
    • auto-aof-rewrite-min-size:避免小文件频繁重写,建议生产环境设为 100MB 以上。
2. 重启 Redis 使配置生效
# 系统服务方式(以 Redis 服务名为例)  
systemctl restart redis  # 或指定配置文件启动(测试场景)  
redis-server /path/to/redis.conf  
3. 手动触发重写(推荐低峰期执行)
redis-cli BGREWRITEAOF  
# 输出 "OK" 表示已在后台启动重写  
4. 验证配置与重写状态
  • 查看当前配置
    redis-cli CONFIG GET auto-aof-rewrite-*  
    # 输出示例:  
    # 1) "auto-aof-rewrite-percentage"  2) "100"  
    # 3) "auto-aof-rewrite-min-size"    4) "64" (单位为 KB,实际 64MB 对应 65536 KB)  
    
  • 查看重写进度
    redis-cli INFO persistence  
    # 重点关注:  
    # aof_rewrite_in_progress: 0(未重写)/ 1(正在重写)  
    # aof_last_rewrite_time_sec: 上次重写耗时(秒)  
    
  • 查看日志(路径由 redis.conf 中 logfile 配置,默认 /var/log/redis/redis-server.log):
    7533:M 15 May 2024 10:00:00.000 * Starting automatic AOF rewrite for aof size 200 MB (threshold 100 MB)  
    7534:C 15 May 2024 10:00:15.000 * AOF rewrite completed successfully, new file size 50 MB  
    

四、触发条件与典型场景

触发方式配置 / 命令适用场景
自动触发auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size日常运维,自动控制文件膨胀
手动触发BGREWRITEAOF业务低峰期主动优化,避免自动触发卡顿

五、优势与注意事项

优势:
  1. 节省磁盘空间:剔除冗余命令,文件体积显著缩小(如原 1GB 文件重写后可能仅 100MB)。
  2. 提升恢复效率:更小的文件意味着 Redis 重启时重放命令耗时更短。
  3. 避免内存碎片化:紧凑的命令减少对连续内存的需求,提升后续写入效率。
注意事项:
  1. 内存峰值风险:子进程 fork 时会复制主进程内存,需确保服务器有足够空闲内存(建议预留 20% 以上)。
  2. 性能影响
    • fork 操作可能阻塞主进程(耗时与内存大小正相关),建议控制单次重写的数据量。
    • 重写期间若写入量极高,内存缓冲区可能增大,需合理设置 no-appendfsync-on-rewrite(默认 yes,牺牲少许安全性换取性能)。
  3. 监控与调优:定期通过 redis-cli --stat 监控内存和磁盘 IO,避免重写与业务高峰重叠。

六、示例:重写前后的命令对比

        假设对键 mylist 执行以下操作,原始 AOF 记录 5 条命令:

 
RPUSH mylist "a" "b"  
RPUSH mylist "c"  
LPOP mylist  
LPOP mylist  
RPUSH mylist "d" "e"  
 

        重写后,仅记录最终状态的 1 条命令:

        
RPUSH mylist "c" "d" "e"  
 

        文件体积从 200 字节缩减至 50 字节,重放效率提升 4 倍。

四、rdb

         基于 aof aof 复写文件大的缺点,rdb 是一种快照持久化;它通过 fork 主进程,在子进程中将内 存当中的数据键值对按照存储方式持久化到 rdb 文件中;rdb 存储的是经过压缩的二进制数据;

Redis 的 RDB(Redis Database)是一种数据持久化机制,它通过将 Redis 在内存中的数据以快照的形式保存到磁盘上,以便在 Redis 重启时能够快速恢复数据。以下是关于 RDB 的详细讲解:

一、RDB 的工作原理

  1. 快照生成
    • Redis 主进程会定期(或根据配置的条件)执行 fork 操作,创建一个子进程。
    • 子进程负责将当前内存中的数据以特定的二进制格式写入到一个临时文件中。这个过程中,主进程继续处理客户端请求,新的写操作会被记录到一个缓冲区(rdb_child_pipe)中,以确保子进程生成快照期间的数据一致性。
    • 子进程完成数据写入后,会将临时文件重命名为最终的 RDB 文件(通常命名为 dump.rdb)。
  2. 数据恢复
    • 当 Redis 重启时,它会读取 RDB 文件,并将其中的数据加载到内存中,从而恢复到上次保存快照时的状态。

二、RDB 的触发条件

  1. 自动触发
    • Redis 可以根据配置的 save 规则自动触发 RDB 快照的生成。例如,默认配置中可能有 save 900 1,表示在 900 秒内如果至少有 1 个键被修改,就会触发一次 RDB 快照。
    • 还可以通过配置多个 save 规则来满足不同的持久化需求,例如 save 300 10 表示在 300 秒内如果至少有 10 个键被修改,也会触发快照。
  2. 手动触发
    • 可以使用 SAVE 命令手动触发 RDB 快照的生成。执行 SAVE 命令时,Redis 主进程会阻塞,直到快照生成完成。
    • 也可以使用 BGSAVE 命令,该命令会在后台启动一个子进程来执行快照生成操作,主进程不会被阻塞。

三、RDB 的配置参数

  1. save 规则
    • 如上述示例,save <seconds> <changes> 用于定义触发 RDB 快照的条件。
    • 可以配置多个 save 规则,Redis 会根据这些规则来判断是否需要进行快照操作。
  2. rdbcompression
    • 该参数用于控制是否对 RDB 文件进行压缩。默认值为 yes,表示启用压缩。
    • 压缩可以减少 RDB 文件的大小,但会增加一些 CPU 开销。如果服务器的 CPU 资源比较紧张,可以考虑将该参数设置为 no 来禁用压缩。
  3. rdbchecksum
    • 用于控制是否在 RDB 文件中添加校验和。默认值为 yes,表示启用校验和。
    • 校验和可以用于在加载 RDB 文件时验证数据的完整性,但会增加一些文件大小。如果对数据完整性要求较高,可以保持该参数为 yes;如果希望减少文件大小,可以考虑将其设置为 no
  4. dbfilename
    • 用于指定 RDB 文件的名称。默认值为 dump.rdb
    • 可以根据需要修改该参数,例如将其设置为 redis.rdb 等。
  5. dir
    • 用于指定 RDB 文件的保存目录。默认值为 Redis 的工作目录。
    • 可以将 RDB 文件保存到其他目录,例如 /data/redis/rdb/ 等。

四、RDB 的优势与劣势

  1. 优势
    • 数据恢复快:RDB 文件是一个紧凑的二进制文件,在恢复数据时,Redis 可以快速地将其加载到内存中,因此恢复速度比 AOF 更快。
    • 适合大规模数据恢复:由于 RDB 文件的体积相对较小,因此在恢复大规模数据时,RDB 比 AOF 更具优势。
    • 对性能影响小:RDB 快照的生成是通过子进程完成的,主进程在快照生成期间仍然可以正常处理客户端请求,因此对性能的影响相对较小。
  2. 劣势
    • 数据丢失风险:由于 RDB 是定期生成快照的,因此在两次快照之间的数据可能会丢失。例如,如果在 900 秒内有大量数据被修改,但还没有触发快照,那么这些数据在 Redis 重启时将会丢失。
    • 不适合实时持久化:由于 RDB 是定期生成快照的,因此不适合需要实时持久化的应用场景。例如,对于一些金融应用,可能需要每秒钟都进行一次数据持久化,此时 RDB 就不太适合了。
    • 文件体积较大:虽然 RDB 文件可以通过压缩来减小体积,但在某些情况下,RDB 文件的体积仍然可能比较大。例如,对于一些包含大量小键值对的数据库,RDB 文件的体积可能会比较大。

五、RDB 与 AOF 的比较

  1. 数据安全性
    • AOF 比 RDB 更安全,因为 AOF 是通过追加写操作日志的方式来进行数据持久化的,因此可以保证数据的完整性。而 RDB 是定期生成快照的,因此在两次快照之间的数据可能会丢失。
  2. 数据恢复速度
    • RDB 比 AOF 更快,因为 RDB 文件是一个紧凑的二进制文件,在恢复数据时,Redis 可以快速地将其加载到内存中。而 AOF 文件是一个文本文件,在恢复数据时,Redis 需要逐行解析文件中的命令,因此恢复速度相对较慢。
  3. 文件体积
    • RDB 文件的体积相对较小,因为 RDB 文件是通过压缩来减小体积的。而 AOF 文件的体积相对较大,因为 AOF 文件是通过追加写操作日志的方式来进行数据持久化的,因此文件中可能会包含大量的冗余信息。
  4. 性能影响
    • RDB 对性能的影响相对较小,因为 RDB 快照的生成是通过子进程完成的,主进程在快照生成期间仍然可以正常处理客户端请求。而 AOF 对性能的影响相对较大,因为 AOF 需要不断地追加写操作日志,这会增加磁盘 IO 的负担。

六、配置RDB完整步骤

步骤 1:修改 redis.conf 文件

根据业务需求调整 RDB 配置,示例如下(关键参数已标注):

 
# 自动触发快照的条件(可自定义多个规则)  
save 900 1       # 15 分钟内至少 1 次修改  
save 300 10      # 5 分钟内至少 10 次修改  
save 60 10000    # 1 分钟内至少 10000 次修改  # RDB 文件名称与存储路径  
dbfilename redis_snapshot.rdb   # 自定义文件名  
dir /data/redis/rdb             # 存储目录(需提前创建)  # 压缩与校验和  
rdbcompression yes              # 启用压缩  
rdbchecksum yes                 # 启用校验和  # 快照失败时停止写操作(推荐)  
stop-writes-on-bgsave-error yes  
步骤 2:重启 Redis 使配置生效

修改配置后,需重启 Redis 服务:

 
# 系统服务方式(适用于 systemd)  
systemctl restart redis  # 或指定配置文件启动(测试场景)  
redis-server /path/to/redis.conf  
步骤 3:验证配置是否生效

通过 redis-cli 查看当前 RDB 配置:

 
redis-cli  
127.0.0.1:6379> CONFIG GET save  
1) "save"  
2) "900 1 300 10 60 10000"   # 显示配置的 save 规则  127.0.0.1:6379> CONFIG GET dbfilename  
1) "dbfilename"  
2) "redis_snapshot.rdb"       # 显示自定义文件名  127.0.0.1:6379> CONFIG GET dir  
1) "dir"  
2) "/data/redis/rdb"          # 显示存储目录  

五、混合持久化    

        从上面知道,rdb 文件小且加载快但丢失多, aof 文件大且加载慢但丢失少;混合持久化是吸取 rdb aof 两者优点的一种持久化方案; aof-rewrite 的时候实际持久化的内容是 rdb ,等持久化
后,持久化期间修改的数据以 aof 的形式附加到文件的尾部; 混合持久化实际上是在 aof-rewrite 基础上进行优化;所以需要先开启 aof-rewrite

Redis 的混合持久化是 Redis 4.0 引入的特性,融合了 RDB 和 AOF 两种持久化的优势:

  • RDB:以快照形式保存数据,恢复速度快,但可能丢失最后一次快照后的数据。
  • AOF:记录所有写操作,数据安全性高,但文件大、恢复慢。
    混合持久化在 AOF 重写时,先将当前数据以 RDB 格式写入 AOF 文件,后续新操作以 AOF 格式追加。恢复时,先快速加载 RDB 部分,再执行 AOF 增量命令,兼顾恢复速度与数据安全。

配置步骤

  1. 启用 RDB 持久化
    redis.conf中设置快照规则,定义 “N 秒内至少 M 个键被修改则触发快照”:
save 900 1    # 900秒内至少1个键变更,生成RDB  
save 300 10   # 300秒内至少10个键变更,生成RDB  
save 60 10000 # 60秒内至少10000个键变更,生成RDB  
 
  1. 启用 AOF 持久化
    开启 AOF 并设置写入策略(推荐everysec,平衡性能与安全):
appendonly yes          # 启用AOF  
appendfsync everysec    # 每秒同步一次写操作到磁盘  
 
  1. 开启混合持久化
    设置aof-use-rdb-preambleyes,确保 AOF 重写时生成 RDB 格式内容:
aof-use-rdb-preamble yes  
 
  1. 其他优化配置(可选)
  • 避免 AOF 重写时主进程阻塞:
    no-appendfsync-on-rewrite yes  
    
  • 配置 AOF 自动重写阈值(防止文件过大):
    auto-aof-rewrite-percentage 100 # AOF大小较上次重写后增长100%时触发  
    auto-aof-rewrite-min-size 64mb  # AOF至少64MB才触发重写  
    
 

        配置完成后,重启 Redis 服务使参数生效。此时 Redis 会在 AOF 重写时生成混合格式文件,实现快速恢复与数据安全的平衡。

六、redis主从复制

        主要用来实现 redis 数据的可靠性;防止主 redis 所在磁盘损坏,造成数据永久丢失; 主从之间采用异步复制的方式;

命令
命令: redis-server --replicaof 127.0.0.1 7001
redis 5.0 以前使用 slaveof redis 5.0 之后使用 replicaof

一、主从复制的概念与作用

        Redis 主从复制是将一台 Redis 服务器(主节点,Master)的数据,单向复制到其他 Redis 服务器(从节点,Slave)的机制。其核心特点与作用如下:

 
  • 特点:数据单向流动(仅主节点向从节点复制),主节点负责写操作,从节点负责读操作,一个主节点可拥有多个从节点,一个从节点仅对应一个主节点。
  • 作用
    • 读写分离:主节点处理写请求,从节点处理读请求,提升服务器读写负载能力。
    • 数据冗余:实现数据热备份,作为持久化之外的冗余方式。
    • 故障恢复:主节点故障时,从节点可提供服务,实现快速恢复。
    • 负载均衡:通过多个从节点分担读请求,提高并发量。
    • 高可用基础:是哨兵模式和集群实现的基石。
二、主从复制工作流程
  1. 建立连接阶段

    • 从节点保存主节点 IP 和端口信息。
    • 建立 Socket 连接,从节点向主节点发送ping命令检测连接状态。
    • 若主节点设置密码,从节点通过auth命令进行身份验证。
    • 从节点向主节点发送自身监听端口号(无实际功能,仅在info Replication中显示)。
  2. 数据同步阶段

    • 从节点发送psync命令(Redis 2.8 前为sync)请求同步。
    • 全量复制:初次复制或无法部分复制时,主节点生成 RDB 文件发送给从节点,从节点加载 RDB 恢复数据。
    • 部分复制:网络中断后重连,若主节点复制积压缓冲区(repl - backlog - size)保留了中断期间的写命令,仅同步这些增量命令,更高效。
  3. 命令传播阶段
    主节点将后续写命令发送给从节点,从节点执行命令以保持数据一致。此过程是异步的,主从节点可能存在短暂数据不一致。

三、主从复制的配置与使用方法

假设主节点 IP 为192.168.1.100,端口6379,从节点需进行以下配置:

 
  1. 方式一:修改配置文件

    • 编辑从节点的redis.conf
      # 配置主节点IP和端口  
      slaveof 192.168.1.100 6379  
      # 若主节点有密码,需配置以下行  
      masterauth <主节点密码>  
      # 可选:修改从节点端口、日志文件、RDB文件名等避免冲突  
      port 6380  
      pidfile /var/run/redis_6380.pid  
      logfile "redis_6380.log"  
      dbfilename "dump_6380.rdb"  
      
    • 保存配置后重启从节点 Redis 服务。
  2. 方式二:启动从节点命令指定

    redis-server --port 6380 --slaveof 192.168.186.138 6379 --masterauth 123456  #m如果主节点没有设置密码,此处就不需要密码
  3. 方式三:客户端命令动态配置

    • 连接从节点 Redis 客户端:
      redis-cli - p 6380  
      
    • 执行命令(临时生效,重启后失效):
      127.0.0.1:6380> slaveof 192.168.1.100 6379  
      OK  
      127.0.0.1:6380> config set masterauth <主节点密码>  # 若主节点有密码  
      OK  
      
  4. 验证主从关系

    • 在主节点执行info Replication,查看connected_slaves确认从节点连接。
    • 在从节点执行info Replication,检查master_hostmaster_port是否正确,role是否为slave
  5. 断开主从复制
    从节点执行slaveof no one,可断开与主节点的连接,变为独立主节点(数据保留):

127.0.0.1:6380> slaveof no one  
OK  
 

        通过以上配置,即可实现 Redis 主从复制,利用从节点分担读压力,提升系统的可用性与性能。实际应用中,还可结合哨兵模式实现主从自动切换,进一步增强高可用性。


        在完成主从复制配置后,Redis 主从架构的核心使用方式是读写分离:主节点处理写请求,从节点处理读请求。以下是具体的使用场景、操作方法及注意事项:

一、基础使用:读写分离操作

1. 主节点写入数据(写操作)

主节点是唯一支持写操作的节点(从节点默认只读),所有写命令(如sethsetlpush等)需在主节点执行。

 

示例

# 连接主节点(IP:192.168.1.100,端口:6379)  
redis-cli -h 192.168.1.100 -p 6379  # 写入数据(主节点)  
192.168.1.100:6379> set username "doubao"  
OK  
192.168.1.100:6379> hset user_info id 1001 age 25  
(integer) 2  
2. 从节点读取数据(读操作)

从节点仅支持读命令(如gethgetlrange等),用于分担主节点的读压力。

 

示例

 
# 连接从节点(假设从节点端口为6380)  
redis-cli -p 6380  # 读取主节点写入的数据(从节点)  
127.0.0.1:6380> get username  
"doubao"  
127.0.0.1:6380> hget user_info age  
"25"  

二、关键验证:确认数据同步

主从复制的核心是数据一致性,需验证主从节点数据是否同步。

1. 查看主从复制状态
  • 主节点:执行info replication,查看connected_slaves(已连接的从节点数量)和master_repl_offset(主节点复制偏移量)。

    redis

    192.168.1.100:6379> info replication  
    # Replication  
    role:master  
    connected_slaves:1  
    slaves:192.168.1.101:6380,slave0,online,222,1627811200,1  
    master_repl_offset:1000  # 主节点当前数据偏移量  
    ...  
    
  • 从节点:执行info replication,检查master_host(主节点 IP)、master_port(主节点端口)、master_link_status(连接状态)和slave_repl_offset(从节点复制偏移量)。

    127.0.0.1:6380> info replication  
    # Replication  
    role:slave  
    master_host:192.168.1.100  
    master_port:6379  
    master_link_status:up  # 必须为"up",表示连接正常  
    slave_repl_offset:1000  # 应与主节点的master_repl_offset一致(或接近,因异步复制可能短暂延迟)  
    ...  
    
2. 验证数据一致性

在主节点写入一条新数据,然后在从节点读取,确认是否一致。

 

示例

 
# 主节点写入  
192.168.1.100:6379> set test_key "hello"  
OK  # 从节点读取(等待1-2秒,因异步复制可能有延迟)  
127.0.0.1:6380> get test_key  
"hello"  # 数据一致,同步成功  

三、从节点只读特性(默认)

从节点默认配置为只读(slave-read-only yes),禁止执行写命令(如setdel等),避免数据冲突。

 

示例(从节点尝试写操作)

 
127.0.0.1:6380> set forbidden_key "test"  
(error) READONLY You can't write against a read only replica.  # 报错,禁止写操作  

四、主节点故障后的应急处理

若主节点宕机,从节点仍可提供读服务,但无法写入。需手动(或通过哨兵自动)将从节点提升为主节点。

手动提升从节点为主节点步骤:
  1. 断开从节点与原主节点的连接(使其成为独立主节点):

    127.0.0.1:6380> slaveof no one  
    OK  
    
  2. 验证角色变更

    127.0.0.1:6380> info replication  
    # Replication  
    role:master  # 角色变更为master  
    connected_slaves:0  # 原主节点已宕机,无连接的从节点  
    ...  
    
  3. 其他从节点重新指向新主节点(可选):
    若有其他从节点,需修改其slaveof配置,指向新主节点(如192.168.1.101:6380)。

七、Redis 哨兵模式

        哨兵模式是 Redis 可用性的解决方案;它由一个或多个 sentinel 实例构成 sentinel 系统;该系统可 以监视任意多个主库以及这些主库所属的从库;当主库处于下线状态,自动将该主库所属的某个从 库升级为新的主库;
        客户端来连接集群时,会首先连接 sentinel ,通过 sentinel 来查询主节点的地址,并且通过
subscribe 监听主节点切换,然后再连接主节点进行数据交互。当主节点发生故障时, sentinel
动推送新的主库地址。通过这样客户端无须重启即可自动完成节点切换。
哨兵模式当中涉及多个选举流程采用的是 Raft 算法的领头选举方法的实现;

配置
# sentinel.cnf
# sentinel 只需指定检测主节点就行了,通过主节点自动发现从节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 判断主观下线时长
sentinel down-after-milliseconds mymaster 30000
# 指定可以有多少个Redis服务同步新的主机,一般而言,这个数字越小同步时间越长,而越大,则对网络资
源要求越高
sentinel parallel-syncs mymaster 1
# 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
sentinel failover-timeout mymaster 180000
检测异常
主观下线
        sentinel 会以 每秒一次 的频率向所有节点(其他 sentinel 、主节点、以及从节点)发送 ping
息,然后通过接收返回 判断 该节点 是否下线 ;如果在配置指定 down-after-milliseconds 时间
内则被判断为主观下线;
客观下线
        当一个 sentinel 节点将一个主节点判断为主观下线之后,为了 确认 这个主节点 是否真的下线 ,它会
向其他 sentinel 节点进行询问 ,如果 收到 一定数量(半数以上)的已下线 回复 sentinel 会将主节
点判定为客观下线,并通过领头 sentinel 节点对主节点执行故障转移;
故障转移
        主节点被判定为客观下线后,开始领头 sentinel 选举,需要半数以上的 sentinel 支持,选举领头 sentinel 后,开始 执行对主节点故障转移
从节点中选举 一个从节点作为新的主节点 通知其他从节点复制连接新的主节点 若故障主节点重新连接,将作为新的主节点的从节点
使用
        1. 连接一个哨兵节点,并且获取主节点信息;
SENTINEL GET-MASTER-ADDR-BY-NAME <master-name>
        2. 验证当前获取的主节点;
ROLE 或者 INFO REPLICATION
        3. 为当前连接的哨兵节点,添加发布订阅( PUB/SUB )连接,并且订阅 +switch-master
道;
缺点
        redis 采用异步复制的方式,意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,这部
分未同步的消息将丢失。如果主从延迟特别大,那么丢失可能会特别多。 sentinel 无法保证消息完
全不丢失,但是可以通过配置来尽量保证少丢失。
同时,它的致命缺点是不能进行横向扩展;

八、Redis cluster集群        

Redis cluster 将所有数据划分为 16384 ( 2的14次方)个槽位,每个 redis 节点负责其中一部分槽位。
cluster 集群是一种 去中心化 的集群方式;
# 主库必须有一个从节点在进行正常复制,否则主库就停止对外写服务,此时丧失了可用性
min-slaves-to-write 1
# 这个参数用来定义什么是正常复制,该参数表示如果在 10s 内没有收到从库反馈,就意味着从库同步不
正常;
min-slaves-max-lag 10 如图,该集群由三个 redis 节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据
多少可能不一样。这三个 节点 相互连接组成一个 对等的集群 ,它们之间通过一种特殊的二进制协议
交互集群信息;
redis cluster 的客户端来连接集群时,会得到一份集群的槽位配置信息。这样当客户端要查找某
key 时,可以直接定位到目标节点。
客户端为了可以 直接定位 (对 key 通过 crc16 进行 hash 再对
取余)某个具体的 key 所在节
点,需要缓存槽位相关信息,这样才可以准确快速地定位到相应的节点。同时因为可能会存在客户
端与服务器存储槽位的信息不一致的情况,还需要 纠正机制 (通过返回 -MOVED 3999
127.0.0.1:6479 ,客户端收到后需要立即纠正本地的槽位映射表)来实现槽位信息的校验调整。
另外, redis cluster 的每个节点会将集群的配置信息持久化到配置文件中,这就要求确保配置文件
是可写的,而且尽量不要依靠人工修改配置文件;
下图来源于网络;
尽量使三个主节点的数据均衡;分布式一致性 hash

 数据迁移

        redis cluster 提供了工具 redis-trib 可以让运维人员手动调整槽位的分配情况,它采用 ruby 语言开 发,通过组合原生的 redis cluster 指令来实现。图中:A 为待迁移的源节点,B 为待迁移的目标节点;

过程
        如上图:redis 迁移的单位是槽, redis 是一个槽一个槽地进行迁移,当一个槽位正在迁移时,这个 槽就处于中间过渡状态。这个槽再源节点的状态为 migrating ,在目标节点的状态为
importing ,表示此时数据正在从源节点流向目标节点。
迁移工具 redis-trib 首先在源节点和目标节点设置好中间过渡状态,然后一次性获取源节点槽位的
所有或者部分的 key 列表,再依次将 key 进行迁移。源节点对当前的 key 执行 dump 指令得到序列 化内容,然后向目标节点发送 restore 指令,目标节点将源节点的序列化内容进行反序列化并将内 容应用到目标节点的内容中,然后返回 +ok 给源节点,源节点收到后删除该 key ;按照这些骤
将所有待迁移的 key 进行迁移;
        注意:迁移过程是同步 的,迁移过程中源节点的 主线程处于阻塞 状态,直到 key 被删除;如果迁移 过程中源节点出现网络故障,这两个节点依然处于中间状态,重启后,redis-trib 仍可继续迁移; 所以,redis-trib 迁移的过程是一个一个 key 来进行,如果这个 key 对应 val 内容很大,将会影响到 客户端的正常访问;
复制以及故障转移
        cluster 集群中节点分为主节点和从节点,其中主节点用于处理槽,而从节点则用于复制该主节点, 并在主节点下线时,代替主节点继续处理命令请求;
故障检测
        集群中每个节点都会定期地向集群中的其他节点发送 ping 消息,如果接收 ping 消息的节点没
有在规定时间内回复 pong 消息,那么这个没有回复 pong 消息的节点会被标记为 PFAIL
probable fail ;
        集群中各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息;如果在一个集群 中,半数以上负责处理槽的主节点都将某个主节点 A 报告为疑似下线,那么这个主节点 A 将被标 记为下线( FAIL ) ;标记主节点 A 为下线状态的主节点会广播这条消息,其他节点(包括 A 节点的 从节点)也会将A 节点标识为 FAIL
故障转移
        当从节点发现自己的主节点进入 FAIL 状态,从节点将开始对下线主节点进行故障转移;
从数据最新的从节点中选举为主节点;
        该从节点会执行 replica no one 命令,称为新的主节点;
        新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己;
        新的主节点向集群广播一条 pong 消息,这条 pong 消息可以让集群中的其他节点立即知道
        这个节点已经由从节点变成主节点,并且这个主节点已经接管了之前下线的主节点;
        新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移结束;

集群配置

一、环境准备

1. 安装依赖(hiredis-cluster)
git clone https://github.com/Nordix/hiredis-cluster.git
cd hiredis-cluster
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_SSL=ON ..
make && sudo make install && sudo ldconfig

二、集群配置文件准备

1. 创建节点目录与基础配置
# 创建 6 个节点目录(3主3从)
mkdir -p 7001 7002 7003 7004 7005 7006# 编辑 7001 节点配置(其他节点通过复制修改)
vi 7001/7001.conf
2. 7001.conf 核心配置
pidfile "/home/mark/redis-data/7001/7001.pid"    # 进程文件
logfile "/home/mark/redis-data/7001/7001.log"    # 日志文件
dir "/home/mark/redis-data/7001/"                # 数据存储目录
port 7001                                        # 节点端口
daemonize yes                                    # 后台运行
cluster-enabled yes                              # 启用集群模式
cluster-config-file nodes-7001.conf              # 集群配置文件(自动生成)
cluster-node-timeout 15000                       # 节点超时时间(ms)
3. 快速生成其他节点配置
# 复制并修改端口及文件名(以 7002 为例,其他节点类似)
cp 7001/7001.conf 7002/7002.conf
sed -i 's/7001/7002/g' 7002/7002.conf
# 重复操作生成 7003~7006 配置

三、启动集群节点

1. 节点启动脚本(start_nodes.sh
#!/bin/bash
redis-server 7001/7001.conf
redis-server 7002/7002.conf
redis-server 7003/7003.conf
redis-server 7004/7004.conf
redis-server 7005/7005.conf
redis-server 7006/7006.conf
2. 执行启动
chmod +x start_nodes.sh
./start_nodes.sh

四、初始化集群(3 主 3 从)

1. 自动创建集群(推荐)
redis-cli --cluster create \127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \--cluster-replicas 1  # 每个主节点分配 1 个从节点
2. 手动创建集群(分步操作)
# 节点会面(主节点间建立连接)
redis-cli --cluster meet 127.0.0.1:7002 127.0.0.1:7001
redis-cli --cluster meet 127.0.0.1:7003 127.0.0.1:7001# 分配槽位(16384 个槽位分配给 3 个主节点)
redis-cli --cluster addslots {0-5460} --cluster-node-id <主节点ID-7001>
redis-cli --cluster addslots {5461-10922} --cluster-node-id <主节点ID-7002>
redis-cli --cluster addslots {10923-16383} --cluster-node-id <主节点ID-7003># 分配从节点(例如 7004 作为 7001 的从节点)
redis-cli --cluster replicate <7001主节点ID> --cluster-node-id <7004节点ID>

五、集群测试与基本操作

1. 连接集群(-c 启用集群模式)
redis-cli -c -p 7001  # 连接 7001 节点
127.0.0.1:7001> set name mark  # 自动路由到对应主节点
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
2. 查看集群状态
redis-cli -p 7001 cluster info        # 集群概览
redis-cli -p 7001 cluster nodes       # 节点详细信息
3. 模拟主节点宕机
redis-cli -p 7001 shutdown  # 关闭主节点 7001
# 从节点 7004 自动提升为主节点(需等待故障转移)
redis-cli -p 7004 cluster nodes  # 验证角色变更

六、集群扩容(添加 2 个节点:7007 主节点、7008 从节点)

1. 创建新节点配置
# 复制并修改 7007/7008 配置
cp -R 7001 7007 && cd 7007
mv 7001.conf 7007.conf && sed -i "s/7001/7007/g" 7007.conf
cp -R 7007 7008 && cd 7008
mv 7007.conf 7008.conf && sed -i "s/7007/7008/g" 7008.conf
2. 启动新节点并加入集群
redis-server 7007/7007.conf
redis-server 7008/7008.conf# 添加主节点 7007(通过任意现有节点引导)
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001# 添加从节点 7008 并指定主节点(如 7007)
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 \--cluster-slave --cluster-master-id <7007主节点ID>
3. 重新分配槽位(迁移 1000 个槽位到 7007)
redis-cli --cluster reshard 127.0.0.1:7001 <<EOF
1000            # 迁移槽位数
<7007节点ID>    # 目标节点ID
all             # 从所有节点迁移(或指定源节点ID)
EOF

七、集群缩容(删除节点 7007 及其从节点 7008)

1. 迁移槽位回原节点
redis-cli --cluster reshard 127.0.0.1:7001 \--cluster-from <7007节点ID> \--cluster-to <原主节点ID> \--cluster-slots 1000  # 迁移之前分配的槽位
2. 删除空节点
# 删除从节点 7008
redis-cli --cluster del-node 127.0.0.1:7001 <7008节点ID># 删除主节点 7007(需先确保槽位清空)
redis-cli --cluster del-node 127.0.0.1:7001 <7007节点ID>

0voice · GitHub

http://www.xdnf.cn/news/5289.html

相关文章:

  • 【基于 LangChain 的异步天气查询2】GeoNames实现地区实时气温查询
  • EDITPLUS配置CTags实现函数跳转
  • 技术方案模型需要兼顾战略规划、技术实现与落地可行性
  • 《操作系统真象还原》第十三章——编写硬盘驱动程序
  • SQL注入问题
  • powerbuilder9.0中文版
  • 7、系统开发
  • 计算机网络 4-2-1 网络层(IPv4)
  • 每日算法-250510
  • 深入理解Embedding技术-什么是Embedding?
  • 使用fdisk 、gdisk管理分区
  • Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力
  • python:ASCII-generator 实用教程
  • $\int_{0}^{1} x \arcsin \sqrt{4x - 4x^2}dx$
  • LintCode第366题-斐波那契数列
  • 各种环境测试
  • 解释器和基于规则的系统比较
  • 【Linux基础】文件和目录管理指令
  • 对日开发 TeraTerm ttl脚本开发环境配置
  • python04——条件判断(选择结构)
  • 部署RocketMQ
  • 数孪实战笔记(1)数字孪生的含义、应用及技术体系
  • java-代理
  • [特殊字符] AI网关:大模型时代的智能交通指挥官 [特殊字符]
  • 科大讯飞TTS(文字转语音)和STT(语音转文字)
  • 如何将 Windows 11 的开始菜单移到左侧
  • ECMAScript 2017(ES2017):异步编程与对象操作的革新
  • CUDA编程——性能优化基本技巧
  • 常用的Linux命令100条
  • python 版本管理用的是pyenv pip install 把东西安装到那里了,好的检测方法,注意是windows环境