说明

  • Redis-11-Redis主从复制
  • 包含Redis主从复制的特点、注意事项、主从复制的原理、主从复制的模式、哨兵模式(sentinel)
  • 官方文档:https://redis.io/documentation
  • Redis命令参考:http://redisdoc.com/

核心概念

》Redis主从复制的特点?

  • 读写分离

    • Redis主从复制都是一主多从,要多主就需要集群实现
  • 容灾快速恢复

》本案例搭建环境描述

  • 本案例简单搭建一主二从
  • 在同一台机器中使用3个不同的端口模拟三个Redis服务
  • 原本的6379端口不受影响也不在本案例操作范围内

》注意事项

  • 主从复制中的从服务器默认只有读权限,一般也都是这样的

》主从复制的原理

  • 从服务启动后,向主服务发送数据同步请求
  • 主服务收到从服务同步请求后,将数据持久化到rdb,然后将rdb文件发送给从服务(全量复制)
  • 从服务收到主服务发送过来的rdb后,以之进行数据初始化
  • 后续主服务所有写操作,主服务都会同步发送给从服务(增量复制)

》主从复制的模式

  • 一主多从

    • 基本模式,一个主服务剩下的全部作为从服务
  • 薪火相传
    • 一代一代往下继承,比如:A <- B <- C
  • 反客为主
    • 当主服务挂掉后,可以将从服务设置为主服务,但是只能通过动态命令实现,无法通过修改配置方式实现。要实现自动需要结合下面的哨兵模式
    • 命令:127.0.0.1:6382> slaveof no one

》哨兵模式(sentinel)

  • 什么是哨兵模式?

    • 反客为主的自动版
  • 哨兵模式的原理?
    • 启动一个服务专门用来监听Redis,该服务由Redis官方提供,与redis-server同级目录
    • 当监控到主机挂掉以后,会自动切换一台从服务为主服务,并把原先的主服务变为从服务,当原先的主服务启动后将会作为从服务
  • 选择从服务作为主服务的优先级判断条件
    • 根据从服务的配置文件:replica-priority 100,这个值越小优先级越高
    • 数据偏移量越大优先级越高(偏移量指数据同步最全的)
    • runid越小优先级越高
  • 哨兵模式结合代码使用?
    • 使用Redis连接池,连接哨兵模式配置文件中定义的IP、端口
    • 注意:连接的是哨兵服务,而不是Redis服务

操作步骤

》先正常开启三个Redis服务端

  • 新建目录:/root/redisSlave,并进入该目录
  • 在当前目录下创建数据存储目录:data
  • 将默认配置文件redis.conf复制一份到该目录
  • 新建三个配置文件:redis6381.conf、redis6382.conf、redis6383.conf
    [root@192 ~]# cd /root/redisSlave
    [root@192 redisSlave]# mkdir data
    [root@192 redisSlave]# ll
    total 76
    drwxr-xr-x 2 root root     6 Jan  9 17:55 data
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6381.conf
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6382.conf
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6383.conf
    -rw-r--r-- 1 root root 61813 Jan  9 17:21 redis.conf
    
    • 配置文件内容如下

      [root@192 redisSlave]# more redis6381.conf
      include ./redis.conf
      port 6381
      pidfile /var/run/redis6381.pid
      dbfilename dump6381.rdb
      dir ./data[root@192 redisSlave]# more redis6382.conf
      include ./redis.conf
      port 6382
      pidfile /var/run/redis6382.pid
      dbfilename dump6382.rdb
      dir ./data[root@192 redisSlave]# more redis6383.conf
      include ./redis.conf
      port 6383
      pidfile /var/run/redis6383.pid
      dbfilename dump6383.rdb
      dir ./data
      
  • 分别启动三个Redis服务
    # 启动6381
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6381.conf
    44407:C 09 Jan 2022 17:59:51.059 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44407:C 09 Jan 2022 17:59:51.060 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44407, just started
    44407:C 09 Jan 2022 17:59:51.060 # Configuration loaded# 启动6382
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6382.conf
    44429:C 09 Jan 2022 18:00:11.818 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44429:C 09 Jan 2022 18:00:11.818 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44429, just started
    44429:C 09 Jan 2022 18:00:11.818 # Configuration loaded# 启动6383
    [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6383.conf
    44437:C 09 Jan 2022 18:00:15.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    44437:C 09 Jan 2022 18:00:15.680 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44437, just started
    44437:C 09 Jan 2022 18:00:15.680 # Configuration loaded# 查看状态(6379是默认的,不用管)
    [root@192 redisSlave]# ps -ef |grep redis
    root       1845      1  0 Jan07 ?        00:05:39 /usr/local/redis/bin/redis-server *:6379
    root      44408      1  0 17:59 ?        00:00:00 /usr/local/redis/bin/redis-server *:6381
    root      44430      1  0 18:00 ?        00:00:00 /usr/local/redis/bin/redis-server *:6382
    root      44438      1  0 18:00 ?        00:00:00 /usr/local/redis/bin/redis-server *:6383
    root      44458   1803  0 18:00 pts/0    00:00:00 grep --color=auto redis
    
  • 使用客户端连接Redis服务进行测试,三个端口都能连接即可。
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381
    127.0.0.1:6381>
    
  • 查看主从复制信息,命令:info replication
    127.0.0.1:6381> info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:6c47a5c58d4b536ab60c65539b04e562686dec4c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    • role:master:表示本机作为主服务
    • connected_slaves:0:表示连接的从服务器数量

》绑定三个Redis服务,开启主从复制

》》实现方式一:动态命令(slaveof )绑定主从复制关系(适用于Redis没有密码的情况)

  • 分别在从服务器上执行以下命令进行绑定(以6382为例)

    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382
    127.0.0.1:6382> slaveof 192.168.3.241 6381
    OK
    
  • 注意:这种方式,如果重启从服务,那么原先配置的主从复制关系就失效了
  • 注意:重启主服务,原先的主从复制关系不变

》》实现方式二:修改配置文件绑定主从复制关系(适用于Redis有密码情况)

  • 分别修改从服务器配置文件(以6382为例)

    [root@192 redisSlave]# cat redis6382.conf
    include ./redis.confport 6382
    pidfile /var/run/redis6382.pid
    dbfilename dump6382.rdb
    dir ./data# 主从复制关联主服务器IP和端口
    replicaof 192.168.3.241 6381
    # 主从复制关联主服务器Redis密码
    masterauth 123456
  • 修改完重启Redis服务,查看主从复制信息
    # 连接主服务器,并查看
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381
    127.0.0.1:6381> auth 123456
    OK
    127.0.0.1:6381> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.3.241,port=6382,state=online,offset=56,lag=1
    slave1:ip=192.168.3.241,port=6383,state=online,offset=56,lag=1
    master_replid:be633cdf584be908844294ddf2a67cfbb2217db7
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:56
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:56# 连接从服务器,并查看(以6382为例)
    [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382
    127.0.0.1:6382> auth 123456
    OK
    127.0.0.1:6382> info replication
    # Replication
    role:slave
    master_host:192.168.3.241
    master_port:6381
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:1134
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:be633cdf584be908844294ddf2a67cfbb2217db7
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1134
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:1134
    
  • 注意:这种方式,重启从服务,依旧是原先的主从复制关系,因为配置文件是重新加载了
  • 注意:重启主服务,原先的主从复制关系不变

》开启哨兵模式

  • 新建哨兵配置文件:sentinel.conf

    [root@192 redisSlave]# ll
    total 80
    drwxr-xr-x 2 root root    66 Jan 10 12:47 data
    -rw-r--r-- 1 root root   103 Jan  9 17:53 redis6381.conf
    -rw-r--r-- 1 root root   209 Jan 10 02:03 redis6382.conf
    -rw-r--r-- 1 root root   209 Jan 10 02:03 redis6383.conf
    -rw-r--r-- 1 root root 61813 Jan  9 17:21 redis.conf
    -rw-r--r-- 1 root root    45 Jan 10 16:07 sentinel.conf# 配置文件内容如下
    [root@192 redisSlave]# cat sentinel.conf
    # 哨兵监控主机信息
    sentinel monitor myMaster 192.168.3.241 6381 1
    # 哨兵监控主机的密码(如果没密码忽略这行)
    sentinel auth-pass myMaster 123456
    # 哨兵服务后台启动(配置稳定后可以开启后台)
    # daemonize yes
    • 配置文件说明:

      • sentinel monitor <主机别名> <端口> <至少几个哨兵同意迁移>
      • sentinel auth-pass <主机别名> <密码>
  • 启动一个哨兵服务

    [root@192 redisSlave]# /usr/local/redis/bin/redis-sentinel ./sentinel.conf
    79386:X 10 Jan 2022 16:48:13.552 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    79386:X 10 Jan 2022 16:48:13.552 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=79386, just started
    79386:X 10 Jan 2022 16:48:13.552 # Configuration loaded
    ......
    79386:X 10 Jan 2022 16:48:13.553 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    79386:X 10 Jan 2022 16:48:13.555 # Sentinel ID is 431ce25764c7cac5f9504729c89c3eff496ba4b3
    79386:X 10 Jan 2022 16:48:13.555 # +monitor master myMaster 192.168.3.241 6381 quorum 1
    79386:X 10 Jan 2022 16:48:13.556 * +slave slave 192.168.3.241:6383 192.168.3.241 6383 @ myMaster 192.168.3.241 6381
    79386:X 10 Jan 2022 16:48:13.557 * +slave slave 192.168.3.241:6382 192.168.3.241 6382 @ myMaster 192.168.3.241 6381
    
    • 通过哨兵服务的启动日志,你可以清晰的看到主从复制服务信息
  • 当你启动哨兵服务以后,哨兵服务会自动重写你的配置文件,就像下边这样:

    [root@192 redisSlave]# cat sentinel.conf
    sentinel myid b28d162eff8336dbd397caf6e4d5521ea5fcb925
    sentinel deny-scripts-reconfig yes
    daemonize yes# Generated by CONFIG REWRITE
    port 26379
    dir "/root/redisSlave"
    protected-mode no
    sentinel monitor myMaster 192.168.3.241 6381 1
    sentinel auth-pass myMaster 123456
    sentinel config-epoch myMaster 0
    sentinel leader-epoch myMaster 0
    sentinel known-replica myMaster 192.168.3.241 6382
    sentinel known-replica myMaster 192.168.3.241 6383
    

Redis-11-Redis主从复制相关推荐

  1. 【八股文】11 Redis

    1. 谈下你对 Redis 的了解? Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型 ...

  2. redis主从_Redis主从复制部署

    点击上方Java资料社区,选择"置顶公众号" 优质文章,第一时间送达 引言 如果您是初学Redis,建议先阅读上三篇文章"初识Redis"."spri ...

  3. php连接redis 主从复制,redis怎么进行主从复制

    redis主从复制同步实现的过程 1.从服务发送一个sync同步命令给主服务要求全量同步 (推荐学习:Redis视频教程) 2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bg ...

  4. Redis 实战之主从复制、高可用、分布式

    简介 本节内容基于 CentOS 7.4.1708,Redis 3.2.12 环境实验. Redis 是一个开源的高性能键值对数据库. 安装:yum install -y redis 特性: 高性能 ...

  5. Redis进阶之主从复制

    转载自  Redis进阶之主从复制 一.主从复制概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave):数据的复制 ...

  6. Redis 如何实现主从复制

    什么是主从复制(Master/Slave)? 我们的数据一般是存储在数据库中,为了保证数据的高可用,我们一般使用多台数据库服务器做集群.选中其中的一台作为主服务器(Master),其余的作为从服务器( ...

  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 11 Redis热点key大Value解决方案

    11 Redis热点key大Value解决方案 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引言 上期分析了<Redis 雪崩,穿透,击穿三连问>,看了我的分析后回答面试官肯定 ...

  8. Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步

    Linux企业化运维 实验所用系统为Redhat-rhel7.6. 目录 Linux企业化运维 Linux企业化运维--(7)redis服务之redis配置及主从复制.主从自动切换.集群.redis+ ...

  9. 深入学习 Redis 之第 1 篇 —— Docker 安装 Redis 并搭建主从复制集群

    环境要求:CentOS7 X64 位,Redis6.0+ 理论基础 1.什么是 Redis 的主从复制? Redis 的复制功能支持多个库之间的数据同步.一类是主库(master),另一类是从库(sl ...

  10. Redis集群-主从复制 作者哇塞大嘴好帥(哇塞大嘴好帅)

    1.Redis集群 - 主从复制 作者:哇塞大嘴好帥(哇塞大嘴好帅) 主从复制 1.概念 讲一台Redis服务器数据复制到其他Redis服务器.被复制的服务器叫做主节点,复制被复制的服务器数据叫做从节 ...

最新文章

  1. SAP PM 入门系列17 - IB03 显示设备BOM
  2. C++ Double Ended Queues(双向队列)
  3. python定义构造函数、包括颜色价格品牌_《Python编程与算法基础教程》(第二版),蒋洪宇,青松,第9章:课后练习,程序设计,版江红余,第九章,习题,答案...
  4. 塔拉 孤岛危机2_2月15日新作密集周Xbox游戏热度排行公布《Apex英雄》登顶《除暴战警3》战役模式名列前3...
  5. XML万能数据库设计
  6. c++ 数组初始化_C++入门篇(二十九),字符数组在内存中存储的情况
  7. 安卓中java或取上下文_android-Xposed:如何获取挂钩的应用程序的上下文?
  8. My interested stuff(2008-07-18)
  9. IPhone之NSXMLParser的使用
  10. php7.1 mysql_安装最新LAMP环境 (CentOS7+PHP7.1.5+Mysql5.7)
  11. vbs整人代码蓝屏_vbs整人程序大全
  12. visa卡号生成器 在线_AINLP公众号新增quot;彩虹屁生成器quot;
  13. 基于ESP-IDF环境的ESP32-C3开发
  14. 台式机计算机里所有文档都打不开,电脑里的所有word文档都打不开,如何处理掉?...
  15. 带你从头到尾梳理大图片加载OOM处理问题
  16. 华为服务器告警状态,华为RH2288H V5服务器CPU告警
  17. UE5 Gameplay 框架拆解
  18. hive静态与动态分区理解
  19. OpenGL中三原色对应的glcolor3f
  20. UCGUI使用外部字库芯片显示汉字

热门文章

  1. 【题型总结】势能线段树
  2. mdadm详细使用手册
  3. 关于Bentley MicroStation Design (V8)格式中的tag的处理
  4. 如何利用空闲玩转咸鱼
  5. TCP/IP协议之网络管理协议
  6. Linux | 玩客云 Armbian使用脚本根据温度调整CPU主频防止矿渣死机
  7. 羽毛球双打接发球常见问题集锦一
  8. [转载] 七龙珠第一部——第030话 神秘军团
  9. 【python教程入门学习】Python扑克牌21点游戏实例代码
  10. JAVA——银行存取款