redis系列整体栏目
内容 | 链接地址 |
---|---|
【一】redis基本数据类型和使用场景 | https://zhenghuisheng.blog.csdn.net/article/details/142406325 |
【二】redis的持久化机制和原理 | https://zhenghuisheng.blog.csdn.net/article/details/142441756 |
【三】redis缓存穿透、缓存击穿、缓存雪崩 | https://zhenghuisheng.blog.csdn.net/article/details/142577507 |
【四】redisson实现分布式锁实战和源码剖析 | https://zhenghuisheng.blog.csdn.net/article/details/142646301 |
【五】redis保证和mysql数据一致性 | https://zhenghuisheng.blog.csdn.net/article/details/142687101 |
【六】redis的stream流实现消息中间件 | https://zhenghuisheng.blog.csdn.net/article/details/142721269 |
【七】redis实现主从复制架构和底层原理 | https://zhenghuisheng.blog.csdn.net/article/details/142734375 |
如需转载,请输入:https://blog.csdn.net/zhenghuishengq/article/details/142734375
redis实现主从复制架构和底层原理
- 一,redis的主从架构搭建
- 1,redis安装
- 2,配置redis主结点
- 3,配置redis从结点
- 4,主从结点的数据同步
- 5,主从架构底层原理
- 5.1,启动时的复制
- 5.2, 实时数据同步
- 5.3,断线重连后的同步
一,redis的主从架构搭建
在前面的文章中,讲解了redis的持久化,主要有rdb,aof以及混合持久化,因此有了这些持久化,就可以搭建出一套主从架构,对整个系统实现主从复制和读写分离的操作。其底层思想也简单,就是把持久化的文件拉取过来再次的执行一遍,和mysql的binlog原理是一样的。
1,redis安装
前面的文章是本人直接通过docker安装的单机版,如果用docker搭建集群就不太友好,因此手动的安装一下redis,服务器用的是centos7版本
首先下载安装包,和之前版本一样选择6.2.6版本,本人这里的安装路径放在 /usr/local/software/redis 下
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
随后执行解压操作,通过tar命令执行
tar -axvf redis-6.2.6.tar.gz
随后切入到redis的解压目录,执行 make 命令操作
make
在make完没问题之后,也可以通过以下命令测试是否真的成功,都会返回一些ok状态
sudo make test
最后执行安装命令
sudo make install
然后切入到这个安装目录下的src目录下,最后执行这个redis的客户端命令,然后测试是否可以执行成功
cd src
redis-cli
2,配置redis主结点
切回到上一级目录,将redis的配置文件cp到 /etc/redis中
cd ../
cp refid.conf /etc/redis
随后修改这个 /etc/redis 路径下的redis配置文件
cd /etc/redis
vim redis.conf
要修改的内容如下
port 6379
bind 0.0.0.0
daemonize yes
protected-mode no
随后为redis创建一个服务启动单元,方便服务的启动和管理
vim /etc/systemd/system/redis.service
将以下内容加入到这个配置文件中
[Unit]
Description=Redis In-Memory Data Store
After=network.target[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always[Install]
WantedBy=multi-user.target
然后将上面的资源重新加载一下
sudo systemctl daemon-reload
最后就可以直接通过系统命令来启动redis
sudo systemctl start redis
sudo systemctl enable redis
如果系统命令一直启动失败的话,可以直接通过客户端命令进行启动,这样也能启动redis服务
redis-server /etc/redis/redis.conf
启动完成之后,那么就可以在任意位置直接执行启动reids客户端的命令
redis-cli
3,配置redis从结点
上面已经完成了redis的安装,上面的这个结点就作为redis的主结点,接下来需要安装一个从结点。这里用的是同一台centos服务器机器,如果要在两台机器上面搭建这种架构,其原理也是一样的
首先拷贝一个redis配置文件的副本,作为redis从结点的配置文件
cp /etc/redis/redis.conf /etc/redis/redis-slave.conf
然后编辑这个配置文件,如以下配置,除了配置这些基础属性之外,还需要配置一个 slaveof 的配置,表示是谁的从结点,然后去拉取主结点对应的数据
port 6380
bind 0.0.0.0
daemonize yesslaveof 127.0.0.1 6379
随后启动这个从结点实例,直接将对应的配置文件启动即可
redis-server /etc/redis/redis-slave.conf
随后执行这个查看redis进程的命令,可以发现主节点6379和从结点6380均启动成功
ps -ef | grep redis
4,主从结点的数据同步
接下来开两个客户端窗口,一个主节点用来插入数据,一个从节点看是否能获取到数据
set zhenghuisheng:age 18
set zhenghuisheng:name zhs
可以发现6379端口的服务已经将数据插入成功
接下来直接看6380的端口,因为6380端口没有像6379那样加入了服务端管理,因此可以通过以下命令打开窗口
redis-cli -p 6380
然后直接获取主服务器设置的值,可以发现从服务器也将数据拿到,因此可以说明从服务器已经将主服务器的数据同步到本地
5,主从架构底层原理
5.1,启动时的复制
当从节点首次连接到主节点时,会进行以下步骤:
- 1,连接主节点: 从节点通过发送
SLAVEOF
命令连接到主节点,两端之间建立长连接。 - 2,主节点准备快照: 主节点接收到从节点的连接请求后,会暂停处理新的写请求,并通过bgsave异步的方式创建当前数据库的 RDB 快照文件。这个文件包含了当前所有数据的快照。
- 3,发送快照: 主节点将生成的 RDB 文件发送给从节点。
- 4,加载数据: 从节点接收到 RDB 文件后,会将其加载到自己的内存中,初始化数据状态。
- 5,恢复写操作: 主节点在完成快照生成后,继续处理写请求,开始发送数据变更。
5.2, 实时数据同步
在从节点成功加载 RDB 文件后,主从节点之间的实时数据同步开始:
- 1,主节点记录变更: 主节点在处理写请求时,会将操作记录到一个复制缓冲区(replication buffer)中。
- 2,发送命令到从节点: 主节点定期将缓冲区中的变更命令(如
SET
、DEL
等)发送给所有连接的从节点。这些命令包含了操作的类型和对应的键值。 - 3,从节点执行命令: 从节点接收到这些命令后,会立即执行,从而保持与主节点的数据一致性。
5.3,断线重连后的同步
如果主从节点之间的连接出现中断,Redis 也提供了相应的机制进行数据同步:
- 1,重连时的数据同步: 当从节点重新连接到主节点时,主节点会通过发送
PSYNC
命令请求数据同步。 - 全量同步与增量同步:
- 全量同步:如果从节点和主节点的连接中断时间较长,主节点会进行全量同步,重新发送 RDB 快照。
- 增量同步:如果断线时间较短且主从之间的复制偏移量未丢失,则可以进行增量同步。主节点会记录从节点的复制偏移量,通过这个偏移量将未发送的命令发送给从节点。