IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 带你 “亲自体验“ Redis主从复制 -> 正文阅读

[大数据]带你 “亲自体验“ 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 test
    
    cd 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 img

    如果设置了密码 那就需要将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/6379
    mkdir /var/lib/redis/6380
    mkdir /var/lib/redis/6381
    

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

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

    redis-server ~/test/6379.conf
    redis-server ~/test/6380.conf
    redis-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.0
    group: server
    

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

    127.0.0.1:6380> REPLICAOF localhost 6379
    OK
    

    查看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 29096
    Background 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:6379
    Connecting to MASTER 127.0.0.1:6379
    #主节点开始向从节点同步
    MASTER <-> REPLICA sync: receiving 175 bytes from master to disk
    #删除从节点老数据
    MASTER <-> REPLICA sync: Flushing old data
    #在内存中加载DB
    MASTER <-> 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 aaa
    OK
    127.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 aaa
    OK
    127.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 6379
    OK
    

    追随成功后,主节点会将数据同步到从节点,我们再来查看从节点数据,看看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 aaa
    OK
    127.0.0.1:6379> set k3 aaa
    OK
    127.0.0.1:6379> set k4 aaa
    OK
    127.0.0.1:6379> set k5 aaa
    OK
    127.0.0.1:6379> set k6 aaa
    OK
    127.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 one
    OK
    

    再将6381节点追随到6380节点

    127.0.0.1:6381> REPLICAOF 127.0.0.1 6380
    OK
    

    在这里插入图片描述

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

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:27:35  更:2022-03-16 22:32:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:23:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码