redis复制_Redis复制

redis复制

本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 。

这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外,您还会在Redis命令行上乱七八糟。 接下来是更高级的主题,例如复制,分片和集群,同时还介绍了Redis与Spring Data的集成。 在这里查看 !

目录

1.简介 2.在Redis中复制 3.在Redis中配置基本复制 4.验证复制是否有效 5.在运行时配置复制 6.高级复制配置

1.简介

复制是任何面向数据的解决方案的一个非常重要的功能:复杂的关系数据库或简单的键/值存储。 复制使您可以将数据的许多副本分布在许多节点(服务器),数据中心和/或地理区域中。

复制是可靠的,可水平扩展和容错的系统的基础:一旦一个数据节点(服务器)发生故障,另一个就准备好服务具有故障节点的(大部分)最新数据的查询或请求。 更不用说能够在主节点和从节点(只读副本)之间有效地拆分写入和读取操作的功能。 一些有趣的软件系统模式基于此类决策,例如CQRS (命令查询责任分离)和复制缓存解决方案。

基本上有两个主要的复制类:

  • Master – Master (或Active – Active )和
  • Master – Slave (或Active – Passive )。

尽管Master – Master是自动故障转移的最佳选择,但它非常复杂,只有很少的数据解决方案。 在撰写本文时,Redis 2.8.4仅支持Master – Slave复制。

2.在Redis中复制

本部分的内容基于出色的Redis文档[1] 。 如前所述,Redis支持Master – Slave复制,该复制允许从服务器成为主服务器的精确副本。

有关Redis复制的一些事实:

  • Redis使用异步复制
  • Redis主服务器可以有多个从服务器
  • Redis从站可以接受来自其他从站的连接(级联复制)
  • Redis复制在主服务器端无阻塞:当一个或多个从服务器执行初始同步时,主服务器将继续处理查询
  • 可以将Redis复制配置为在从属端无阻塞:在从属端执行初始同步时,它可以使用旧版本的数据集处理查询(请参阅Advanced Replication Configuration , slave-serve-stale-data设置)

在几个建议的用例中,Redis复制可能非常方便。 首先,它可以用于具有多个从属服务器以进行只读查询或仅用于数据冗余。 其次,也可以使用复制来避免主服务器将整个数据集写入磁盘:从服务器可以配置为定期这样做。

另外,Redis 2.8中最近的一项非常重要的增强功能是:主服务器和从服务器通常能够继续复制过程,而无需在复制链接断开后进行完全重新同步。 实际上,这意味着,如果在主服务器和从服务器之间发生网络分区,则从服务器可以稍后通过获取丢失的更改集而不是整个数据集来追赶主服务器。

3.在Redis中配置基本复制

从站(或副本)配置非常简单,基本形式只需要在redis.conf文件中设置单个参数slaveof :主IP地址和端口。 值得一提的是,默认情况下,Redis从站以只读模式运行。 此行为由配置文件redis.confslave-read-only选项redis.conf ,可以在从属运行时使用CONFIG SET命令更改(请参考本教程的第2部分 : Redis命令–使用Redis命令行 ) 。 只读从站将拒绝所有写命令。

反过来,非只读从设备将接受写命令。 请注意,以这种方式写入从站的数据是短暂的,当从站和主站重新同步或重新启动从站时,这些数据将消失。

为了在实践中了解Redis复制配置有多么容易,我们将配置一个主服务器和两个从属服务器(副本)。 一个从属服务器(副本)将具有默认的只读模式(在下面的图片中用绿色标记),而另一个从属服务器(副本)将被配置为支持写操作,以便我们可以实际看到发生了什么。

图1. Redis主从拓扑

图1. Redis主从拓扑

对于主服务器和从服务器,我们将使用Redis发行版中的配置模板redis.conf(请参阅本教程的第1部分 , Redis安装–如何安装Redis )。

  1. 对于master ,只需将redis.conf复制到redis-master.conf
    cp redis.conf redis-master.conf

    并使用以下配置启动Redis服务器:

    redis-server redis-master.conf
    图2. Redis主服务器启动

    图2. Redis主服务器启动

  2. 对于slave(副本)1,只需将redis.conf复制到redis-slave1.conf
    cp redis.conf redis-slave1.conf

    并将以下配置设置添加到redis-slave1.conf (我们假设Redis master的主机名是master ):

    slaveof master 6379

    然后使用此配置启动Redis服务器,将默认端口覆盖为6380

    redis-server redis-slave1.conf --port 6380

    启动后,从站(副本)立即与主站同步(如下图所示)。

    图3. Redis从站(副本)1已启动(默认情况下处于只读模式),并立即与master同步

    图3. Redis从站(副本)1已启动(默认情况下处于只读模式),并立即与master同步

  3. 对于slave(副本)2,只需将redis.conf复制到redis-slave2.conf
    cp redis.conf redis-slave2.conf

    并将以下配置设置添加到redis-slave2.conf (我们假设Redis master的主机名是master ):

    slaveof master 6379

    slave-read-onlyyes (默认)更改为no ,从而有效地允许写入。

    slave-read-only no

    最后使用此配置启动Redis服务器,将默认端口替换为6381

    redis-server redis-slave2.conf --port 6381

    启动后,从站(副本)立即与主站同步(如下图所示)。

    图4. Redis从属服务器(副本)2已启动(读写模式)并立即与主服务器同步

    图4. Redis从属服务器(副本)2已启动(读写模式)并立即与主服务器同步

此时,我们有了一个拓扑,其中连接了一个Redis主服务器和两个Redis从属服务器(副本)。

4.验证复制是否有效

有两种简单的技术可以确认Redis复制是否按预期工作。 最简单的方法是在主服务器上SET一些密钥,然后在每个从服务器上对此密钥发出GET命令以查看它是否已复制。

图5.在主节点上设置密钥mykey

图5.在主节点上设置密钥mykey

图6a

图6a

图6b。在两个从节点上获取密钥mykey并验证是否复制了主节点上的更改

图6b。 在两个从节点上获取密钥mykey并验证是否复制了主节点上的更改

尝试在从站1上发出任何写命令都会导致错误,因为它是在只读模式下配置的(如下图所示)。

图7.只读从属服务器(slave1)上的SET命令返回错误

图7.只读从属服务器( slave1 )上的SET命令返回错误

因此,在从机2上发出任何写命令都是合法的,但是一旦从机与主机重新同步,所有这些临时数据都将消失。

图8.接受读写从机(slave2)上的SET命令

图8.接受读写从设备( slave2 )上的SET命令

5.在运行时配置复制

如果您已经在运行多个独立的Redis服务器,则借助Redis运行时配置功能,可以配置主从复制而无需重新启动其中的一个。 为了在现场进行演示,我们将在端口6390上运行常规Redis实例,然后使其成为另一个Redis实例( master )的从属。 因此,让我们来看看独立实例:

redis-server --port 6390
图9.在端口6390上运行独立Redis实例

图9.在端口6390上运行独立Redis实例

现在,让我们使用redis-cli连接到该实例,并使用SLAVEOF命令( [2] ),使该实例成为正在运行的master实例的从属(副本)。

图10.使独立Redis实例成为从属(副本)

图10.使独立Redis实例成为从属(副本)

实例通过使用完全同步立即与主服务器同步(如下图所示)。

图11.独立Redis实例成为从属(副本),并与主实例进行完全重新同步

图11.独立Redis实例成为从属(副本),并与主实例进行完全重新同步

也可以同时使用CONFIG SET命令( [3] )将从站的默认只读模式更改为读写模式。

图12.将奴隶的默认只读模式更改为读写

图12.将slave的默认只读模式更改为读写

在任何时候,都可以使用CONFIG GET命令查询当前配置设置。 以下示例检索slave-read-only设置,以确保将其值更改为“ yes ”。

图13.查询从站的只读模式配置设置

图13.查询从站的只读模式配置设置

6.高级复制配置

除了我们的基本示例外,还有很多设置在实词场景中非常有用。 在本节中,将详细介绍其中的大部分内容,以指出如何使复制更加健壮。

仅当当前至少有N个从属服务器连接到Redis主服务器时,才可以将其配置为接受写入命令(但是无法确保从属服务器实际收到了给定的写入操作,仅在不足够的情况下限制丢失写入操作的暴露窗口从站可用)具有指定的秒数。

配置设置支持最小数量的从属设备( min-slaves-to-write ),该min-slaves-to-write的延迟不大于最大秒数( slaves-max-lag )。 如果不满足这些条件,则主机将返回一个错误,并且将不接受写入。

设置 min-slaves-to-write <从站数量>
描述 设置<奴隶数>,为了执行写命令,应该连接该奴隶数。 <奴隶数>奴隶必须处于“在线”状态。 将该值设置为0将禁用此功能。
默认值 默认情况下, min-slaves-to-write设置为0(禁用功能)
min-slaves-to-write 3

表格1

设置 min-slaves-max-lag <秒数>
描述 以秒为单位设置必须小于或等于指定值的延迟。 它是根据从从站收到的最后一次ping计算得出的(通常每秒发送一次)。 将该值设置为0将禁用该功能。
默认值 默认情况下, min-slaves-max-lag设置为10
min-slaves-max-lag 10

表2

如果主服务器受密码保护(使用requirepass配置指令),则可以在开始复制同步过程之前告诉从服务器进行身份验证,否则主服务器将拒绝从服务器请求。

设置 大师认证
描述 配置用于与主服务器进行身份验证的密码
默认值 已注释掉(无身份验证)
masterauth mysectetpassword

表3

当从属服务器失去与主服务器的连接或复制仍在进行时,从属服务器可以通过两种不同的方式进行操作:

  • 如果slave-serve-stale-data设置为“ yes ”(默认设置),slave仍将回复客户端请求,可能包含过期数据,或者如果这是第一次同步,则数据集可能为空
  • 如果slave-serve-stale-data设置为“ no ”,则slave将对所有类型的命令( “ INFO ( [4]” )和SLAVEOF ( [2] )进行答复,并显示错误“ 与主机进行同步 ”。
设置 slave-save-stale-data是| 没有
描述 配置从站失去与主站的连接时的行为
默认值 默认情况下, slave-serve-stale-data设置为yes
slave-serve-stale-data

表4

从站以预定义的间隔将PING发送到服务器。 允许使用repl_ping_slave_period选项更改此间隔。

设置 repl-ping-slave-period <秒数>
描述 配置从站将PING发送到服务器的频率
默认值 默认情况下, repl-ping-slave-period设置为10
repl-ping-slave-period 10

表5

可以配置主服务器和从服务器的复制超时(从服务器的角度来看是超时,当从服务器决定主服务器不可用时,从超时的角度来看,超时是从主服务器的角度来看,当主服务器决定从服务器的角度是超时时)不可用):

  • 从站的角度来看,在SYNC期间进行批量传输I / O
  • 从机角度来看主机超时
  • 从主机角度来看从机超时
设置 repl-timeout <秒数>
描述 配置复制超时。 重要的是要确保该值大于为repl-ping-slave-period指定的值,否则,每当主机和从机之间的通信量较低时,都会检测到超时。
默认值 默认情况下, repl-timeout设置为60
repl-timeout 60

表6

出于复制目的,Redis通过使用repl-disable-tcp-nodelay选项支持一些底层TCP协议调整。 如果将其设置为“ yes ”,则Redis服务器将使用较少数量的TCP数据包和较少带宽将数据发送到从属服务器。 但这会增加数据显示在从属端的延迟(对于使用默认配置的Linux内核,此延迟最多为40毫秒)。 激活此设置在非常繁忙的流量条件下或当主从之间的距离很远时可能会很有用。 默认情况下,它设置为“ no ”,这意味着将减少数据出现在从属端的延迟,但是将使用更多带宽进行复制。

设置 repl-disable-tcp-nodelay是| 没有
描述 SYNC后在从属套接字上禁用/启用TCP_NODELAY
默认值 默认情况下, repl-disable-tcp-nodelay设置为“ no ”(针对低延迟进行了优化)
repl-disable-tcp-nodelay

表7

有两个配置参数可帮助主服务器管理从属断开连接和部分复制:复制积压大小和积压缓冲区生存时间。 待办事项是一个缓冲区,当从站断开连接一段时间后,该缓冲区会累积从站数据,因此,当从站要再次重新连接时,通常不需要完全重新同步,但是部分重新同步就足够了(只需将部分数据传递给从站即可)断开连接时错过)。 复制积压最大,从服务器可以断开连接的时间越长,以后就可以执行部分​​重新同步。 仅当连接了至少一个从站时,才分配积压。

设置 repl-backlog-size
描述 设置复制积压大小
默认值 默认情况下, repl-backlog-size is set to “ 1mb
repl-backlog-size 1mb

表8

主机在一段时间内不再连接从机后,积压的订单将被释放。 repl-backlog-ttl选项配置从释放最后一个从属服务器开始到释放待办事项缓冲区所需的秒数。

设置 repl-backlog-ttl <秒数>
描述 设置积压缓冲区的生存时间,然后再释放它。 值为0表示从不释放积压。
默认值 默认情况下, repl-backlog-ttl设置为“ 3600
repl-backlog-ttl 3600

表9

最后,一个非常有趣的设置,即为Redis Sentinel( [5] )使用的从站(副本)分配优先级,以便在主站无法正常工作时选择要升级为主站的从站。 具有较低优先级编号的从属服务器更适合提升,例如,如果有三个具有优先级10、100和25的从属服务器,Redis Sentinel( [5] )将选择一个具有优先级10(最低的)的从属服务器。 但是,特殊优先级0表示从属服务器无法执行主机角色,因此Redis Sentinel( [5] )永远不会选择优先级为0的从属服务器进行升级。

设置 从属优先级 <数字>
描述 从属优先级是Redis在INFO输出中发布的整数。
默认值 默认情况下, slave-priority设置为100
slave-priority 100

表10

Redis Sentinel( [5] )将在本教程的后面进行讨论。

[1] http://redis.io/topics/replication
[2] http://redis.io/commands/slaveof
[3] http://redis.io/commands/config-set
[4] http://redis.io/commands/info
[5] http://redis.io/topics/sentinel

翻译自: https://www.javacodegeeks.com/2015/09/redis-replication.html

redis复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb笔记之WEB项目

一. 版本控制 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理&#xff0c;是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变&a…

c++获取数组长度

点击蓝字关注我们来源于网络&#xff0c;侵删方法一&#xff1a; 用宏函数 #define#define foo(arr) sizeof(arr)/sizeof(arr[0])int main(){int arr[4] {1,2,3,4};cout<<foo(arr)<<endl; }方法二&#xff1a;用函数模板int getArrLen1(int *a ){return sizeof(a)…

C++ 利用硬件加速矩阵乘法

点击蓝字关注我们来源于网络&#xff0c;侵删1.矩阵乘法定义2.矩阵类封装我们用 C封装了一个n m 的矩阵类&#xff0c;用二维数组来存储数据&#xff0c;定义如下&#xff1a;#define MAXN 1000 #define LL __int64class Matrix { private:int n, m;LL** pkData; public:Matri…

redis分片_Redis分片

redis分片本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

解析C++全排列

点击蓝字关注我们来源于网络&#xff0c;侵删1.C实现全排列的函数next_permutation(start,end)这个函数在暴力解决问题方面有很大作用&#xff0c;使用时需要引入头文件 < algorithm >&#xff0c;当当前序列不存在下一个序列时就会结束&#xff0c;若想得到一个序列的全…

redis开启redis_Redis聚类

redis开启redis本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#…

C++ 读取文件操作

点击蓝字关注我们来源于网络&#xff0c;侵删1.先上代码&#xff1a;#include <fstream> #include<iostream> using namespace std;//文本文件读文件 void test01() {//1、包含头文件//2、创建流对象ifstream ifs;//3、打开文件并且判断是否打开成功ifs.open("…

C/C++,判断变量的类型

点击蓝字关注我们来源于网络&#xff0c;侵删出于某个奇葩需求&#xff0c;研究了一下c/c如何判断变量类型&#xff0c;整理总结在此&#xff0c;分享给大家&#xff0c;也避免自己以后绕弯。一、c判断变量类型c中&#xff0c;可以利用typeid()来判断变量类型。第一步&#xff…

c/c++语言实现登陆界面

点击蓝字关注我们来源自网络&#xff0c;侵删一.整体功能介绍实现一个登陆界面1 输出一个登陆界面2 用户名能够实现邮箱验证&#xff0c;regex库&#xff0c;密码要不可见3 进度条的模拟实现4 音乐播放二.分步实现1.输出一个登陆界面首先对此功能使用到的函数进行简单的介绍。s…

spark restful_Spark入门:也可以用Java创建轻量级的RESTful应用程序

spark restful最近&#xff0c;我一直在使用Spark &#xff08;一种Java的Web框架&#xff0c;与Apache Spark 不相关&#xff09;编写RESTful服务。 当我们计划写这篇文章时&#xff0c;我已经做好了不可避免的接口&#xff0c;样板代码和深层层次结构的Java风格的准备。 令我…

C++的get()函数与getline()函数使用详解

点击蓝字关注我们来源自网络&#xff0c;侵删一.C的get()函数使用详解1.C get()函数get()函数是cin输入流对象的成员函数&#xff0c;它有3种形式&#xff1a;无参数的&#xff1b;有一个参数的&#xff1b;有3个参数的。1) 无参数的其调用形式为cin.get()用来从指定的输入流中…

电脑所有程序里有不一样颜色_12个好玩的电脑屏保,让你成为别人眼中最靓的仔。...

Hello 大家好&#xff0c;这里是工具狂人。作为一个靠打字(哦不&#xff0c;搬砖)为生的新媒体小编&#xff0c;每天多数时候都是对着电脑屏幕&#xff0c;中途有时会拿起手机回复消息、查看短信、刷起微博。刷手机的时间一长&#xff0c;眼前的电脑会自动打开系统的屏保程序&a…

java8 函数式编程_如何使用Java 8函数式编程生成字母序列

java8 函数式编程我偶然发现了用户“ mip”一个有趣的堆栈溢出问题 。 问题是&#xff1a; 我正在寻找一种生成字母序列的方法&#xff1a; A, B, C, ..., Z, AA, AB, AC, ..., ZZ.可以很快将其识别为Excel电子表格的标题&#xff0c;它确实做到了&#xff1a; 到目前为止&a…

C++判断变量/对象/枚举类型的简单方式

点击蓝字关注我们来源于网络&#xff0c;侵删1.关键点<typeinfo>使用typeid()操作符所需包含的头文件。typeid()获取变量类型信息的操作符&#xff0c;其返回值类型为std::typeinfo。我们可使用typeid(n) typeid(int)的方式来判断变量n是否为类型int。注&#xff1a;可以…

C++ 空指针和野指针

点击蓝字关注我们来源于网络&#xff0c;侵删1.空指针指针变量指向内存中编号为0的空间为空指针。空指针指向的内存空间是不可以访问的 。代码&#xff1a;#include<iostream> using namespace std; int main() {int a 10;int * p &a;cout << p << end…

sap abap开发从入门到精通_SAP开发-ABAP数据字典(锁)

企业级软件或开发框架&#xff0c;必然支持后台高并发&#xff0c;即支持多人同时访问数据库。SAP作为资深企业管理软件&#xff0c;自然也不例外&#xff0c;ABAP可以很方便的开发出支持高并发的程序&#xff0c;要实现高并发&#xff0c;正确使用锁对象是其中一个重要环节&am…

(acm)C++加速输入的几种方法

点击蓝字关注我们来源于网络&#xff0c;侵删1.CIO流的同步和绑定在C中&#xff0c;cin和cout的速度其实不并不慢&#xff0c;C中的流的IO速度相当的快&#xff0c;其速度与初始设定的缓存区大小和硬盘的IO速度有关。但在C中&#xff0c;为了兼容C的IO(scanf和printf)&#xff…

服务器编写_编写下载服务器。 第六部分:描述您发送的内容(内容类型等)...

服务器编写就HTTP而言&#xff0c;客户端下载的只是一堆字节。 但是&#xff0c;客户真的很想知道如何解释这些字节。 它是图像吗&#xff1f; 还是ZIP文件&#xff1f; 本系列的最后一部分描述了如何向客户端提示她下载的内容。 设置 内容类型描述了返回的资源的MIME类型 。 …

C语言与C++的区别终于有人说清楚了!

点击蓝字关注我们来源于网络&#xff0c;侵删1、前言在很大程度上&#xff0c;C是C的超集&#xff0c;这意味着一个有效的C程序也是一个有效的C程序。C和C的主要区别是&#xff0c;C支持许多附加特性。但是&#xff0c;C中有许多规则与C稍有不同。这些不同使得C程序作为C程序编…

postgresql两个列模糊比较_数据分析之SQL优化系列(二)---PostgreSQL 的索引

参考《PostgreSQL11.2-中文手册》下面这个链接&#xff0c;讲的通俗易懂&#xff0c;可以看看。数据分析师不得不知道的SQL优化 - 鑫获 - 博客园​www.cnblogs.com索引是提高数据库性能的常用途径。比起没有索引&#xff0c;使用索引可以让数据库服务器更快找到并获取特定行。但…