### 课堂目标 1. 理解主从集群概念 2. redis主从如何搭建 3. 哨兵模式(可选) # 一、什么是Redis主从(集群) 部署多个服务,组成的集合,成为集群; 对外的性能、并发、数据安全更加的可靠; 其中主库出现了故障,可以迅速升级从库,替换主库的功能 集群目的:读写分离和负载均衡 !\[image-20260202160247802\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20260202160247901.png) # 二、为什么要集群 数据安全: - \*\*实时热备份\*\*:从节点自动同步主节点数据,实现实时备份 - \*\*数据安全\*\*:主节点故障时,从节点保留完整数据副本 - \*\*灾难恢复\*\*:防止单点故障导致数据丢失 性能: - \*\*读操作扩展\*\*:通过增加从节点\*\*横向扩展\*\*读性能 - \*\*写读分离\*\*:主节点专注写操作,从节点分担读压力 - \*\*并发处理\*\*:多个客户端可同时从不同从节点读取数据 # 三、redis主从流程(一般情况一主二从的搭建) !\[image-20251208150637024\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251208150637100.png) 1、第一次启动的时候,从库会全量复制主库的数据 2、启动以后,会以追加的方式,增量同步数据 3、主库负责写 ,从库负责读(\*\*读写分离\*\*) # 四、如何搭建 只需要多个配置就可以了 多复制几个redis.conf,命名 \`\`\` redis6379.conf redis6479.conf redis6579.conf \`\`\` \| 端口 \| ip \| 主从 \| \| ---- \| --------- \| ------ \| \| 6379 \| localhost \| master \| \| 6479 \| localhost \| slave \| \| 6579 \| localhost \| slave \| \| \| \| \| ## 1、开启与关闭appendonly yes/no 主从都可以开始AOF备份 \`\`\` # 主节点配置 appendonly yes appendfilename "appendonly.aof" appendfsync everysec # 平衡性能和数据安全 # 从节点配置(每个从节点独立配置) appendonly yes appendfilename "appendonly.aof" appendfsync everysec \`\`\` ## 2、开启RDB 默认 默认 save "" !\[image-20251015194235174\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015194235205.png) ## 3、工作目录 如果conf都在 redis的工作目录就不用修改 \`\`\` dir ./ \`\`\` ## 4、修改端口 主库记得配置密码 \`\`\` requirepass 123456 \`\`\` 每一个redis的端口不能一样,分别区分开 ![image-20251015192011321](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015192011348.png)!\[image-20251015191943850\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015191943877.png)!\[image-20251204201631642\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/java/daiwei/20251204201638823.png) ## 5、对从库加一行命令 6479和 6579都要加上,属于主库 ,代表地属于 127.0.0.1 端口6379的redis的slave \`\`\` slaveof 127.0.0.1 6379 #6479 和 6579都属于 6379的从库 \`\`\` ## 6、给redis的从库配置一下连接主库的密码 如果主库有密码,从库的配置就要加一个连接到主库的密码 \`\`\` masterauth 123456 \`\`\` ## 6、ip配置 从节点才配置,\*\*如果从节点和主节点都在一台机器上,就不用配置\*\* \`\`\` replica-announce-ip 192.168.1.100 # 外部可访问的IP replica-announce-port 6379 #端口 \`\`\` !\[image-20251015192309817\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015192309842.png) !\[image-20251015193623429\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015193623459.png) ## 8、配置一下进程id、log文件、备份文件目录 \`\`\` pidfile /var/run/redis-6379.pid #进程文件 不要配置成一样每一个redis区分开,否者会有莫名其妙的错误 logfile "/var/log/redis/redis-6379.log" #日志文件 dir /var/redis/6379 #日志和进程文件的目录 \`\`\` !\[image-20251204203846219\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/java/daiwei/20251204203846341.png) \*\*备注:\*\* !\[image-20251204204001365\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/java/daiwei/20251204204001477.png) # 五、测试一下 ## 1、启动一下主和从 \`\`\` redis-server.exe ./redis6379.conf \`\`\` \`\`\` redis-server.exe ./redis6479.conf \`\`\` \`\`\` redis-server.exe ./redis6579.conf \`\`\` 显示如下代表成功 !\[image-20251015194613785\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015194613822.png) !\[image-20251015194637599\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015194637640.png) ## 2、在主库写一条记录 !\[image-20251015194741836\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015194741864.png) 从库也有 !\[image-20251015194802848\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/daiwei/java/20251015194802879.png) ## 3、主库死掉了怎么办? 把从库升级为主库 - 查看一下从库的状态 \`\`\` # 检查从库1的复制状态 redis-cli -h 192.168.1.11 -p 6379 info replication # 输出应该显示为从库状态 # 检查从库2的复制状态 redis-cli -h 192.168.1.12 -p 6379 info replication \`\`\` - 确定一个从库升级到主库 \`\`\` redis-cli -h localhost -p 6479 info \| grep repl_offset //linux下 redis-cli -h localhost -p 6579 info \| grep repl_offset \`\`\` - 停止从库的复制 所有从库都要暂停,因为主库死掉了 \`\`\` SLAVEOF NO ONE \`\`\` - 升级其中一个从库(\*\*在6579上执行,确认6479是主库\*\*) \`\`\` SLAVEOF localhost 6479 //localhost不行就用ip \`\`\` # 六、哨兵模式(可选) 如果Master死了怎么办? - \>哨兵模式 \*\*一主二从三哨兵\*\* \*\*主观下线\*\*:哨兵没有收到ping回应就会认定主节点redis死掉,会主动让reids主下线,导致选举 \*\*客观下线\*\*:当多个哨兵认为主节点redis死掉,就会下线让主redis下线。(主要为了防止应为某一个哨兵和redis的连接网络不稳定,导致的误判,多个哨兵都认定主redis死掉,就会让主redis下线导致选举) 选举规则:一般是看哪一个从redis的数据更完整、或指定优先级等方式。 脑裂 7 3 上海 x 4北京 重庆 主 从从从从从从从 !\[image-20251016203803565\](https://woniumd.oss-cn-hangzhou.aliyuncs.com/java/daiwei/20251016203803642.png) 1、哨兵定期检查redis集群 主从服务器是否正常运行,通过ping 2、如果redis主死掉 3、3个sentinel会投票选举,选择一个从库,升级成主库 4、投票通过的数量只要超过(quorum)就判断为投票通过 5、更新其他从节点配置,让它们复制新的主节点 配置说明 sentinel26379.conf \`\`\` port 26379 #设置哨兵实例监听的端口号为 26379 如果有3个,就分别修改端口为 26379 26479 26579 dir "./26379" 设置哨兵的工作目录为 daemonize no pidfile "./redis-sentinel-26379.pid" logfile "./sentinel-26379.log" sentinel announce-ip 127.0.0.1 #指定本哨兵IP地址为 127.0.0.1 sentinel monitor mymaster 127.0.0.1 6379 2 #哨兵监控名为 mymaster主节点 ip地址是127.0.0.1 端口是6379,2代表quorum sentinel down-after-milliseconds mymaster 5000 #设置判断主节点下线的时间阈值为 5000 毫秒(5秒)。 sentinel failover-timeout mymaster 60000 #设置故障转移的超时时间为 60000 毫秒(60秒)。 sentinel parallel-syncs mymaster 1 # 故障转移时,最多有1个从节点同时同步新主 sentinel auth-pass mymaster 123456 #配置哨兵连接redis密码 \`\`\` 26479和26579 按上面配置进行配置即可 \`\`\` port 26479 #设置哨兵实例监听的端口号为 26379 如果有3个,就分别修改端口为 26379 26479 26579 dir "./26479" 设置哨兵的工作目录为 daemonize no pidfile "./redis-sentinel-26479.pid" logfile "./sentinel-26479.log" sentinel announce-ip 127.0.0.1 #指定本哨兵IP地址为 127.0.0.1 sentinel monitor mymaster 127.0.0.1 6379 2 #哨兵监控名为 mymaster主节点 ip地址是127.0.0.1 端口是6379,2代表quorum sentinel down-after-milliseconds mymaster 5000 #设置判断主节点下线的时间阈值为 5000 毫秒(5秒)。 sentinel failover-timeout mymaster 60000 #设置故障转移的超时时间为 60000 毫秒(60秒)。 sentinel parallel-syncs mymaster 1 # 故障转移时,最多有1个从节点同时同步新主 sentinel auth-pass mymaster 123456 #配置哨兵连接redis密码 \`\`\` \`\`\` port 26579 #设置哨兵实例监听的端口号为 26379 如果有3个,就分别修改端口为 26379 26479 26579 dir "./26579" 设置哨兵的工作目录为 daemonize no pidfile "./redis-sentinel-26579.pid" logfile "./sentinel-26579.log" sentinel announce-ip 127.0.0.1 #指定本哨兵IP地址为 127.0.0.1 sentinel monitor mymaster 127.0.0.1 6379 2 #哨兵监控名为 mymaster主节点 ip地址是127.0.0.1 端口是6379,2代表quorum sentinel down-after-milliseconds mymaster 5000 #设置判断主节点下线的时间阈值为 5000 毫秒(5秒)。 sentinel failover-timeout mymaster 60000 #设置故障转移的超时时间为 60000 毫秒(60秒)。 sentinel parallel-syncs mymaster 1 # 故障转移时,最多有1个从节点同时同步新主 sentinel auth-pass mymaster 123456 #配置哨兵连接redis密码 \`\`\` \*\*哨兵会通过INFO REPLICATION命令向主库,去拿到从库的信息,一旦主库无法连接,就会根据策略把从库进行升级成主库\*\* 启动 \`\`\` redis-sentinel /sentinel26379.conf redis-sentinel /sentinel26479.conf redis-sentinel /sentinel26579.conf \`\`\` # 七、手动升级从库为主库 \`\`\` SLAVEOF NO ONE \`\`\` \*\*面试重点:\*\* 1、怎么保证redis的高可用? 2、主从怎么保证主从可用? 3、几个哨兵?(奇数) 4、哨兵的原理