08、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、 至此数据同步完成;

 

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指令中,/加关键字可搜索指定内容

 

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

 

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

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

# 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;

 

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

 

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

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

 

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

总结

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

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

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