为什么不建议生产用Redis主从模式?

Redis有三种集群模式,分别是主从、“哨兵”、Cluster集群模式,今天先来聊一下主从模式

Redis主从模式是最简单的一种集群模式,类似于MySQL等数据库的主从同步一样

为什么不建议生产用Redis主从模式?插图亿华云

Redis主从

原理

Redis实现主从复制(Master-Slave
Replication)的原理:Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令,Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中,此后Master主节点继续将所有已经收集到的修改命令,和新的修改命令一次传送给Slave,Slave将在本地执行这些数据修改命令,从而达到最终的数据同步。

如果Master和Slave之间的链接出现断链现象,Slave可以自动重连Master,但是在链接成功之后,一次完全同步将被自动执行

主从同步特点

一个master可以有多个slave一个slave只能有一个master数据流向是单向的,master到slave

主从优点

读写分离,提高效率数据热备份,提供多个副本slave同样可以接受其他slave的连接和同步请求,有效缓解master的同步压力master是以非阻塞的方式为slave提供同步服务,所以同步期间客户端仍然可以提供查询修改slave同样以非阻塞方式进行数据同步,同步期间,如果客户端发起查询请求,则slave返回同步前的数据

主从缺点

主节点故障后,集群则无法正常工作,无法提供高可用,从节点升主节点需要人工介入主节点单点容易造成性能下降主节点的存储能力受到限制主机宕机后,宕机前有部分数据未能及时同步到从机,会造成数据不一致,降低系统的可用性主从复制采用全量复制,复制的过程中会fork出子进程对内存做快照,并将子进程的内存快照保存为文件发送到从机,所以这个过程需要足够的内存主从复制的过程中,对网络要求很高,网络抖动会造成全量复制,对实际的系统运行造成很大的不稳定性全量同步可能会造成毫秒或者秒级的卡顿现象

主从同步完整执行流程

1.当slave第一次启动连接master,或者是“被认为是第一次连接”(如主从之间断链后重连),则主从采用全量复制的方式进行数据同步

2.从库定时任务每秒检查是否有新的master需要连接,如果发现就与master建立socket连接

3.从库(slave)发送ping指令到master,master返回pong,则连接正常

4.从库(slave)发送auth认证信息给master,验证requirepass

5.认证通过后,从库(slave)发送sync命令给master请求数据同步

6.master接收到同步请求后向slave发送run_id和offset

7.slave会接收并保存master发过来的信息

8.master执行bgsave命令生成RDB文件,期间会创建复制缓冲区记录从现在开始执行的所有写命令

9.master向slave发送RDB数据,然后发送复制缓冲区记录的数据,slave会将RDB和缓冲区数据存放到磁盘中

10.slave清空原有数据,最后将磁盘中接收到的数据导入内存中

11.后续master收到的写命令都会通过之前建立的主从连接,增量发送给slave端

主从搭建实践

CentOS7默认源是安装Redis3.2版本的,先来看下3.x版本的Redis主从

# 安装redis

yum -y install redis

# 配置主redis

vim /etc/redis.conf

bind 172.22.29.87

protected-mode yes

port 6379

daemonize yes

pidfile /var/run/redis_6379.pid

loglevel notice

logfile /var/log/redis/redis.log

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /var/lib/redis

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

requirepass 123456

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

# 配置从redis

bind 172.22.29.88

protected-mode yes

port 6379

pidfile /var/run/redis_6379.pid

loglevel notice

logfile /var/log/redis/redis.log

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /var/lib/redis

slaveof 172.22.29.87 6379

masterauth 123456

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

requirepass 123456

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec# 启动redis

systemct start redis

# 登录redis,查看主从信息

redis-cli -h 172.22.29.87

172.22.29.87:6379

THE END
Copyright © 2024 亿华云