Redis 的 主从复制

目录

[1 Redis 主从复制介绍](#1 Redis 主从复制介绍)

[2 Redis主从复制原理](#2 Redis主从复制原理)

[2.1 主从同步过程](#2.1 主从同步过程)

[3 Redis实现主从复制](#3 Redis实现主从复制)

[3.1 环境配置](#3.1 环境配置)

[3.2 修改各节点的配置文件](#3.2 修改各节点的配置文件)

[3.2.1 MASTER](#3.2.1 MASTER)

[3.2.2 SLAVE](#3.2.2 SLAVE)

[3.3.3 重启Redis](#3.3.3 重启Redis)

[3.3 查看是否实现了主从复制](#3.3 查看是否实现了主从复制)

[3.3.1 MASTER](#3.3.1 MASTER)

[3.3.2 SLAVE](#3.3.2 SLAVE)

[3.3.3 Redis 常用操作](#3.3.3 Redis 常用操作)

[3.3.4 数据添加查看效果](#3.3.4 数据添加查看效果)


1 Redis****主从复制介绍

随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主。

2 Redis主从复制原理

  • Redis 一般是使用一个 Master 节点来进行写操作,而若干个 Slave 节点进行读操作,Master 和 Slave 分别代表了一个个不同的 Redis Server 实例。

  • 定期的数据备份操作也是单独选择一个 Slave 去完成,这样可以最大程度发挥 Redis 的性能,为的是保证数据的弱一致性和最终一致性。

  • Master 和 Slave 的数据不是一定要即时同步的,但是在一段时间后 Master 和 Slave 的数据是趋于同步的,这就是最终一致性。

2.1 主从同步过程

  • slave节点发送同步请求到master节点

  • slave节点通过master节点的认证开始进行同步

  • master节点会开启bgsave进程发送内存rbd内存快照到slave节点,在此过程中是异步操作,也就是说

  • master节点仍然可以进行写入动作

  • slave节点收到rdb后首先清空自己的所有数据

  • slave节点加载rdb并进行数据恢复

  • 在master和slave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存

  • 然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave中

3 Redis实现主从复制

3.1 环境配置

节点名称 角色 IP地址
node1 MASTER 192.168.239.10
node2 SLAVE-1 192.168.239.20
node3 SLAVE-2 192.168.239.30

3.2 修改各****节点的配置文件

3.2.1 MASTER

bash 复制代码
[root@node-1 ~]# vim /etc/redis/redis.conf

bind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证

3.2.2 SLAVE

bash 复制代码
[root@node-2 ~]# vim /etc/redis/redis.conf

bind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379  # 向 MASTER 进行同步
bash 复制代码
[root@node-3 ~]# vim /etc/redis/redis.conf

bind * -::*        # 允许所有IP所有端口连接
protected-mode no  # 关闭安全模式即密码验证
replicaof 192.168.239.10 6379  # 向 MASTER 进行同步

3.3.3 重启Redis

bash 复制代码
[root@node-1 ~]# systemctl restart redis_6379.service 
[root@node-2 ~]# systemctl restart redis_6379.service 
[root@node-3 ~]# systemctl restart redis_6379.service 

3.3 查看是否实现了主从复制

3.3.1 MASTER

bash 复制代码
[root@node-1 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.239.30,port=6379,state=online,offset=0,lag=1
slave1:ip=192.168.239.20,port=6379,state=online,offset=0,lag=0
master_failover_state:no-failover
master_replid:6cae489b55bf61b8432df467e53d93081effc1ce
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

3.3.2 SLAVE

bash 复制代码
[root@node-2 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.239.10
master_port:6379
master_link_status:up

[root@node-3 ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.239.10
master_port:6379
master_link_status:up

3.3.3 Redis 常用操作

命令 功能
config get * 查看配置
select 1 选择数据库
flush db 清空当前数据库
flush all 清空所有数据库
move key 1 移动 key
del key 删除
rename oldkey newkey 改名
expire key 10 设置过期时间
persist key 设置持久化
keys user* 查询
exists key 判断是否存在

3.3.4 数据添加查看效果

MASTER

bash 复制代码
[root@node-1 ~]# redis-cli 
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set name shuyan
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"

SLAVE

bash 复制代码
[root@node-2 ~]# redis-cli 

127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"
bash 复制代码
[root@node-3 ~]# redis-cli 
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"shuyan"

从节点尝试写入数据

有一个疑问,从节点是否能写入数据呢?

下面拿node-2 来进行一个测试,实验结果很显然是不行的

结论:主从复制中,只能由主节点来对数据进行写入,而从节点是不能写入的。从节点只能查看不能添加数据,在收到主节点发送过来的rdb之后会清空自己的数据再进行同步。

相关推荐
敲代码的嘎仔3 分钟前
从零实现视频续播 + 学习进度统计:前端心跳、条件更新、GROUP BY 统计全链路拆解
java·前端·数据库·学习·面试·职场和发展·音视频
草莓熊Lotso6 分钟前
【Redis 初阶】C++ 客户端实战:从 RESP 协议到 redis-plus-plus 工程化用法
linux·开发语言·网络·数据库·c++·redis·缓存
dunge202626 分钟前
2026年9月11日|ChatGPT Pro + Codex:GPT‑6 Astra 数据库性能优化
数据库·gpt·chatgpt
NeilYuen28 分钟前
【kv存储】结合faiss构建向量内存数据库
数据库·faiss
风哥2号37 分钟前
数据库教程FGMT18‑Oracle‑EMCC智能化集中运维管理系统
运维·数据库·oracle
YHHLAI1 小时前
基于 Next.js 16 + Redis 的全栈笔记博客系统
javascript·redis·笔记
Zixhy3 小时前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
程序员清风10 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
天衍四九-10 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
尚久龙10 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql