主要内容:
redis主从复制、哨兵服务(高可用)、数据持久化(RDB、AOF)
一、Redis主从复制概述
Redis 主从复制是一种数据复制机制,用于在多个 Redis 实例之间同步数据,以提高系统的可用性、可靠性和读取性能。主从复制的基本思想是将一个 Redis 实例(主节点)的数据复制到一个或多个其他 Redis 实例(从节点),从而实现数据的冗余备份和读写分离。以下是 Redis 主从复制的概述:
1. 基本概念
- 主节点(Master):负责处理所有写操作,并将数据变更同步到从节点。
- 从节点(Slave):复制主节点的数据,并可以处理读操作。从节点不处理写操作,只负责读取和备份数据。
2. 主从复制的配置
- 主节点配置:通常不需要特殊配置,主节点默认接受所有客户端的读写请求。
- 从节点配置:从节点需要配置主节点的地址和端口,例如:
或者在配置文件中设置:slaveof <master-ip> <master-port>
slaveof 192.168.1.100 6379
3. 数据同步过程
- 全量复制(Full Resynchronization):
- 当从节点首次连接到主节点时,会进行全量复制。主节点生成一个 RDB 快照文件,并将其发送给从节点。
- 从节点接收并加载 RDB 文件,然后继续同步主节点的增量数据。
- 增量复制(Partial Resynchronization):
- 在全量复制完成后,主节点会将后续的数据变更(写操作)通过复制缓冲区(replication buffer)发送给从节点。
- 从节点接收并应用这些增量数据,保持与主节点的数据一致性。
4. 复制缓冲区
- 复制缓冲区(Replication Buffer):主节点维护一个复制缓冲区,用于存储最近的数据变更。从节点通过复制缓冲区接收增量数据。
- 复制积压缓冲区(Replication Backlog):主节点还维护一个复制积压缓冲区,用于在从节点断开连接后重新同步数据。
5. 使用场景
- 读写分离:适用于读多写少的场景,通过读写分离提高系统的读取性能。
- 数据备份:适用于需要数据冗余备份的场景,提高数据的可靠性和容错能力。
- 故障转移:适用于需要高可用性的场景,通过故障转移机制确保服务的连续性。
1)结构模式:一主一从、一主多从、主从从
2)主从复制工作原理(与MySQL的主从同步不同)
- ① Slave向Master发送sync命令;
- ② Master启动后台存盘进程,并收集所有修改数据命令;
- ③ Master完成后台存盘后,传送整个数据文件到Slave;
- ④ Slave接收数据文件,加载到内存中完成首次完全同步;
- ⑤ 后续有新数据产生时,Master继续收集数据修改命令一次传给Slave,完成同步;
1、一主一从结构示例:
实验网络拓扑:
步骤1:恢复redis1和redis2的redis默认配置
① 修改2个节点的配置文件,注释集群功能,并重启服务
## redis1
[root@redis1 ~]# vim /etc/redis/6379.conf
# cluster-enabled yes
# cluster-config-file nodes-6379.conf
# cluster-node-timeout 5000
[root@redis1 ~]# service redis_6379 stop //停止服务
Stopping ...
Redis stopped
[root@redis1 ~]# ls /var/lib/redis/6379/
dump.rdb nodes-6379.conf
[root@redis1 ~]# rm -f /var/lib/redis/6379/* //清除数据目录
[root@redis1 ~]# service redis_6379 start //启动服务
Starting Redis server...
## redis2
[root@redis2 ~]# vim /etc/redis/6379.conf
# cluster-enabled yes
# cluster-config-file nodes-6379.conf
# cluster-node-timeout 5000
[root@redis2 ~]# service redis_6379 stop //停止服务
Stopping ...
Redis stopped
[root@redis2 ~]# ls /var/lib/redis/6379/
dump.rdb nodes-6379.conf
[root@redis2 ~]# rm -f /var/lib/redis/6379/* //清除数据目录
[root@redis2 ~]# service redis_6379 start //启动服务
Starting Redis server...
步骤2:配置主从服务器
① 默认redis都是主服务器(无需配置)
[root@redis1 ~]# redis-cli
127.0.0.1:6379> INFO replication //查看主从复制信息
# Replication
role:master /角色为master主节点
connected_slaves:0
master_replid:fea1bd84c837c4968c506c4ef01df7bdb05ffa9f
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
② 配置redis2(192.168.1.12)为redis1的从服务器
- 方法1:通过命令进行配置(临时生效)
[root@redis2 ~]# redis-cli
127.0.0.1:6379> SLAVEOF 192.168.2.11 6379 //指定主服务器IP和端口
OK
127.0.0.1:6379> INFO replication //查看主从复制信息
# Replication
role:slave //角色为Slave从节点
master_host:192.168.2.11 //主节点IP地址
master_port:6379 //主节点端口
master_link_status:up //到主节点的连接状态
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fdeac0f68bb6295ace1c3d82ecc0512f011afb8f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
- 方法2:修改配置文件(永久生效),需要重启服务
[root@redis2 ~]# vim /etc/redis/6379.conf
#slaveof <ma