Redis 主从复制

  • 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器,前者称为主节点,后者称为从节点
  • 一个主节点可以有零个或多个从节点,但每个从节点只能有一个主节点
  • 数据的复制是单向的,只能由主节点复制到从节点
  • 从节点仅仅用来同步数据,不能用于顶替宕机的主节点
  • 主从服务器之间采用的是「读写分离」的方式,主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令

开启主从复制

以 Ubuntu 18.04.5,redis-7.0.4 为例,准备三台机器并修改配置,这里以一台机器的三个端口作演示,分别是 6379、6380、6381,对应主节点、从节点一、从节点二

我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令,形成主服务器和从服务器的关系

比如,分别在从节点一、从节点二执行下面这条命令:

#replicaof <主节点的ip地址> <主节点的redis端口号>
replicaof 127.0.0.1 6379
</主节点的redis端口号></主节点的ip地址>

也可以修改从节点一、从节点二的配置文件

从节点一配置

slave1
port 6380
replicaof <masterip> <masterport> &#x5206;&#x522B;&#x5BF9;&#x5E94;&#x4E3B;&#x8282;&#x70B9;&#x7684;ip&#x548C;port
replicaof 127.0.0.1 6379
</masterport></masterip>

从节点二配置

slave2
port 6381
replicaof <masterip> <masterport> &#x5206;&#x522B;&#x5BF9;&#x5E94;&#x4E3B;&#x8282;&#x70B9;&#x7684;ip&#x548C;port
replicaof 127.0.0.1 6379
</masterport></masterip>

然后分别进入三个节点的目录,启动 redis

/redis/master/redis-server redis.conf
/redis/slave1/redis-server redis.conf
/redis/slave2/redis-server redis.conf

其他配置

设置master的密码(如果master用requirepass指定了密码)
masterauth
设置指定的master用户,可以用该项为slave指定一个特定用户用于同步
masteruser
当slave失去与master的连接,或者数据同步正在进行时,slave的行为有两种可能:
yes(默认):slave会继续响应客户端请求,可能会返回过期数据或空数据
no:slave将对所有数据访问命令返回指定错误信息,除了以下命令:
INFO, REPLICAOF, AUTH, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,HOST and LATENCY
replica-serve-stale-data yes
设置slave是否接受写操作,可写的slave实例可能对存储临时数据比较有用(因为写入salve的数据在同master同步后很容易被删除)
但如果客户端由于配置错误而向其写入数据,也可能会导致问题,所以默认不接受写操作
replica-read-only yes
数据同步策略:磁盘或socket,默认使用socket
新创建的slave和重新连接的slave只能执行"完全同步",即将RDB文件从master传输到副本
可能发生的传输方式有两种:
磁盘备份:master创建一个用于将RDB文件写入磁盘的进程,完成之后将RDB文件传输给slave
socket:master创建一个新的进程,直接将RDB文件写入副本套接字
使用磁盘方式,所有slave可以共享生成的RDB文件,而使用socket方式,所有salve必须排队等候传输
绝大多数情况下,磁盘速度比网络慢
repl-diskless-sync yes
如果开启socket方式,可以配置延迟时间,以等待master创建子进程,从而并行的通过socket传输
默认值为5秒,设置为0秒则为无延迟,必须等当前传输完成才能继续下一个
repl-diskless-sync-delay 5
如果开启socket方式,可以配置最大连接salve数,当连接的slave数量达到最大值时将开始传输,不需要等到延迟时间结束
设置为0则为不限制,延迟时间结束才开始传输
repl-diskless-sync-max-replicas 0
如果使用socket方式,当slave收到master的rdb文件时有三种选择:
disabled:将rdb文件存储到磁盘,等全部接收以后加载到内存
on-empty-db:接受所有rdb文件到内存中,然后直接解析该rdb文件
swapdb:先拷贝当前数据到内存,当来自master的rdb文件解析成功以后再删除掉拷贝,不成功则恢复,这能避免数据丢失,但需要相当大的内存,有可能导致OOM
repl-diskless-load disabled
master每隔一段时间slave发送ping,默认值为10秒
repl-ping-replica-period 10
超时时间,适用于三种场景:
1.同步期间的大容量传输I/O
2.master认为slave超时
3.slave认为master超时
注意超时时间必须大于repl-ping-replica-period设置的时间间隔,默认60s
repl-timeout 60
是否设置主从之间tcp链接为nodelay
如果设置为yes,Redis将使用较少的带宽将数据复制到副本,这可能会增加数据在副本的延迟
如果设置为no,Redis将更多带宽将用于复制,数据在副本的延迟减少
repl-disable-tcp-nodelay no
设置复制缓冲区的大小
如果slave断开连接,当slave再次连接时,通常不需要重新同步所有数据,只需要重新同步slave断开时丢失的部分数据即可
缓冲区越大,副本所能承受的断开时间就越长
只有在master至少连接了一个slave时,才会使用缓冲区
repl-backlog-size 1mb
如果一段时间后master没有连接的slave,那么缓存将被释放,下面选项配置释放缓冲的时间
注意,slave不会释缓冲,因为slave随时可能升级为master,并且与其他slave重新同步数据
如果设置为0表示永不释放
repl-backlog-ttl 3600
Redis哨兵机制会根据优先级来选择要升级为master的slave,优先级较低的slave被认为更适合升级
如果优先级设置为0表示无法升级
默认情况下,优先级为100
replica-priority 100
从master同步数据或者从aof读取数据时可能会出错,造成数据不一致
默认设置ignore,表示忽略错误继续执行命令(旧版redis可能会复制持久化在未来版本中可能会出错的命令)
设置为panic或panic-on-replicas,出现错误则抛出异常
propagation-error-behavior ignore
默认为no,表示当slave无法将从master收到的写命令持久化时,将抛出异常
不建议修改默认值,但为了兼容老版本redis可以设置yes,这只会记录一个警告日志并执行收到的写命令
replica-ignore-disk-write-errors no
设置是否公布该副本,默认情况,哨兵会公布所有副本
副本可以从哨兵的公告中移除,一个未公布的副本会忽略"sentinel replicas "命令并且不会暴露给哨兵的客户端
该项不影响replica-priority优先级设置
replica-announced yes
以下两个设置通常联合使用,用于设定slave(在线且延迟不超过指定秒数,延迟从最后一次收到slave的ping计算,slave通常每秒一次ping)数量少于某个值时master停止将写操作
任何一个设置为0都可关闭该功能
默认min-replicas-to-write为0,功能是关闭的,min-replicas-max-lag是10
min-replicas-to-write 3
min-replicas-max-lag 10
master有多种方式展示slave的ip和port列表,例如"INFO replication"命令,master的"ROLE"命令
在使用端口转发或者NAT时,副本可能会使用多个不同的ip和port
以下两个设置可以明确的将slave的ip和prt报告给master
如果只需要覆盖port或IP地址,可以不需要同时设置这两个选项
replica-announce-ip 5.5.5.5
replica-announce-port 1234

参考文章

Original: https://www.cnblogs.com/Yee-Q/p/16607538.html
Author: 低吟不作语
Title: Redis 主从复制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587071/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 图解|用好MySQL索引,你需要知道的一些事情

    我是蝉沐风。 这一篇文章来聊一聊如何用好MySQL索引。 为了更好地进行解释,我创建了一个存储引擎为InnoDB的表 user_innodb,并批量初始化了500W+条数据。包含主…

    Java 2023年6月7日
    0100
  • CSharp: Abstract Factory in donet core 3

    csharp;gutter:true; /// /// Abstract Factory抽像工厂 /// geovindu,Geovin Du eidt /// public in…

    Java 2023年6月16日
    078
  • volatile关键字理解

    volatile是一个轻量级的同步机制,相比传统的锁(如synchronized),在性能上面是有优势的,但是虚拟机对锁有过优化,所以很难确切的说volatile比synchron…

    Java 2023年6月5日
    094
  • Spring 常见面试题

    Spring 常见面试题 Spring 常见面试题 Spring 八股文 说说你对Spring的理解? 你觉得Spring的核心是什么? 说一下Spring的优势? Spring是…

    Java 2023年5月30日
    093
  • mybatis的mapper特殊字符转移以及动态SQL条件查询

    前言 我们知道在项目开发中之前使用数据库查询,都是基于 jdbc,进行连接查询,然后是高级一点 jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,…

    Java 2023年6月13日
    090
  • [Java/Jdbc]ResultSet对象的setFetchSize对于大批量数据读取的显著提速作用

    在笔者一段程序中有这样的代码: 这段代码及配套代码处理1300万行含21字段10字段需脱敏的表需要约20分。 当加入rs.setFetchSize(10000)后代码是这样: 只加…

    Java 2023年5月29日
    097
  • MySQL七:一文详解六大日志

    转载~ 日志一般分为逻辑日志与物理日志两类 「逻辑日志」:即执行过的事务中的sql语句,执行的sql语句(增删改) 「反向」的信息 「物理日志」: mysql 数据最终是保存在数据…

    Java 2023年6月8日
    0102
  • 11、查看线程状态

    11、线程状态 package com.testthread1; public class TestThread { public static void main(String[…

    Java 2023年6月8日
    097
  • 题目:完成网站的咨询聊天(UDP)

    题目:完成网站的咨询聊天(UDP) 学生端: package com.gao.Project.Pro6; import java.io.IOException; import ja…

    Java 2023年6月5日
    093
  • DM5加密的工具类

    代码: import org.springframework.security.crypto.password.PasswordEncoder; import java.math….

    Java 2023年6月13日
    083
  • SQLyog 13.1.1.0注册码证书秘钥

    注册信息:Name:(用户名随意) License Key: Professional: 8e053a86-cdd3-48ed-b5fe-94c51b3d343cEnterpris…

    Java 2023年6月9日
    0127
  • MySQL中Join和inner join的区别,以及left join、right join之间的区别

    点击阅读 本文来自博客园,作者:一个程序员的成长,转载请注明原文链接:https://www.cnblogs.com/bingfengdada/p/15539727.html Or…

    Java 2023年6月5日
    069
  • Java多线程

    进程是程序的依次执行过程,线程是比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程,多个线程共享进程的堆和方法区内存资源。 1.进程和线程 程序是含有指令和数据的文件,…

    Java 2023年6月9日
    081
  • Mysql索引数据结构详解(1)

    慢查询解决:使用索引 索引是帮助Mysql高效获取数据的排好序的数据结构 常见的存储数据结构: 二叉树不适合单边增长的数据 红黑树会自动平衡父节点两边的节点数 Mysql底层用的是…

    Java 2023年6月13日
    085
  • 服务监控 | 彻底搞懂Dropwizard Metrics一篇就够了

    Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各关键组件性能。 度量类型 Metrics提供了以下几种基本的度量类型:…

    Java 2023年6月6日
    0109
  • Vulnhub-CTF5靶机实战

    前言 靶机下载地址:CTF5靶机下载地址 KALI地址:192.168.10.73靶机地址:192.168.10.116 一.信息收集 1.主机发现 使用命令如下 netdisco…

    Java 2023年6月13日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球