算法题-回溯
2026/7/30 12:51:33
你可以把Redis主从复制想象成「老板和秘书」的关系:
Redis主从复制本质是「从库主动同步主库数据」,分3步:
假设你已经安装好Redis(默认路径/usr/local/redis,配置文件redis.conf),演示「1主1从」:
主库默认不用改核心配置,只需要确保:
# 编辑主库配置文件(6379端口)vim/usr/local/redis/redis.conf# 确认以下配置(没有就添加):bind0.0.0.0# 允许其他机器连接(如果是本机演示,127.0.0.1也可以)protected-mode no# 关闭保护模式(测试用,生产要配密码)port6379# 主库端口daemonizeyes# 后台运行pidfile /var/run/redis_6379.pid logfile"6379.log"dbfilename dump_6379.rdb# 启动主库/usr/local/redis/src/redis-server /usr/local/redis/redis.conf# 复制一份配置文件给从库cp/usr/local/redis/redis.conf /usr/local/redis/redis_6380.conf# 编辑从库配置文件vim/usr/local/redis/redis_6380.conf# 修改以下配置(和主库区分):bind0.0.0.0 protected-mode no port6380# 从库端口,和主库不一样daemonizeyespidfile /var/run/redis_6380.pid logfile"6380.log"dbfilename dump_6380.rdb# 核心:指定主库地址和端口(关键配置!)replicaof127.0.0.16379# Redis5.0+用replicaof,5.0前用slaveof# 启动从库/usr/local/redis/src/redis-server /usr/local/redis/redis_6380.conf# 1. 连接主库(6379),写入数据/usr/local/redis/src/redis-cli -p6379127.0.0.1:6379>setname"redis-master"# 主库写数据OK# 2. 连接从库(6380),查询数据/usr/local/redis/src/redis-cli -p6380127.0.0.1:6380>get name# 从库能查到主库写的数据,说明同步成功"redis-master"# 3. 验证从库不能写数据(从库默认只读)127.0.0.1:6380>setage18(error)READONLY You can'twriteagainst areadonly replica.# 报错,只读# 4. 查看主从状态(主库执行)127.0.0.1:6379>info replication# 能看到"connected_slaves:1",以及从库的端口6380,说明主从连接成功主从复制解决了「读写分离」,但有个大问题:如果老板(主库)突然病倒了(宕机),虽然秘书(从库)能查数据,但没人能写数据了,业务会卡住。
哨兵模式就相当于给老板配了「专职保镖」(哨兵进程):
主从+哨兵解决了「高可用」,但如果数据量太大(比如100G),一个主库存不下,或者每秒要处理10万次请求,一个主库扛不住,这时候就需要Redis集群。
你可以把Redis集群想象成「连锁超市」:
Redis集群要求至少3个主节点,每个主节点配1个从节点(共6节点),端口用7000-7005。
# 1. 创建集群目录mkdir-p /usr/local/redis/cluster/{7000,7001,7002,7003,7004,7005}# 2. 复制配置文件到每个节点目录(以7000为例,其他节点改端口即可)cp/usr/local/redis/redis.conf /usr/local/redis/cluster/7000/redis.conf# 3. 编辑7000节点的配置文件vim/usr/local/redis/cluster/7000/redis.conf# 修改以下核心配置:bind0.0.0.0 protected-mode no port7000daemonizeyespidfile /var/run/redis_7000.pid logfile"7000.log"dbfilename dump_7000.rdbdir/usr/local/redis/cluster/7000# 节点数据目录cluster-enabledyes# 开启集群模式(关键!)cluster-config-file nodes_7000.conf# 集群节点配置文件(自动生成)cluster-node-timeout15000# 节点超时时间(15秒)appendonlyyes# 开启AOF持久化(可选,增强数据可靠性)# 4. 复制7000的配置文件到7001-7005,批量修改端口(用sed命令)forportin{7001..7005};docp/usr/local/redis/cluster/7000/redis.conf /usr/local/redis/cluster/$port/redis.confsed-i"s/7000/$port/g"/usr/local/redis/cluster/$port/redis.confdone# 批量启动6个节点forportin{7000..7005};do/usr/local/redis/src/redis-server /usr/local/redis/cluster/$port/redis.confdone# 检查节点是否启动成功ps-ef|grepredis|grep-vgrep# 能看到6个redis进程,端口7000-7005,说明启动成功# 执行集群创建命令(127.0.0.1是本机IP,生产改实际IP;--cluster-replicas 1表示每个主节点配1个从节点)/usr/local/redis/src/redis-cli --cluster create127.0.0.1:7000127.0.0.1:7001127.0.0.2:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005 --cluster-replicas1# 执行后会提示分配哈希槽,输入「yes」确认:>>>Performinghashslots allocation on6nodes...>>>Assign a different config epoch to eachnode>>>Sending CLUSTER MEET messages tojointhe cluster Do you want to accept the proposed configuration?(type'yes'to accept):yes# 连接集群(-c表示集群模式)/usr/local/redis/src/redis-cli -c -p7000# 1. 查看集群状态127.0.0.1:7000>cluster info# 能看到"cluster_state:ok",说明集群正常# 2. 查看集群节点127.0.0.1:7000>cluster nodes# 能看到6个节点,标记为master(主)或slave(从),以及哈希槽分配# 3. 测试数据写入(集群会自动把数据分配到对应主节点)127.0.0.1:7000>setuser:1"zhangsan"OK# 查数据,集群会自动路由到存储该数据的节点127.0.0.1:7000>get user:1"zhangsan"# 4. 测试故障转移(停掉一个主节点,比如7000)# 先退出redis-cli,执行:/usr/local/redis/src/redis-cli -p7000shutdown# 再连接7001,查看集群状态:/usr/local/redis/src/redis-cli -c -p7001127.0.0.1:7001>cluster nodes# 能看到7000的从节点(比如7003)升级成了主节点,集群状态还是ok三个功能的递进关系:主从复制(基础)→ 哨兵模式(主从的高可用增强)→ 集群(大规模场景的分布式解决方案)。