1. 首页 > Redis教程 > 正文

Redis教程FG022-Redis主从复制配置实战

本文档风哥主要介绍Redis主从复制配置实战,包括主从复制概念、复制类型、主从复制优势、架构规划、硬件要求、网络要求、主从复制设置、复制配置详解、复制操作、复制监控以及实战案例等内容,风哥教程参考Redis官方文档Replication等内容编写,适合DBA人员和开发人员在生产环境中使用。

Part01-基础概念与理论知识

1.1 主从复制概念

Redis主从复制是一种数据复制机制,它允许将一个Redis服务器(主节点)的数据复制到多个Redis服务器(从节点)。主从复制的核心概念:

  • 主节点(Master):负责处理写操作,是数据的源头
  • 从节点(Slave):负责处理读操作,从主节点同步数据
  • 复制:从节点从主节点复制数据的过程
  • 同步:主节点和从节点数据保持一致的过程

1.2 复制类型

Redis主从复制的类型:

  • 全量复制:从节点首次连接主节点时,会进行全量复制,主节点将所有数据发送给从节点
  • 增量复制:全量复制完成后,主节点会将后续的写操作发送给从节点
  • 部分复制:当从节点与主节点网络中断后重新连接时,如果复制偏移量在主节点的复制积压缓冲区中,会进行部分复制

1.3 主从复制优势

主从复制的优势:

  • 读写分离:主节点负责写入,从节点负责读取,提高系统的并发处理能力
  • 数据备份:从节点作为主节点的备份,确保数据安全
  • 高可用性:当主节点故障时,可以切换到从节点,确保服务不中断
  • 负载均衡:将读请求分散到多个从节点,减轻主节点的压力
  • 地理分布式部署:在不同地区部署从节点,提高用户访问速度

更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 架构规划

生产环境主从复制架构规划:

  • 一主一从:最简单的主从架构,适用于小型应用
  • 一主多从:一个主节点,多个从节点,适用于读多写少的场景
  • 级联复制:从节点作为其他从节点的主节点,减轻主节点的复制压力
  • 树形复制:主节点 → 从节点1 → 从节点2 → …,适用于大规模部署

2.2 硬件要求

硬件要求:

  • CPU:主节点需要足够的CPU处理写操作和复制请求;从节点需要足够的CPU处理读操作
  • 内存:主节点和从节点的内存应足够存储数据,建议从节点内存不小于主节点
  • 磁盘:主节点需要足够的磁盘空间存储持久化文件;从节点也需要足够的磁盘空间
  • 网络:主从节点之间需要稳定的网络连接,网络带宽应足够

2.3 网络要求

# 网络要求

## 1. 网络延迟
– 主从节点之间的网络延迟应尽可能低,建议不超过10ms
– 网络延迟过高会导致复制延迟,影响数据一致性

## 2. 网络带宽
– 全量复制时需要较大的网络带宽,建议至少1Gbps
– 增量复制时带宽需求相对较小,但也需要保证稳定

## 3. 网络稳定性
– 确保主从节点之间的网络连接稳定,避免频繁中断
– 网络中断会导致复制失败,需要重新同步

## 4. 网络安全
– 配置防火墙规则,只允许主从节点之间的通信
– 考虑使用专线或VPN连接主从节点

学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 主从复制设置

# 主从复制设置

## 1. 环境准备
# 主节点:192.168.1.100
# 从节点1:192.168.1.101
# 从节点2:192.168.1.102

## 2. 主节点配置
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 3. 从节点1配置
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.101

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 4. 从节点2配置
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.102

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 5. 启动所有节点
$ systemctl start redis # 在主节点上执行
$ systemctl start redis # 在从节点1上执行
$ systemctl start redis # 在从节点2上执行

3.2 复制配置详解

# 复制配置详解

## 1. 主节点复制配置
– replicaof:设置从节点的主节点地址和端口
– masterauth:设置主节点的密码
– repl-backlog-size:设置复制积压缓冲区大小,默认1mb
– repl-backlog-ttl:设置复制积压缓冲区的过期时间,默认3600秒
– repl-diskless-sync:是否使用无盘同步,默认no
– repl-diskless-sync-delay:无盘同步的延迟时间,默认5秒
– repl-disable-tcp-nodelay:是否禁用TCP_NODELAY,默认no
– replica-priority:从节点的优先级,默认100,值越小优先级越高
– min-replicas-to-write:主节点至少需要的从节点数量,默认0
– min-replicas-max-lag:从节点的最大延迟时间,默认10秒

## 2. 从节点复制配置
– replicaof:设置主节点的地址和端口
– masterauth:设置主节点的密码
– replica-read-only:从节点是否只读,默认yes
– replica-serve-stale-data:当从节点与主节点失去连接时,是否继续服务,默认yes
– replica-ignore-maxmemory:从节点是否忽略maxmemory设置,默认yes

3.3 复制操作

# 复制操作

## 1. 查看主节点复制状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
slave1:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 2. 查看从节点复制状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:12345
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 3. 手动设置从节点
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 slaveof 192.168.1.100 6379

# 输出示例
OK

## 4. 取消从节点身份
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 slaveof no one

# 输出示例
OK

## 5. 测试数据同步
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set test:key “test value”
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get test:key
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get test:key

# 输出示例
OK
“test value”
“test value”

3.4 复制监控

# 复制监控

## 1. 监控主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

## 2. 监控从节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

## 3. 监控复制延迟
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication | grep master_link_status
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication | grep master_last_io_seconds_ago

## 4. 监控复制偏移量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication | grep master_repl_offset
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication | grep slave_repl_offset

## 5. 使用监控工具
# 可以使用Prometheus + Grafana监控Redis复制状态
# 可以使用Redis自带的监控命令
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 monitor

风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。

Part04-生产案例与实战讲解

4.1 一主多从架构实战

# 一主多从架构实战

## 1. 环境准备
# 主节点:192.168.1.100
# 从节点1:192.168.1.101
# 从节点2:192.168.1.102

## 2. 配置主节点
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 3. 配置从节点1
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.101

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 4. 配置从节点2
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.102

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 5. 启动所有节点
$ systemctl start redis # 在主节点上执行
$ systemctl start redis # 在从节点1上执行
$ systemctl start redis # 在从节点2上执行

## 6. 验证主从关系
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
slave1:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 7. 测试读写分离
# 写入操作(主节点)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1001:name “张三”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1002:name “李四”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set user:1003:name “王五”

# 读取操作(从节点1)
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1001:name
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1002:name

# 读取操作(从节点2)
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get user:1003:name
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get user:1001:name

# 输出示例
OK
OK
OK
“张三”
“李四”
“王五”
“张三”

4.2 级联复制实战

# 级联复制实战

## 1. 环境准备
# 主节点:192.168.1.100
# 从节点1(同时作为从节点2的主节点):192.168.1.101
# 从节点2:192.168.1.102

## 2. 配置主节点
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 3. 配置从节点1
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.101

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置
replicaof 192.168.1.100 6379
masterauth fgedu@2026

# 允许从节点作为其他从节点的主节点
replica-read-only no

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 4. 配置从节点2
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.102

# 端口
port 6379

# 密码
requirepass fgedu@2026

# 主节点配置(指向从节点1)
replicaof 192.168.1.101 6379
masterauth fgedu@2026

# 复制配置
repl-backlog-size 1mb
repl-backlog-ttl 3600

# 保存配置
:wq

## 5. 启动所有节点
$ systemctl start redis # 在主节点上执行
$ systemctl start redis # 在从节点1上执行
$ systemctl start redis # 在从节点2上执行

## 6. 验证级联复制关系
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info replication
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 info replication

## 7. 测试数据同步
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set cascade:test “cascading replication”
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get cascade:test
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get cascade:test

# 输出示例
OK
“cascading replication”
“cascading replication”

4.3 读写分离实战

# 读写分离实战

## 1. 配置主从架构(一主二从)
# 主节点:192.168.1.100
# 从节点1:192.168.1.101
# 从节点2:192.168.1.102

## 2. 写入操作(主节点)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set product:1001:name “Redis教程”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set product:1001:price “99”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set product:1002:name “MySQL教程”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 set product:1002:price “88”

# 输出示例
OK
OK
OK
OK

## 3. 读取操作(从节点1)
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get product:1001:name
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get product:1001:price

# 输出示例
“Redis教程”
“99”

## 4. 读取操作(从节点2)
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get product:1002:name
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get product:1002:price

# 输出示例
“MySQL教程”
“88”

## 5. 负载均衡配置
# 可以使用Redis Cluster或第三方负载均衡工具(如HAProxy)实现读请求的负载均衡

## 6. 测试高并发读操作
$ for i in {1..100}; do /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get product:1001:name; done
$ for i in {1..100}; do /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get product:1002:name; done

4.4 故障转移实战

# 故障转移实战

## 1. 模拟主节点故障
$ systemctl stop redis # 在主节点上执行

## 2. 检查从节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:12345
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 3. 将从节点1提升为主节点
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 slaveof no one

# 输出示例
OK

## 4. 检查从节点1的状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_repl_offset:12345
second_repl_offset:12345
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 5. 将从节点2指向新的主节点
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 slaveof 192.168.1.101 6379

# 输出示例
OK

## 6. 检查从节点2的状态
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:slave
master_host:192.168.1.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:12345
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

## 7. 测试新的主从架构
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 set failover:test “failover success”
$ /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get failover:test

# 输出示例
OK
“failover success”

## 8. 原主节点恢复后,设置为从节点
$ systemctl start redis # 在原主节点上执行
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 slaveof 192.168.1.101 6379

# 输出示例
OK

## 9. 检查所有节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 info replication

# 输出示例
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.102,port=6379,state=online,offset=12345,lag=0
slave1:ip=192.168.1.100,port=6379,state=online,offset=12345,lag=0
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_replid2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_repl_offset:12345
second_repl_offset:12345
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 最佳实践

Redis主从复制配置实战最佳实践:

  • 架构设计:根据业务需求设计合理的主从架构,如一主多从、级联复制等,学习交流加群风哥微信: itpux-com
  • 网络配置:确保主从节点之间的网络连接稳定,网络延迟低
  • 硬件配置:根据业务负载配置合理的硬件资源
  • 安全配置:配置主从节点之间的认证和加密
  • 监控配置:监控主从复制状态,及时发现问题
  • 故障转移:制定合理的故障转移策略,确保服务不中断
  • 复制参数:合理配置复制参数,如repl-backlog-size、repl-diskless-sync等
  • 数据一致性:确保主从节点数据的一致性,定期检查复制状态

5.2 常见问题

常见问题及解决:

  • 复制延迟:检查网络延迟和主节点负载,优化网络连接,增加复制积压缓冲区大小
  • 复制中断:检查网络连接和主节点状态,重新建立复制关系
  • 数据不一致:检查复制偏移量,必要时进行全量同步
  • 主节点故障:及时进行故障转移,确保服务不中断
  • 从节点只读:默认情况下从节点是只读的,如需写入需要修改配置
  • 认证失败:检查masterauth配置是否正确
  • 网络防火墙:确保主从节点之间的网络端口开放

5.3 优化技巧

风哥提示:Redis主从复制是实现高可用性和读写分离的重要手段。在实际应用中,需要根据业务需求设计合理的主从架构,确保主从节点之间的网络连接稳定,监控复制状态,及时发现和解决问题。

# 优化技巧

## 1. 复制配置优化
– 合理设置repl-backlog-size,确保增量复制的可靠性
– 启用repl-diskless-sync,减少全量同步时的磁盘I/O
– 合理设置repl-disable-tcp-nodelay,平衡延迟和带宽
– 设置min-replicas-to-write和min-replicas-max-lag,确保主节点在有足够从节点时才写入

## 2. 网络优化
– 确保主从节点之间的网络延迟低
– 确保网络带宽足够,特别是在全量同步时
– 配置防火墙规则,只允许主从节点之间的通信
– 考虑使用专线或VPN连接主从节点

## 3. 性能优化
– 合理配置主从节点的硬件资源
– 优化主节点的写操作性能
– 优化从节点的读操作性能
– 考虑使用级联复制,减轻主节点的复制压力
– 使用读写分离,提高系统的并发处理能力

## 4. 监控优化
– 监控主从复制状态,及时发现问题
– 监控复制延迟,避免数据不一致
– 监控主从节点的资源使用情况
– 设置合理的告警机制
– 定期检查主从节点的健康状态

## 5. 故障转移优化
– 制定合理的故障转移策略
– 考虑使用Redis Sentinel实现自动故障转移
– 定期测试故障转移流程,确保其可靠性
– 准备好故障转移的回滚方案
– 建立完善的故障处理流程

通过本文档的学习,您应该掌握了Redis主从复制配置实战,能够在生产环境中合理配置和管理主从复制架构,实现读写分离、数据备份和高可用性。在实际应用中,需要根据具体业务场景选择合适的主从架构,确保系统的可靠性和性能。

风哥提示:Redis主从复制是实现高可用性和读写分离的重要手段。在实际应用中,需要根据业务需求设计合理的主从架构,确保主从节点之间的网络连接稳定,监控复制状态,及时发现和解决问题。

from Redis视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息