欢迎光临
我们一直在努力

Redis主从复制

前言

开发中,分布式系统涉及着一个非常关键的问题:单点问题(服务器程序只有一个节点)

在可用性上,如果该节点挂掉了,那就意味着服务中断

在性能上,由于只有一个节点,其所支持的并发量也是有限的

而分布式系统的引入就是为了解决上诉问题,在分布式系统中,往往希望有多个服务器部署redis服务,从而构成一个redis集群


一.主从模式

在若干redis节点中,有节点担任着类似"老板"(主节点)的职位,向下面"员工"(从节点)发布消息,将消息同步给使用员工,这就是主从模式

从节点数据跟随主节点变化;从节点是数据保持着跟主节点一致

注意:从节点不可修改,意味着不能进行写操作

如果主节点挂,则只能读数据,而不能写数据,是否可以通过增加主节点来解决此问题??

主从模式主要是针对读操作,写操作依赖于主节点(一山不容二虎)

在性能上,由于从节点数据与主节点数据保持一致,因此客户端无论是在主节点读取数据还是从节点读取数据都是一样的,那么就可以让从节点负责读操作,主节点负责写操作,当有客户端读取数据,可在所有节点中随机挑选一个节点进行读取,这样就能引入更多的计算资源,自然能支撑更多的并发量

在可用性上,多个节点共同工作,可以保证某些节点挂掉后服务器程序仍能继续服务,可用性得到大大提升.

那如果是整个服务器机房挂掉了呢?? 那就真完蛋了.

为了追求更高的可用性,我们可以将服务器放置在多个不同机房(异地多活)

二.配置主从模式

想要配置主从模式,需要启动多个redis服务器

在一台服务器上启动多个redis,有两种方法

方法一:启动程序时,通过命令行来指定端口  –port

方法二:在配置文件中,设置启动时的端口号(首选)

首先,将主节点的conf文件复制一份,打开复制后的配置文件,进行修改

将daemonize确认为yes,意为redis服务在后台运行

找到端口号,进行修改

接着,根据配置文件启动redis

这样,我们就在一台服务器上启动了多个redis服务

此时,多个redis节点只是启动,并没有构建起主从关系,各个节点依旧各自为战

如何配置主从结构??

有以下三种方法:

方法一:在配置文件中加入 slaveof {masterHost} {mastPort} 

方法二:在redis-server启动命令中加入 –slaveof {masterHost} {mastPort} 

方法三:启动redis服务后,直接使用redis命令 slaveof {masterHost} {mastPort} 即可生效

方法二与方法三构建的主从结构只是暂时的,如服务器重启则消失

因此更加推荐使用方法一

打开配置文件,写入配置

以6379端口的节点为主节点

这样,就成功构建起了主从结构

我们也可以通过输入info replication指令看到节点的相关信息

输入slaveof no one 即可断开主从关系

三.工作流程

主节点与从节点间靠TCP协议进行数据的传输

TCP内部支持了nagle算法,该算法开启后,会增加TCP传输的延迟,相对的可以节省网络带宽

关闭该算法.则会减少TCP之间的传输延迟,但会加大网络带宽的开销

根据对应的场景可选择是否开启该算法(一般moba,射击等游戏需要关闭nagle算法)

主节点与从节点建立起关系,首先从节点会保存主节点信息->建立主从连接->发生ping命令->权限验证->同步数据集->命令持续复制

redis提供了psync命令用于完成主从节点数据同步

当服务器建立主从关系后,会自动执行psync(由从节点负责执行,从主节点中拉取数据)

指令为 PSYNC replicationid offset

其中replicationid是由主节点生成,每次主节点重新启动会随机生成一个

四.主从复制方法

1.全量复制

1)从节点发送psync命令给主节点进行同步,由于是第一次复制,从节点无主节点的replicationid和offset

2)主节点根据命令,解析出要进行全量复制,回复+FULLRESYNC响应

3)从节点接收主节点的运行信息,并进行保存

4)主节点执行bgsave进行RDB持久化(RDB文件为二进制,节省空间)

5)主节点发送RDB文件给从节点,从节点保存RDB数据到本地硬盘

6)主节点将从生成RDB到接收完成期间执行的写命令,写入缓冲区,等待从节点保存完RDB文件后,主节点再将缓存区中的操作同步发送给从节点

7)从节点清空自身原有的旧数据

8)从节点加载RDB文件.得到与主节点一致的数据

9)如从节点加载完RDB文件后,且开启了AOF持久化配置,它会进行bgrewrite操作,得到最近的AOF文件

2.部分复制

部分复制主要撒redis对全量复制的过高开销进行的优化

当从节点本身已经持有了主节点的绝大部分数据时,就不太需要全量复制,可根据replicationid和offset将后面新操作复制下来.

3.实时复制

实时复制用于当主节点与从节点已经同步后,主节点接收到新的操作,此时从节点也要将操作复制下来,从节点与主节点间会建立起TCP长连接

赞(0)
未经允许不得转载:171主机测评 » Redis主从复制
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址