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,一经查实,立即删除!

相关文章

python打开.data_DataX初体验-python命令启动以及纯java启动

一、DataX安装官网描述很详细&#xff0c;很简单---->DataX安装二、使用示例&#xff1a;从Oracle数据库导数据到Mysql数据库事先准备&#xff1a;Oracle数据库的ORDER_INFO表&#xff0c;MySQL数据库的order_info表&#xff0c;表结构相同2.1使用Python启动生成模板文件打开…

java高级教程_高级Java教程

java高级教程课程大纲 学习Java基础很容易。 但是&#xff0c;真正钻研该语言并研究其更高级的概念和细微差别将使您成为一名出色的Java开发人员。 网络上充斥着“软”&#xff0c;“便宜”&#xff0c;“低端” Java教程&#xff0c;但是所缺少的实际上是将您带入新的高度的材…

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)…

python从列表随机取出多个数据_【python】从数组随机取数据

在神经网络中&#xff0c;经常会用到批量样本训练。我们需要从数组随机取数据&#xff0c;主要有以下几种方法&#xff1a;1、np.random.shuffle&#xff1a;将原数组打乱import numpy as nparray np.random.randint(1,100,size10)#[63 32 80 33 61 45 28 55 39 80]batch_size…

java代理模式_Java代理

java代理模式本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题&#xff0c;包括对象创建&#xff0c;并发&#xff0c;序列化&#xff0c;反射等。 它将指导您完成Java掌握的旅程&#xff01; 在这里查看 &#xff01;…

如何用python抢课_名额不够,技术来凑,利用Python实现教务系统强制性抢课

这个不是一个点击脚本&#xff0c;而是属于扩容性质的脚本。名额不够咱们利用技术来解决&#xff01;最近一学期一次的抢课大戏又来了&#xff0c;几家欢乐几家愁。O(∩_∩)O哈哈~(l我每次一选就过了hah&#xff0c;我还是有欧的时候滴)。看着他们盯着教务系统就着急&#xff0…

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…

python tkinter窗口切换_tkinter--实现简单的页面切换

[Python] 纯文本查看 复制代码import tkinter as tkindex_num 4def up_page():info frame_root.place_info()x int(info[x]) 100y info[y]frame_root.place(xx, yy)global index_numindex_num 1index[text] "第 {} 页".format( index_num)def down_page():inf…

解析C++全排列

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

python读写文件代码_Python 读写文件的操作代码

Python读写文件模式1、r 打开只读文件&#xff0c;该文件必须存在。2、r 打开可读写的文件&#xff0c;该文件必须存在。3、w 打开只写文件&#xff0c;若文件存在则文件长度清为0&#xff0c;即该文件内容会消失。若文件不存在则建立该文件。4、w 打开可读写文件&#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("…

python调用simulink_使用Python从dbc文件中提取simulink建模数据定义

使用dbc文件建模完成CAN通讯是一种比较高效的开发模式&#xff0c;不过在建模的过程中dbc文件中描述的数据需要自己去定义。使用文本编辑工具打开dbc文件可以看到&#xff0c;实际上dbc文件是一个可以进行语义解析的文本。这样&#xff0c;通过脚本语言便可以轻松的实现simulin…

cov/cor中有遗漏值_协调遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟...

cov/cor中有遗漏值在这篇文章中&#xff0c;我演示了许多想法和技术&#xff1a; 如何编写一个简单的非阻塞NIO客户端/服务器 协同遗漏的影响 如何测量百分位数的延迟&#xff08;相对于简单平均&#xff09; 如何在计算机上计时延迟回送 我最近正在为客户端服务器应用程序…

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

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

python访问文件下载地址_用Python脚本去获得skydrive上文件的真实地址链接 + 提供脚本下载v2012-01-18...

之前得知微软提供的免费在线云存储空间Skydrive提供的空间大小达25GB的时候&#xff0c;就像其他人一样想到了可以用来存储音视频和图片&#xff0c;作为文件存储器&#xff0c;以便和别人分享文件。但是后来发现&#xff0c;skydrive中上面文件连接&#xff0c;通过系统提供的…

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风格的准备。 令我…