> 文档中心 > 带你 “亲自体验“ Redis主从复制

带你 “亲自体验“ Redis主从复制



? Redis系列?:

?Redis安装教程(保姆级详细图文)
?布隆过滤器安装步骤
?小记一手 “Redis持久化机制”
?手把手带你实操 RDB & AOF)
?“Redis哨兵“一撸到底 ,贼爽~


Redis使用默认的异步复制,其特点是低延迟和高性能,是绝大多数 Redis 用例的自然复制模式。

在这里插入图片描述

咱们为了方便演示利用伪集群(跑在同一台机上)来操作

  • 创建3个Redis节点,端口号分别为637963806381

  • 进入Redis源码文件utils目录

    此路径为源码安装包解压后存放的Redis路径 ,请看Redis单机安装详细图文教程一文开头有介绍(建议按照教程装一个干净的环境,这样就可以跟着文章节奏一撸到底了,避免中途出现一些本文中没碰到的问题)

    cd soft/redis-6.0.6/utils/
  • 执行install_server.sh脚本

    ./install_server.sh 

    下方端口号如果不输入则默认为6379

    在这里插入图片描述

  • 重复以上操作直至创建好3个Redis节点

    在这里插入图片描述在这里插入图片描述

  • 在Home目录新建test目录

    mkdir testcd test/
  • 拷贝Redis所有节点的配置文件到当前目录

    cp /etc/redis/* ./
  • 修改配置文件

    为了方便观看日志,我们需要将Redis设置为前台服务形式,需要将daemonize配置关掉,将日志文件配置关掉,让日志显示在前台

    vi 6379.conf

    找到GENERAL模块,将daemonize yes改为daemonize no

    logfile /var/log/redis_6379.log配置注释掉#logfile /var/log/redis_6379.log

    img

    关闭AOF日志 找到APPEND ONLY MDOE模块,将appendonly yes改为appendonly no

    在这里插入图片描述

    ⚠️如果你想用远程工具连接用的话那得配置密码

    找到 bind 127.0.0.1 将这行注释掉,因为这里的bind指的是只有指定的网段才能访问这个redis 注释掉后,就没有这个限制了或者bind自己需要配置的网段 找到protected-mode 设置为no 在redis3.2.3版本后默认是设置成yes的,防止了远程访问 找到requirepass foobared将前面#号去掉,并将foobared改为自己的密码

    img带你 “亲自体验“ Redis主从复制

    如果设置了密码 那就需要将REPLICATION模块中的masterauth参数配置成主节点实例的密码,比如我们即将把6379实例做成主节点,6380节点和6381节点追加到6379节点作为从节点,那就在6380.conf6381.conf中将masterauth参数配置成6379实例的密码

    在这里插入图片描述

    修改完按Esc输入:wq保存并退出编辑

  • 修改6380.conf6381.conf重复上面操作修改即可

    vi 6380.conf vi 6381.conf 
  • 删除三个节点相应的持久化目录

    咱们图省事直接全删掉,然后再创建对应的三个目录即可

    rm -rf /var/lib/redis/*mkdir /var/lib/redis/6379mkdir /var/lib/redis/6380mkdir /var/lib/redis/6381

    检查一下是否成功清除相关文件,并重新创建对应目录

    ls -ll /var/lib/redis/
  • 启动三个Redis节点(建议开多个窗口方便观察与后续操作)

    redis-server ~/test/6379.confredis-server ~/test/6380.confredis-server ~/test/6381.conf

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

  • 启动3个节点的客户端

    再开3个窗口分别启动637963806381的客户端

    如果没有设置密码则直接redis-cli -p 端口号即可

    redis-cli -p 6379 -a 密码redis-cli -p 6380 -a 密码redis-cli -p 6381 -a 密码

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 主备节点设置

    先来了解一下SLAVEOF指令

    随便在那个节点的Redis客户端命令行输入help SLAVEOF

    127.0.0.1:6379> help SLAVEOF#v5.0以前用 SLAVEOF 主机 端口SLAVEOF host port#使服务器成为另一个节点的副本,或将其提升为主服务器。从Redis 5开始已弃用。使用REPLICAOF代替。#我们使用的是v6.0.6 那可以用 'REPLICAOF' 指令summary: Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead.since: 1.0.0group: server

    6380节点追加为6379节点的从节点

    127.0.0.1:6380> REPLICAOF localhost 6379OK

    查看6379节点日志输出内容

    在这里插入图片描述

    #副本127.0.0.1:6380请求同步Replica 127.0.0.1:6380 asks for synchronization#启动BGSAVE(后台落RDB)与目标:磁盘同步Starting BGSAVE for SYNC with target: disk#后台保存启动pid 29096Background saving started by pid 29096#DB保存在磁盘上DB saved on disk#RDB:写时拷贝占用4mb内存RDB: 4 MB of memory used by copy-on-write#成功结束后台保存Background saving terminated with success#同步副本127.0.0.1:6380成功Synchronization with replica 127.0.0.1:6380 succeeded

    查看6380节点日志输出内容

    在这里插入图片描述

    #连接到MASTER节点 127.0.0.1:6379Connecting to MASTER 127.0.0.1:6379#主节点开始向从节点同步MASTER <-> REPLICA sync: receiving 175 bytes from master to disk#删除从节点老数据MASTER <-> REPLICA sync: Flushing old data#在内存中加载DBMASTER <-> REPLICA sync: Loading DB in memory#RDB创建时占1.83 Mb内存RDB memory usage when created 1.83 Mb#主从同步成功MASTER <-> REPLICA sync: Finished with success
  • 主从同步测试

    分别在63796380客户端执行 keys * 命令

    目前两个节点中都是空的

    127.0.0.1:6379> keys *(empty array)
    127.0.0.1:6380> keys *(empty array)

    6379客户端进行set操作

    127.0.0.1:6379> set k1 aaaOK127.0.0.1:6379> keys *1) "k1"127.0.0.1:6379> get k1"aaa"

    6380客户端查看是否同步成功

    127.0.0.1:6380> keys *1) "k1"127.0.0.1:6380> get k1"aaa"

    在主从模式下,从节点是禁止写入的,我们尝试在从节点中进行set操作看是否能成功

    127.0.0.1:6380> set k2 aaa#不能对只读副本进行写操作(error) READONLY You can't write against a read only replica. 
  • 验证从节点同步前刷掉老数据

    我们还剩一个6381节点没有追随6379节点,我们先在6381节点中set一条数据

    127.0.0.1:6381> keys *(empty array)127.0.0.1:6381> set k2 aaaOK127.0.0.1:6381> keys *1) "k2"127.0.0.1:6381> get k2"aaa"

    6381节点追随6379节点

    127.0.0.1:6381> REPLICAOF 127.0.0.1 6379OK

    追随成功后,主节点会将数据同步到从节点,我们再来查看从节点数据,看看k2还在不在

    127.0.0.1:6381> keys *1) "k1"127.0.0.1:6381> get k1"aaa"

    老的k2数据已经不存在了,说明主从同步发生前,从节点会将老数据刷掉

    我们在来思考一个问题,如果这三个节点中,6381节点突然挂了,6379节点还在不断地写数据,在短时间内再将6381节点修复启动并直接追加为6379的从节点,会是怎样的结果?会做增量复制吗?

  • 6381节点停掉模拟挂掉

    往主节点6379中执行一批写操作

    127.0.0.1:6379> keys *1) "k1"127.0.0.1:6379> set k2 aaaOK127.0.0.1:6379> set k3 aaaOK127.0.0.1:6379> set k4 aaaOK127.0.0.1:6379> set k5 aaaOK127.0.0.1:6379> set k6 aaaOK127.0.0.1:6379> keys *1) "k6"2) "k1"3) "k5"4) "k3"5) "k2"6) "k4"

    这时6380是能正常同步到主节点的数据的,我们看一下是不是这样的

    127.0.0.1:6380> keys *1) "k2"2) "k4"3) "k5"4) "k6"5) "k1"6) "k3"
  • 6381节点修复启动并直接追加为6379的从节点

    redis-server ~/test/6381.conf --replicaof 127.0.0.1 6379

    查看6381节点是否能同步到增量的数据

    127.0.0.1:6381> keys *1) "k5"2) "k3"3) "k2"4) "k6"5) "k4"6) "k1"

    因此得到结论:从节点服务挂掉后,当从节点之前与主节点有过同步操作并且启动的时候直接追加为主节点的从节点,是可以触发增量复制的

  • 怎么切换主节点呢?

    假设6379挂了,我现在需要将6381追随到6380,将6380变为主节点

    首先6380节点取消追随6379节点

    127.0.0.1:6380> REPLICAOF no oneOK

    再将6381节点追随到6380节点

    127.0.0.1:6381> REPLICAOF 127.0.0.1 6380OK

    在这里插入图片描述

PS:我们既然可以从主节点那里知道有没有新节点追加进来同步数据,那是不是也可以得到结论:其实是可以从主节点知道有多少个从节点的。

是不是在感慨“终于搞完了主从复制~”,恭喜你,可以继续搞哨兵了 ~?