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之后会清空自己的数据再进行同步。

相关推荐
小羽网安1 小时前
从零开始学习 sql 注入,常见的 sql 注入解析
数据库·sql·学习
2401_846339562 小时前
CSS如何优化大型项目样式_使用SASS预处理器提升开发效率
jvm·数据库·python
ss2738 小时前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
l1t9 小时前
DeepSeek总结的数据库外部表
数据库
m0_674294649 小时前
如何编写SQL存储过程性能对比_记录执行时间评估优化效果
jvm·数据库·python
014-code9 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
运气好好的9 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
それども10 小时前
DELETE 和 TRUNCATE TABLE区别
java·数据库·mysql
wenha10 小时前
数据库隔离级别
数据库·mysql·sqlserver·隔离级别
2401_8714928510 小时前
Layui如何修改Layui默认的UI主题颜色(换肤功能实现)
jvm·数据库·python