主从复制
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
存在复制延迟的缺点,主机的数据不一定能在挂掉前,完全复制到从机,从机过多,会加剧这一缺点

- 实现读写分离
- 容灾快速恢复(一台从服务器挂掉,可以切换到其他从服务器)
- 一主多从(防主机挂掉,使用集群)
配置主从复制(一主两从为例)
- 创建新的文件夹用来配置
- 将
redis.conf
配置文件复制到新的文件夹下
| root@LK:/myredis |
| root@LK:/myredis |
| redis.conf |
-
配置一主两从,需要三个配置文件
- 创建redis6379.conf
- 主要在文件中写入以下内容
| include /myredis/redis.conf |
| pidfile /var/run/redis_6379.pid |
| port 6379 |
| dbfilename dump6379.rdb |
- 仿照上面的内容创建redis6380.conf、redis6381.conf,文件内容修改对应的数字即可
- 启动配置文件
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| root@LK:/myredis |
| lk 57615 2002 0 21:15 ? 00:00:00 redis-server 127.0.0.1:6379 |
| lk 57623 2002 0 21:15 ? 00:00:00 redis-server 127.0.0.1:6380 |
| lk 57631 2002 0 21:15 ? 00:00:00 redis-server 127.0.0.1:6381 |
| lk 57668 57291 0 21:16 pts/0 00:00:00 grep --color=auto redis |
- 查看当前redis的主从配置
| root@LK:/myredis |
| 127.0.0.1:6379> info replication |
| |
| |
| |
| role:master |
| |
| connected_slaves:0 |
| master_failover_state:no-failover |
| master_replid:98ff0d93dbe4c1492ff7f7f1ff6284dac86414dc |
| master_replid2:0000000000000000000000000000000000000000 |
| master_repl_offset:0 |
| second_repl_offset:-1 |
| repl_backlog_active:0 |
| repl_backlog_size:1048576 |
| repl_backlog_first_byte_offset:0 |
| repl_backlog_histlen:0 |
- 修改主从配置(令6379为主机)
在6380、6381从机上执行slaveof 主机ip 端口号
- 查看6379的主从配置
| 127.0.0.1:6379> info replication |
| |
| role:master |
| |
| connected_slaves:2 |
| slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=5 |
| slave1:ip=127.0.0.1,port=6381,state=online,offset=0,lag=5 |
| master_failover_state:no-failover |
| master_replid:e003ed0236c8d42eaebef789c116a3f4091e2961 |
| master_replid2:0000000000000000000000000000000000000000 |
| master_repl_offset:112 |
| second_repl_offset:-1 |
| repl_backlog_active:1 |
| repl_backlog_size:1048576 |
| repl_backlog_first_byte_offset:1 |
| repl_backlog_histlen:112 |
-
测试
- 在主服务进行写操作
| 127.0.0.1:6379> set k1 v1 |
| OK |
| 127.0.0.1:6379> keys * |
| 1) "k1" |
- 在从服务器上进行读操作
| 127.0.0.1:6380> keys * |
| 1) "k1" |
主从操作特点
主从复制原理
- 从机连上主机之后,从机向主机发送进行数据同步消息
- 主机接到消息后,把主机数据进行持久化为rdb文件,把rdb文件发送给从机,从机读取数据
- 每次主机进行写操作之后,和从服务器同步数据
从属关系(主机一直是主机)
- 从服务器在使用过程中挂掉,重启后需要重新配置从属关系,配置后仍可以同步主服务器的内容
- 主服务器在使用中挂掉,重启后仍是主机,从机不会因为主机挂掉而丢失从属关系
薪火相传(从机后面还可以挂载从机)
- 如果从机过多,为了降低主机负担,主机只对固定的几个从机进行数据传递,剩下的由从机一层层传递下去,类似与树的结构。
- 传递过程中如果一个从机挂掉,则其下层的所有从机都不能完成同步。
反客为主(从机可以变成主机)
- 主机挂掉,下层从机可以设置
slaveof no one
,变成主机
- 缺点是不能自动完成配置,自动完成配置需要哨兵模式
哨兵模式
能够后台监视主机是否故障,如果故障根据投票数自动将从机转换为主机

- 建立所有服务器的主从关系(具体步骤参照上面)
- 在当前文件夹下加入
sentinel.conf
文件,名字不能错
- 配置哨兵,填写内容
| sentinel monitor mymaster 127.0.0.1 6379 1 |
mymaster为监控对象起的服务器别名,1表示为至少有1个哨兵同意迁移服务器
4. 启动哨兵/usr/local/bin/redis-sentinel
| 66666:X 25 Jun 2022 00:39:56.063 * monotonic clock: POSIX clock_gettime |
| _._ |
| _.-``__ ''-._ |
| _.-`` `. `_. ''-._ Redis 7.0.2 (00000000/0) 64 bit |
| .-`` .-```. ```\/ _.,_ ''-._ |
| ( ' , .-` | `, ) Running in sentinel mode |
| |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 |
| | `-._ `._ / _.-' | PID: 66666 |
| `-._ `-._ `-./ _.-' _.-' |
| |`-._`-._ `-.__.-' _.-'_.-'| |
| | `-._`-._ _.-'_.-' | https://redis.io |
| `-._ `-._`-.__.-'_.-' _.-' |
| |`-._`-._ `-.__.-' _.-'_.-'| |
| | `-._`-._ _.-'_.-' | |
| `-._ `-._`-.__.-'_.-' _.-' |
| `-._ `-.__.-' _.-' |
| `-._ _.-' |
| `-.__.-' |
| |
| 66666:X 25 Jun 2022 00:39:56.065 * Sentinel new configuration saved on disk |
| 66666:X 25 Jun 2022 00:39:56.065 |
| 66666:X 25 Jun 2022 00:39:56.065 |
| 66666:X 25 Jun 2022 00:39:56.066 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 |
| 66666:X 25 Jun 2022 00:39:56.068 * Sentinel new configuration saved on disk |
| 66666:X 25 Jun 2022 00:39:56.068 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 |
| 66666:X 25 Jun 2022 00:39:56.069 * Sentinel new configuration saved on disk |
- 哨兵机制
- 如果主机挂掉,哨兵会根据选择条件选取从机作为新的主机,
- 此时原来主机的从机也会变成现在主机的从机
- 如果主机进一步重启,会直接作为新主机的从机
- 哨兵选择条件
- 优先级靠前的(默认
slave-priority 100
,值越小,优先级越高,新版本replica-priority 100
)
- 偏移量最大的(获得主机原数据最全的)
- runid最小的(redis实例启动后都会随机生成一个40位的runid)
jedis实现
| private static JedisSentinelPool jedisSentinelPool=null; |
| |
| public static Jedis getJedisFromSentinel(){ |
| if(jedisSentinelPool==null){ |
| Set<String> sentinelSet=new HashSet<>(); |
| sentinelSet.add("127.0.0.1:26379"); |
| |
| JedisPoolConfig jedisPoolConfig =new JedisPoolConfig(); |
| jedisPoolConfig.setMaxTotal(10); |
| jedisPoolConfig.setMaxIdle(5); |
| jedisPoolConfig.setMinIdle(5); |
| jedisPoolConfig.setBlockWhenExhausted(true); |
| jedisPoolConfig.setMaxWaitMillis(2000); |
| jedisPoolConfig.setTestOnBorrow(true); |
| jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig); |
| return jedisSentinelPool.getResource(); |
| }else{ |
| return jedisSentinelPool.getResource(); |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)