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 小时前
向量数据库Milvus的使用
数据库·milvus
闻哥3 小时前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
道亦无名4 小时前
aiPbMgrSendAck
java·网络·数据库
面向对象World6 小时前
正点原子Mini Linux 4.3寸800x480触摸屏gt115x驱动
linux·服务器·数据库
dinga198510267 小时前
mysql之联合索引
数据库·mysql
微风中的麦穗7 小时前
【SQL Server 2019】企业级数据库系统—数据库SQL Server 2019保姆级详细图文下载安装完全指南
大数据·数据库·sqlserver·云计算·个人开发·运维必备·sqlserver2019
zjttsh8 小时前
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
android·数据库·mysql
顾北128 小时前
SpringCloud 系列 04:Gateway 断言 / 过滤器 / 限流 一站式落地指南
java·开发语言·数据库
禹凕8 小时前
MYSQL——基础知识(NULL 值处理)
数据库·mysql
码云数智-大飞8 小时前
SQL Server 无法启动?常见原因及详细解决方法指南
数据库