Redis主从复制实战和哨兵服务Redis 主从复制Master-Slave Replication 是 Redis 实现高可用、读写分离和数据冗余的核心机制 之一。目的数据冗余 和 读写分离。原理主从复制是 Redis 高可用性的基础。它允许一个 Redis 服务器主节点Master将其数 据复制到一个或多个 Redis 服务器从节点Slave/Replica。主从复制特点一个master可以有多个slave一个slave只能有一个master数据流向是从master到slave单向的master可读可写slave只读主从复制实现当master出现故障后可以自动提升一个slave节点变成新的master因此redis slave需要设置和 master相同的连接密码实验环境主2从 准备三台配置一样的虚拟机将三台虚拟机的防火墙都关闭系统 IP地址 主机名 Centos7.9 192.168.108.10 master Centos7.9 192.168.108.11 slave01 Centos7.9 192.168.108.12 slave02redis的主从同步工作原理简单概括为1、salve向master发送sync命令2、master启动后台存盘进程并收集所有修改数据命令、master完成存盘后传送整个数据文件到slave4、slave接受数据文件加载到内存中完成首次完全同步5、后续有新数据产生时master继续将新的数据命令传递给slave完成同步配置所有数据库# 所有节点 [rootlocalhost ~]# cd /usr/local/redis-6.2.14/ [rootlocalhost redis-6.2.14]# vim redis.conf 75 bind 0.0.0.0 -::1配置从redis#slave01,slave02指向master的ip和端口 [rootlocalhost redis-6.2.14]# vim redis.conf 480 replicaof 192.168.108.10 6379 # 不修改配置文件通过配置命令也可以 127.0.0.1:6379 REPLICAOF MASTER_IP PORT #新版推荐使用 127.0.0.1:6379 SLAVEOF MASTER_IP PORT #旧版使用将被淘汰重启所有redis[rootlocalhost redis-6.2.14]# redis-cli shutdown [rootlocalhost redis-6.2.14]# redis-server redis.conf 验证[rootmaster ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:master connected_slaves:2 slave0:ip192.168.108.12,port6379,stateonline,offset280,lag0 slave1:ip192.168.108.11,port6379,stateonline,offset280,lag0 master_failover_state:no-failover master_replid:9abdc709c2e13658f9fe30908d53b7fd2ddd8e29 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:280 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:280 [rootslave01 ~]# redis-cli 127.0.0.1:6379 info replication # Replication role:slave master_host:192.168.108.10 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_read_repl_offset:280 slave_repl_offset:280 ......从主节点写入数据数据会被同步到从节点# master节点配置 127.0.0.1:6379 set name laogao OK # salve01,slave02查看同步过来了 127.0.0.1:6379 get name laogao删除主从同步在从节点执行REPLICAOF NO ONE 或 SLAVEOF NO ONE指令可以取消主从复制 取消复制会断开和master的连接而不再有组从复制关联但不会清除slave上已有的数据# 新版 127.0.0.1:6379 REPLICAOF NO ONE # 旧版 127.0.0.1:6379 SLAVEOF NO ONEredis集群的哨兵服务Redis 哨兵模式Sentinel 是 Redis 官方提供的 高可用性High Availability, HA解决方案用于 在主从架构中实现 自动故障检测与故障转移。目的在主从复制的基础上实现自动故障转移High Availability原理哨兵是一个独立的分布式系统由多个 Sentinel 实例进程组成用于监控 Redis 主从 节点的健康状态。概念Redis Sentinel哨兵 是一个分布式监控系统由一个或多个独立的 sentinel 进程组成。主要功能监控Monitoring持续检查主节点Master和从节点Replica是否正常运行。通知Notification当被监控的 Redis 实例异常时可通过 API 通知管理员或其他系统。自动故障转移Automatic Failover当主节点宕机Sentinel 会自动将一个从节点提升 为新主节点并更新其他从节点的复制源。配置提供者Configuration Provider客户端可通过 Sentinel 获取当前主节点地址实 现动态服务发现。核心原理架构组成Master主节点处理写请求。ReplicaSlave从节点复制主节点数据可处理读请求。Sentinel 节点独立进程通常部署 奇数个如 3 个 以避免脑裂。故障转移流程主观下线SDOWN 某个 Sentinel 发现主节点无响应超过 down-after-milliseconds 标记为主观下线客观下线ODOWN 多个 Sentinel≥ quorum 配置值达成共识确认主节点已宕机。选举 Leader Sentinel 之间通过 Raft 算法选举出一个 Leader 负责执行故障转移。提升新主 Leader 选择一个“最优”从节点优先级高、复制偏移量大、运行稳定执行 REPLICAOF NO ONE 将其转为主节点。重配从节点 其他从节点重新指向新主节点。通知客户端 通过发布/订阅机制通知客户端主节点变更。操作步骤延续上面的实验此时三台redis处于一主二从的状态 三台Redis都要做[rootmaster redis-6.2.14]# cp sentinel.conf sentinel.conf.bak [rootmaster redis-6.2.14]# vim sentinel.conf #主节点ip端口以及哨兵投票数量2当有2个及以上的哨兵认为主节点不可用时那么就是客观下线就需要进 行主从故障转移 84 sentinel monitor mymaster 192.168.108.10 6379 2 #超过该时间主节点没有响应哨兵则哨兵会对主节点主观下线单位是毫秒 125 sentinel down-after-milliseconds mymaster 30000启动哨兵三台Redis都要做[rootlocalhost redis-6.2.14]# redis-sentinel sentinel.conf [2] 9203查看哨兵状态[rootmaster redis-6.2.14]# redis-cli -p 26379 127.0.0.1:26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:namemymaster,statusok,address192.168.108.10:6379,slaves2,sentinels3验证模拟故障将master关机发现剩下两台slave主机开始选举新master主机将master恢复试试#启动并放在后台运行 [rootmaster ~]# cd /usr/local/redis-6.2.14/ [rootmaster redis-6.2.14]# redis-server redis.conf [rootmaster redis-6.2.14]# redis-sentinel sentinel.conf master成为slave总结哨兵模式是 Redis 实现 自动高可用 的标准方案适用于对可用性要求高、但无需数据分片的 业务场景。对于超大规模集群应考虑 Redis Cluster。