Redis主从搭建
Redis主从
搭建Redis的主从架构
主从节点可以实现读写分离,将都大量的读操作分担与诸多从节点当中去
从节点可以叫做slave
或者replica
如何搭建:
在一台Linux虚拟机上开启三个Redis实例,端口不同
- 首先在
/tmp
目录下创建三个目录对应三个不同的端口,这里创建7001,7002,7003
- 将之前的redis下载目录下的
redis.conf
文件分别拷贝到上述创建的三个目录中
拷贝可以使用命令:echo 7001 7002 7003 | xargs -t -n 1 cp redis-7.0.15/redis.conf
进行拷贝也可以使用cp
命令
- 执行命令
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
修改每个文件夹的配置文件,将端口分别修改为7001,7002,7003,将RDB文件保存位置都修改为自己所在目录(在/tmp文件中执行该命令) - 修改每个实例的声明ip,为每个配置文件中指定每一个实例的绑定ip信息
在配置文件中插入replica-announce-ip 192.168.75.135
或者在命令行执行sed -i '1a replica-announce-ip 192.168.75.135' 7001/redis.conf
三个文件都使用该命令进行一遍配置
或者三个命令一键修改printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i 'la replica-announce-ip 192.168.150.101' {}/redis.conf
- 配置三个节点的主从关系通过
replicaof
或者slaveof
来实现
- 设置主从关系
永久生效的主从关系:
在redis.conf中添加一行配置:slaveof <masterip> <masterport>
临时生效的主从关系:
在cli客户端使用命令slaveof <masterip> <masterport>
(重启后失效)
redis-cli -p 7002
:连接7002
slaveof 192.168.75.135 7001
数据全同步原理
其中repl_baklog
:是一个缓冲区
- master如何判断slave是不是第一次来同步数据
- Replication id:数据集的标识,id一致则说明是同一数据集,每一个master都有唯一的id,slave则会继承master节点的id
- Offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大,slave完成同步也会记录当前的offset,如果offset小于master的offset,则说明需要更新
通过传过来的id进行判断,如果id不同则证明是第一次传输
数据的增量同步
主从第一次同步是全量同步,但是如果slave重启后同步,则执行增量同步
slave返回的offset中记录了返回来的在backlog中读取到了哪里,baklog将后边的数据返回
注意:repl_baklog中的存储是进行环形存储的,slave与master一直在环形存储内进行增量同步
这个时候如果redis从节点宕机当他醒过来之后,master已经转了一圈了上一圈的数据被覆盖掉,slave就只能进行全量同步了
优化Redis主从集群
- 在master中配置repl_diskless_sync yes 启用无磁盘复制,避免全量同步时的磁盘IO
- Redis单节点上的内存占用不要太大,减少RDB导致过多磁盘IO
- 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
- 限制一个master上的slave节点数量,如果实在太多slave,则可以采用主-从-从链式结构,减少master压力