主从复制介绍:
什么是主从复制?

为什么要使用主从复制?
-
redis-server单点故障(避免单节点服务挂掉导致不能使用)
-
单节点QPS有限(性能瓶颈)
主从复制应用场景分析:
-
读写分离场景,规避redis单机瓶颈
-
故障切换,master出问题后还有slave节点可以使用
搭建主从复制
主Redis服务以普通模式启动,主要是启动从服务器的方式
1、第一种方式:命令行
#连接需要实现从节点的redis,执行下面的命令
slaveof [ip] [port]
2、第二种方式:redis.conf配置文件
#配置文件中增加
slaveof [ip] [port]
#从服务器是否只读(默认yes)
slave-read-only yes
退出主从集群的方式,命令:
Slaveof no one
启动之前先保证
-
防火墙已经关闭:systemctl stop firewalld.service
-
redis.conf文件中配置:
#这里设置为:bind 0.0.0.0 或者是对应从服务器的IP地址,除非测试,最好不要对外开放是任何IP,因为之前Redis暴漏过很多安全漏洞
bind 0.0.0.0
演示第一种搭建,命令行主从复制:
两台服务器安装Redis并启动

从服务器执行命令,连接主服务器,并测试数据

演示第二种搭建,配置文件设置主从复制:
在redis.conf配置文件加上主服务器的IP和端口,保存后重启Redis服务

重启从服务器后就会自动连接,下面是测试数据

检查主从是否正常,通过info命令查看Redis监控信息,其中包括主从复制内容 Replication
可通过命令:查看主从服务器的状态
info replication

在国外,新版本主从配置,slaveof会逐渐更新为replicaof命令,因为文化差异,slaveof他们认为是奴隶的意思,后续版本需要注意主从配置命令。

主从复制流程:

-
从服务器通过psync(partial synchronizeation)命令发送主服务器已有的同步速度(同步源ID、同步速度offset)
-
master收到请求,同步源为当前master,则根据偏移量增量同步
-
同步源非当前master,则进入全量同步:master生成rdb,传输到slave,加载到slave内存
主从复制核心知识:
-
Redis默认使用异步服饰,slave和master之间异步的确认处理的数据量。
-
一个master可以拥有多个slave。
-
slave可以接受其他slave的连接。slave可以有下级sub slave
-
主从同步过程在master侧是非阻塞的。
-
slave初次同步需要删除旧数据,加载新数据,会阻塞到来的连接请求。

主从复制应用场景:
-
主从复制可以用来支持读写分离
-
slave服务设定为只读,可以用于在数据安全的场景下(只有主服务能新增修改)
-
可以使用主从复制来避免master持久化造成的开销。master关闭持久化,slave配置为不定期保存或者启用AOF。(注意:重新启动的master程序将从一个空数据集开始,如果一个slave试图与它同步,那么这个slave也会被清空。)

主从复制的注意事项:
读写分离场景:
-
数据复制延时导致读到过期数据或者读不到数据(网络原因、slave阻塞)
-
从节点故障(多个client如何迁移)
全量复制情况下:
-
第一次建立主从关系或者runid(同步源ID)不匹配会导致全量复制
-
故障转移的时候也会出现全量复制
复制风暴:
-
master故障重启,如果slave节点较多,所有slave都要复制,对服务器的性能,网络的压力都有很大影响。
-
如果一个机器部署了多个master
写能力有限:
-
主从复制还是只有一台master,提供的写服务能力有限
master故障情况下:
-
如果是master无持久化,slave开启持久化来保留数据的场景,建议不要配置redis自动重启。
-
启动redis自动重启,master启动后,无备份数据,可能导致集群数据丢失的情况。(解决方案:1、把从服务器持久化文件《dump.rdb》复制一份到master后重启。2、不要使用自动重启,故障后以从服务器作为matser服务继续使用)
带有效期的key:
-
slave不会让key过期,而是等待master让key过期
-
在Lua脚本执行期间,不执行认可key过期操作
java代码是通过info命令,查看Replication集群信息,根据哪些是主从服务器,进行写、读操作。