Redis主从复制(Master-Slave Replication)解析与搭建操作指南
Redis是一种高性能的键值存储系统,广泛应用于缓存、消息队列和实时数据处理等场景。为了保证数据的高可用性和扩展性,Redis提供了主从复制(Master-Slave Replication)机制。本文将详细介绍Redis主从复制的原理、配置方法以及实践中的注意事项,帮助你更好地理解和应用这一功能。
1 主从复制简介
1.1 什么是主从复制
Redis主从复制是一种数据同步机制,允许将一台Redis服务器(称为主节点,Master)的数据复制到一台或多台Redis服务器(称为从节点,Slave)。主节点负责处理写操作,而从节点则负责复制主节点的数据并提供读服务。主从复制的主要作用:
- 数据冗余:通过复制数据到从节点,实现数据备份,避免单点故障
- 读写分离:主节点处理写请求,从节点处理读请求,分担主节点的压力
- 故障恢复:当主节点出现故障时,可以快速将从节点提升为主节点,保证服务可用性
1.2 主从复制的优点
- 读写分离:主节点处理写操作,从节点处理读操作,分担主节点的压力
- 数据冗余:从节点保存了主节点的数据副本,提高了数据的可靠性
- 高可用性:如果主节点宕机,可以手动将从节点提升为主节点
2 Redis主从复制原理概述
Redis主从复制的核心原理是通过命令传播和数据同步来实现主从节点之间的数据一致性。具体如下:1. 建立连接
- 从节点启动后,会向主节点发送psync命令,请求同步数据
- 主节点接收到请求后,会判断是否需要进行全量复制或部分复制
2. 数据同步
- 全量复制:如果从节点是首次连接主节点,或者主从节点的数据差异较大,主节点会执行全量复制,主节点将当前所有数据生成RDB快照文件并发送给从节点,从节点加载RDB文件完成数据同步
- 部分复制:如果从节点已经拥有部分数据,主节点只需发送从节点缺失的数据
3. 命令传播
- 主节点将接收到的写命令发送给从节点,从节点执行这些命令以保持数据同步
4. 断线重连
- 如果从节点与主节点的连接中断,从节点会尝试重新连接主节点,并继续同步数据
3 搭建Redis主从复制
3.1 环境准备
- 两台或多台服务器,分别安装Redis
安装操作参考:Redis安装与基础配置:单节点离线部署与配置解析-CSDN博客)
- 确保服务器之间网络互通
- 主节点:192.168.10.32
- 从节点:192.168.10.31
3.2 主节点配置
vim /usr/local/redis/redis.conf
# 编辑/usr/local/redis/redis.conf文件,修改如下项的内容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
daemonize yes
# 修改完如上内容后重启服务
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
3.3 从节点配置
vim /usr/local/redis/redis.conf
# 编辑/usr/local/redis/redis.conf文件,修改如下项的内容
bind 0.0.0.0
protected-mode no
requirepass lahmy1c@
replicaof 192.168.10.32 6379
masterauth lahmy1c@
daemonize yes
# 修改完如上内容后重启服务
ps -ef |grep redis|grep -v grep |awk '{print $2}'|xargs kill -9
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
3.4 查看主从复制状态
3.4.1 主节点状态
[root@node3 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.10.31,port=6379,state=online,offset=140,lag=1
master_failover_state:no-failover
master_replid:3d1c7065aedf4d5847135b675d17a908a5bc845c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
[root@node3 redis]#
3.4 查看主从复制状态
3.4.1 主节点状态
[root@node3 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.10.31,port=6379,state=online,offset=140,lag=1
master_failover_state:no-failover
master_replid:3d1c7065aedf4d5847135b675d17a908a5bc845c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
[root@node3 redis]#
3.4.2 从节点状态
[root@node2 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:4slave
master_host:192.168.10.32
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:196
slave_repl_offset:196
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:3d1c7065aedf4d5847135b675d17a908a5bc845c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196
[root@node2 redis]#
4 验证主从复制
4.1 主节点写入数据
# 在主节点上创建一个key
/usr/local/redis/bin/redis-cli -a lahmy1c@ set masterkey mastertest
[root@node3 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ set masterkey mastertest
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
[root@node3 redis]#
4.2 从节点读取数据
# 在从节点上获取key,是否可以正常获取到值
/usr/local/redis/bin/redis-cli -a lahmy1c@ get masterkey
[root@node2 redis]# /usr/local/redis/bin/redis-cli -a lahmy1c@ get masterkey
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"mastertest"
[root@node2 redis]#
5 总结
Redis主从复制是实现高可用性和扩展性的关键技术。通过合理配置和使用,可以提升Redis的性能和可靠性。在实际应用中,可以结合Redis Sentinel或Redis Cluster实现更强大的高可用方案。