1. 首页 > Redis教程 > 正文

Redis教程FG021-Redis主从复制实战

本文档风哥主要介绍Redis主从复制实战,包括主从复制概念、主从复制原理、主从复制使用场景、主从复制规划、网络考虑、性能考虑、主从复制设置、复制操作、复制监控、复制故障排查以及实战案例等内容,风哥教程参考Redis官方文档Replication等内容编写,适合DBA人员和开发人员在生产环境中使用。

Part01-基础概念与理论知识

1.1 主从复制概念

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

  • 数据同步:从节点会自动同步主节点的数据
  • 读写分离:主节点负责写入,从节点负责读取
  • 高可用性:当主节点故障时,可以手动或自动切换到从节点
  • 负载均衡:可以将读请求分散到多个从节点

1.2 主从复制原理

Redis主从复制的工作原理:

  • 全量同步:从节点首次连接主节点时,会进行全量同步,主节点将所有数据发送给从节点
  • 增量同步:全量同步完成后,主节点会将后续的写操作发送给从节点
  • 复制偏移量:主节点和从节点会维护复制偏移量,确保数据同步的一致性
  • 复制积压缓冲区:主节点会维护一个复制积压缓冲区,用于存储最近的写操作

1.3 主从复制使用场景

主从复制的使用场景:

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

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

Part02-生产环境规划与建议

2.1 主从复制规划

生产环境主从复制规划:

  • 架构设计:根据业务需求设计合理的主从架构,如一主多从、级联复制等
  • 节点数量:根据业务负载和高可用性需求,确定主从节点的数量
  • 硬件配置:主节点和从节点的硬件配置应根据业务需求进行调整
  • 网络配置:确保主从节点之间的网络连接稳定
  • 安全配置:配置主从节点之间的认证和加密

2.2 网络考虑

网络考虑:

  • 网络延迟:主从节点之间的网络延迟应尽可能低,避免数据同步延迟
  • 网络带宽:确保主从节点之间的网络带宽足够,特别是在全量同步时
  • 网络稳定性:确保网络连接稳定,避免因网络中断导致复制失败
  • 网络安全:配置防火墙规则,只允许主从节点之间的通信

2.3 性能考虑

# 性能考虑

## 1. 主节点性能
– 主节点负责所有的写操作,需要足够的CPU和内存
– 主节点需要处理来自从节点的复制请求
– 主节点的磁盘I/O性能会影响RDB快照的创建速度

## 2. 从节点性能
– 从节点负责读操作,需要足够的CPU和内存
– 从节点需要处理主节点的复制数据
– 从节点的磁盘I/O性能会影响RDB文件的加载速度

## 3. 复制性能
– 全量复制会占用大量网络带宽和磁盘I/O
– 增量复制的性能影响较小
– 复制延迟会影响从节点的数据一致性

## 4. 最佳实践
– 合理配置主从节点的硬件资源
– 优化网络连接,减少网络延迟
– 合理设置复制参数,如repl-backlog-size
– 监控复制延迟,及时发现问题

学习交流加群风哥QQ113257174

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

3.1 主从复制设置

# 主从复制设置

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

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

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

# 保存配置
:wq

## 2. 从节点配置
$ 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

## 3. 启动主节点
$ systemctl start redis

## 4. 启动从节点
$ systemctl start redis

3.2 复制操作

# 复制操作

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

# 输出示例
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,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.100 -p 6379 -a fgedu@2026 set test:key “test value”

# 输出示例
OK

## 4. 在从节点上验证数据同步
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get test:key

# 输出示例
“test value”

## 5. 手动触发全量同步
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 slaveof no one
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 slaveof 192.168.1.100 6379

# 输出示例
OK
OK

3.3 复制监控

# 复制监控

## 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-cli监控复制状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 cluster info

## 5. 使用监控工具
# 可以使用Prometheus + Grafana监控Redis复制状态

3.4 复制故障排查

# 复制故障排查

## 1. 检查网络连接
$ ping 192.168.1.100
$ telnet 192.168.1.100 6379

## 2. 检查主节点状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ping
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 info server

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

## 4. 检查复制配置
$ grep replicaof /redis/app/redis.conf
$ grep masterauth /redis/app/redis.conf

## 5. 检查复制日志
$ tail -f /redis/app/log/redis.log

## 6. 常见故障及解决
– 网络连接问题:检查网络配置和防火墙规则
– 认证失败:检查masterauth配置
– 主节点故障:检查主节点状态并进行故障转移
– 复制延迟:检查网络延迟和主节点负载

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

Part04-生产案例与实战讲解

4.1 一主多从架构

# 一主多从架构

## 1. 主节点配置(192.168.1.100)
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

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

# 保存配置
:wq

## 2. 从节点1配置(192.168.1.101)
$ 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

## 3. 从节点2配置(192.168.1.102)
$ 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

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

## 5. 验证主从关系
$ /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

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

# 输出示例
OK
“hello world”
“hello world”

4.2 级联复制

# 级联复制

## 1. 主节点配置(192.168.1.100)
$ vi /redis/app/redis.conf

# 绑定地址
bind 192.168.1.100

# 端口
port 6379

# 密码
requirepass fgedu@2026

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

# 保存配置
:wq

## 2. 从节点1配置(192.168.1.101)
$ 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

## 3. 从节点2配置(192.168.1.102)
$ 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

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

## 5. 验证级联复制关系
$ /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

## 6. 测试数据同步
$ /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 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 “王五”

# 输出示例
OK
OK
OK

## 3. 读取操作(从节点)
$ /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.102 -p 6379 -a fgedu@2026 get user:1002:name
$ /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1003:name

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

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

## 5. 测试读写分离效果
$ for i in {1..10}; do /redis/app/bin/redis-cli -h 192.168.1.101 -p 6379 -a fgedu@2026 get user:1001:name; done
$ for i in {1..10}; do /redis/app/bin/redis-cli -h 192.168.1.102 -p 6379 -a fgedu@2026 get user: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
  • 网络配置:确保主从节点之间的网络连接稳定,网络延迟低
  • 硬件配置:根据业务负载配置合理的硬件资源
  • 安全配置:配置主从节点之间的认证和加密
  • 监控配置:监控主从复制状态,及时发现问题
  • 故障转移:制定合理的故障转移策略,确保服务不中断

5.2 常见问题

常见问题及解决:

  • 复制延迟:检查网络延迟和主节点负载,优化网络连接
  • 复制中断:检查网络连接和主节点状态,重新建立复制关系
  • 数据不一致:检查复制偏移量,必要时进行全量同步
  • 主节点故障:及时进行故障转移,确保服务不中断
  • 从节点只读:默认情况下从节点是只读的,如需写入需要修改配置

5.3 优化技巧

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

# 优化技巧

## 1. 复制配置优化
– 合理设置repl-backlog-size,确保增量复制的可靠性
– 合理设置repl-backlog-ttl,避免复制积压缓冲区过大
– 启用repl-diskless-sync,减少全量同步时的磁盘I/O
– 合理设置repl-disable-tcp-nodelay,平衡延迟和带宽

## 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,节假日休息