0
点赞
收藏
分享

微信扫一扫

redis进阶:redis主从架构原理及搭建


0.引言

单节点redis可用性始终无法保障,用一句话来讲:说挂就挂。于是乎搭建高可用的redis服务的第一步,从节点诞生了,也就是redis的主从架构。

1. 概念

redis主从架构的原理是从节点(slave)从主节点(master)同步数据,主从节点保持数据的一致性。写操作只允许主节点执行,从节点专用于读操作,以此做到读写分离,查询效率的提升。

同时redis的主从架构还是redis集群的基础,具体我们会在后续演示,所以redis主从架构是高可用的第一步。

每个从节点只允许有一个主节点,一个主节点下可以有多个从节点。

1.1 redis主从同步类型

redis中主从同步分为全量同步和增量同步,从节点开启AOF就会进行全量同步,如果从节点宕机,再次启动时就会讲本机的数据清除,然后重新从主节点全量同步一遍。

从节点如果只开启了RDB,是会记录主节点的主机ID的。我们可以在rdb文件中看到这个ID,这样如果中间宕机了,再重启时,从节点只会同步宕机期间的增量数据

主从刚刚连接的时候,会进行全量同步;全量同步结束后,进行增量同步。如果增量同步失败,会再尝试全量同步

1.2 redis主从同步过程

在描述同步过程之前先要带大家理解一下思路,我们在传输数据时,因为数据本身还在不停的产生,所以我们肯定是从一个时间节点开始,传这个节点之前的所有数据,同时记录这个节点之后产生的增量数据,待全量数据传输完成后,再补上增量的数据,以此完成数据同步

redis的思路也如此:

1、从节点向主节点发送同步指令​​sync​

2、主节点收到​​sync​​​指令后,执行​​bgsave​​,生成rdb文件,并在一个缓冲区中记录从现在开始执行的写命令

3、主节点将生成的rdb发送给从节点,从节点收到后用它来同步数据历史的全量数据

4、之后主节点再将缓冲区内的写命令发送给从节点,从节点收到这些指令并执行,增量的数据写入完成

5、至此数据同步完成

redis进阶:redis主从架构原理及搭建_redis

2.搭建主从架构

1、首先需要安装redis,如果不知道如何安装的可以参考我之前的博文。这里我演示使用的是​​redis6.2.7​​。这里我准备了两个节点,一主一从

​​mac for m1(arm):安装redis的四种方式​​

2、创建日志文件夹

mkdir -p /var/local/redis/logs

3、修改主节点redis配置文件,redis配置文件默认在redis安装目录下,这里我已经复制到​​/etc/redis/6379.conf​​了

vim /etc/redis/6379.conf

修改内容:

# 开启守护进程
daemonize yes
# 设置日志目录
logfile /var/local/redis/logs/6379.log
# 开启AOF持久化功能
appendonly yes

注:vim指令中,​​/​​加关键字可搜索指定内容

redis进阶:redis主从架构原理及搭建_redis_02

4、启动主节点,这里我已经将​​redis_init_script​​​脚本复制到​​/etc/init.d​​​文件夹下并命令为redis了,所以可以直接使用​​server redis​​的形式启动。具体配置参照上述安装redis的文章

service redis start

如果没有配置的,请使用​​redis-server /etc/redis/6379.conf​​命令启动

5、修改从节点redis配置文件

# 开启守护进程
daemonize yes
# 指定日志
logfile /var/local/redis/logs/6379.log
# 开启AOF持久化功能
appendonly yes
# 指定主节点
replicaof 192.168.244.27 6379

6、启动从节点

7、查看主节点日志

tail -n 100 -f /var/local/redis/logs/6379.log

redis进阶:redis主从架构原理及搭建_数据库_03

可以看到日志中已经显示了从节点的连接信息

我们通过日志也可以佐证主从同步步骤:

# 1. 从节点发起sync指令
2060:M 31 Oct 2022 04:53:50.282 * Replica 192.168.244.28:6379 asks for synchronization
2060:M 31 Oct 2022 04:53:50.282 * Full resync requested by replica 192.168.244.28:6379
2060:M 31 Oct 2022 04:53:50.282 * Replication backlog created, my new replication IDs are '9f8bdcdd700a79fa84442284b3ad7e4fff9209ab' and '0000000000000000000000000000000000000000'
# 2. 主节点执行BGSAVE指令
2060:M 31 Oct 2022 04:53:50.282 * Starting BGSAVE for SYNC with target: disk
2060:M 31 Oct 2022 04:53:50.282 * Background saving started by pid 2072
# 数据保存到磁盘
2072:C 31 Oct 2022 04:53:50.283 * DB saved on disk
2072:C 31 Oct 2022 04:53:50.283 * RDB: 0 MB of memory used by copy-on-write
2060:M 31 Oct 2022 04:53:50.327 * Background saving terminated with success
# 同步成功
2060:M 31 Oct 2022 04:53:50.327 * Synchronization with replica 192.168.244.28:6379 succeeded

测试

1、我们连接主节点,并且写入一个key

redis进阶:redis主从架构原理及搭建_数据库_04

2、再连接从节点,查看key

redis进阶:redis主从架构原理及搭建_数据_05

如此可证明主从数据同步成功

3、我们尝试在从节点写入一个key

redis进阶:redis主从架构原理及搭建_数据_06

会发现报错了,这是因为从节点不允许写入数据

总结

至此,我们的主从架构就搭建完成了,实际上我们只需要一个​​replicaof 主节点IP 端口​​就能实现主从同步,非常简单。

需要注意的是,实际操作过程中注意开启对应的redis端口或者关闭防火墙(生产环境不建议关闭)

下期继续带大家实操redis哨兵模式


举报

相关推荐

0 条评论