Redis的主从同步解析

一、Redis主从同步原理

1.1 Redis主从同步的过程

配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中.同时master主进程会开始收集新的写命令并缓存起来。当后台进程完成写文件后,master就将快照文件发送给slave,slave将文件保存到磁盘上,然后加载到内存将数据库快照恢复到slave上。slave完成快照文件的恢复后,master就会把缓存的命令都转发给slave,slave更新内存数据库。后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 client到master发送的命令使用相同的协议格式。当master和slave的连接断开时,slave可以自动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。

1.2 Redis主从同步的特点

主从同步具有明显的分布式缓存特点,主要包括这些方面:

1)一个master可以有多个slave,一个slave也可以有多个slave;
2)slave不仅可以连接到master,slave也可以连接其他slave形成树状结构;
3)主从同步不会阻塞master,但是会阻塞slave。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求;
4)主从同步可以用来提高系统的可伸缩性,我们可以用多个slave专门处理client的读请求,也可以用来做简单的数据冗余或者只在slave上进行持久化从而提升集群的整体性能。

1.3 Redis主动同步设置方法

有两种方式可以用来完成进行主从Redis服务器的同步设置。都需要针对slave服务器上进行,指定slave需要连接的Redis服务器(可能是master,也可能是slave)。

1.3.1 在配置文件中设置

在作为slave的Redis服务器的配置文件(redis.conf)中设置。

Conf代码

slaveof 10.1.1.102 6379 #指定master的ip和端口

很明显,这种设置方式非常简单,但是需要修改配置文件,并且配置文件是在服务器启动时加载的。所以服务器不启动无法修改,操作不灵活。

这种配置方式适合于作为部署时的初始配置。

1.3.2 在Redis客户端中进行设置

这里以Redis官方推荐的Jedis为例来说明,后文中的测试也基于Jedis来进行。这里jedis对象实例是属于slave的,参数是服务器的地址和端口。

Java代码

slaveJdedis.slaveOf("10.1.1.102", 6379); #指定master的ip和端口
slaveJdedis.slaveofNoOne(); #取消指定master,自己成为一个master了

通过客户端指定的方式,可以方便的修改master和slave服务器的主从关系。所以这种方式非常适合于根据需要在线调整master和slave服务器。

1.3.3 当前主从同步存在的问题

由于master和slave服务器的不是Redis自动选举产生,需要人工参与,因此主从倒换无法自动完成。这样就存在一个问题,什么时候以及由谁来触发倒换。我看了下客户端是没有这个能力的,一定要的话需要自己增加。

Jedis目前随机选择读取的哪台Redis服务器,因此实现自动分布式读取我们需要对Jedis做二次封装。

1)  需要开发一种机制,尽快检测到master和slave的工作状态;
2)  需要定义一种master和slave的自动切换策略;
3)  需要定义一种可以随机读取任何一台Redis服务器的机制;

这些功能都可以在客户端实现,不过效果不会太好。如果服务器自身能够支持就比较完美了,不过从Redis官网的介绍情况来看,好像目前还没有看到有人提这样的需求,也没有这样的规划。

二、Redis主流客户端介绍

在Redis的官方网站,列出了5款Redis的java客户端软件。其中Jedis是Redis官方推荐的java客户端,这款一直有维护并更新。目前服务器最新稳定版本是Redis2.4.17,最新的测试版本Redis 2.6.0 RC7。

2.1 Jedis

Jedis是Redis官方推荐的Java客户端版本。目前最新为Jedis 2.1.0-5版本,完全兼容Redis 2.0.0版本。这个客户端一直都有维护和更新。

2.2 JRedis

JRedis之前很长一段时间没有更新,可以完全兼容Redis 2.0.0版本。今天5月份前做过更新后可以兼容最新的Redis2.6.0测试版本。

2.3 JDBC-Redis

JDBC-Redis是用于Redis这个NoSQL数据库的JDBC驱动。只能下载到2009年3月发布的jdbc-redis_0.1_beta版本,目前已经无人维护了。

2.4 RJC

RJC提供Apache DBCP风格的连接池。1年前已经停止更新,可以完全兼容Redis 2.0.0版本。

2.5 redis-protocol

这个更新是最快和最频繁的,可以兼容最新的Redis 2.6.0版本。不过它定位于完整支持Redis协议,更加高效和Redis服务器进行数据交互。所以,并没有充分发挥redis服务器的功能。

2.6 各个Java客户端总体评价

整体来讲,各个客户端基本都实现了Redis协议协议定义的基本功能。Redis-protocol更新最近对Redis协议的支持最完整;Jedis提供对Redis服务器的更多配置操作,使用起来是最方便的。其他客户端都很少维护,功能也是一般。

如果要少量扩展客户端的功能,基于Jedis来做开发是最快捷的。

如果要最大限制兼容和扩展客户端的功能,基于Redis-protocol是最好的选择。

三、Redis主从同步的使用建议

Redis主从同步在目前所有的Java客户端都支持不好。主要原因应该还是Redis服务器本身的实现机制限制导致的。如果一定要做也是可能的,不过效果可能会打折扣。

3.1 通过封装Jdedis来实现

1)新增一个管理类,负责维护Redis服务器集群的服务器拓扑关系;
2)新增一个监测类,负责监测和维护Redis服务器集群中的服务器运行状态;
3)新增一个Master选择策略类,负责确定master和slave的切换时机,并选择最合适的Redis服务器充当master。
4)新增一个代理类,接管当前的Jedis客户端对Redis服务器的读写操作。应用层通过代理类来使用Jedis客户端。代理类需要保证Redis服务器集群对应用层透明。

总结

以上就是本文关于Redis的主从同步解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java编程redisson实现分布式锁代码示例、redis中事务机制及乐观锁的实现等,有什么问题可以随时留言,小编一定知无不言言无不尽。感谢朋友们对本站的支持!

时间: 2017-10-22

Redis主从实现读写分离

前言 大家在工作中可能会遇到这样的需求,即Redis读写分离,目的是为了压力分散化.下面我将为大家介绍借助AWS的ELB实现读写分离,以写主读从为例. 实现 引用库文件 <!-- redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> &l

Redis主从复制问题和扩容问题的解决思路

一.解决主从复制问题 当使用Redis作为存储引擎的时候,并且使用Redis读写分离,从机作为读的情况,从机宕机或者和主机断开连接都需要重新连接主机,重新连接主机都会触发全量的主从复制,这时候主机会生成内存快照,主机依然可以对外提供服务,但是作为读的从机,就无法提供对外服务了,如果数据量大,恢复的时间会相当的长.为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制.但是自己干同步,就会产生一致性问题,为了保证

Redis教程(九):主从复制配置实例

一.Redis的Replication: 这里首先需要说明的是,在Redis中配置Master-Slave模式真是太简单了.相信在阅读完这篇Blog之后你也可以轻松做到.这里我们还是先列出一些理论性的知识,后面给出实际操作的案例. 下面的列表清楚的解释了Redis Replication的特点和优势. 1). 同一个Master可以同步多个Slaves.     2). Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力.因此我们可以将Redis的R

MongoDB入门教程之主从复制配置详解

从这一篇开始我们主要讨论mongodb的部署技术. 我们知道sql server能够做到读写分离,双机热备份和集群部署,当然mongodb也能做到,实际应用中我们不希望数据库采用单点部署, 如果碰到数据库宕机或者被毁灭性破坏那是多么的糟糕.  一:主从复制 1: 首先看看模型图   2: 从上面的图形中我们可以分析出这种架构有如下的好处: <1>  数据备份. <2>  数据恢复. <3>  读写分离.  3:下面我们就一一实践 实际应用中我们肯定是多服务器部署,限于自

CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法

本文实例讲述了CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法.分享给大家供大家参考,具体如下: 依赖环境 Centos 6.5 gcc-4.4.7:编译redis原文件 tcl-8.5.7:运行编译检测 1.编译redis #cd /usr/local #tar -zxvf redis-4.0.1.tar.gz #mv redis-4.0.1 redis #cd redis #make 运行编译测试make test需要tcl-8.5及以上 #yum inst

spring boot application properties配置实例代码详解

废话不多说了,直接给大家贴代码了,具体代码如下所示: # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # ========

Python装饰器入门学习教程(九步学习)

装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表

五十九、配置广域网中的Windows NT

五十九.配置广域网中的Windows NT Windows NT 4.0作为一个高性能32位多任务.多用户的网络操作系统,由于其界面的友好性和强大而直观的管理功能,无论对网络新手还是资深系统管理员,都可以迅速地构造起一套基于Windows NT的网络环境,从而赢得了众多用户的青睐.然而,随着用户网络节点的不断增加.挂接网段数的持续增长,使得网络规模日趋增大,一些在局域网环境中无法遇到的问题就会逐步地暴露出来.因此,如何保证Windows NT在多网段.多主域的复杂环境下,充分满足用户各种跨网段的

Spring Boot项目利用Redis实现集中式缓存实例

在高并发请求的web服务架构中,随着数据量的提升,缓存机制为绝大多数的后台开发所使用.这篇文章主要介绍如何在Spring Boot项目中为Entity添加利用Redis实现的集中式缓存. 1. 利用Spring Initializr来新建一个spring boot项目 2. 在pom.xml中添加redis.mysql和cache等相关依赖.一般情况下,缓存一般是在大规模数据库存储下所需要的 <dependency> <groupId>org.springframework.boo

java Swing基础教程之图形化实例代码

java  Swing基础教程之图形化实例代码 与多线程.泛型等不同,Swing主要在于使用. 下面主要放代码和注释,少说话. (一)基本框架 package Swing; import java.awt.*; import javax.swing.*; /** * * @author QuinnNorris * 基本框架 */ public class FrameTest { /** * @param args */ public static void main(String[] args)

基于redis集群设置密码的实例

注意事项: 1.如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码 2.如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志 3.各个节点的密码都必须一致,否则Redirected就会失败 config set masterauth abc config set requirepass abc

spring整合redis实现数据缓存的实例代码

数据缓存原因:有些数据比较多,如果每次访问都要进行查询,无疑给数据库带来太大的负担,将一些庞大的查询数据并且更新次数较少的数据存入redis,能为系统的性能带来良好的提升. 业务逻辑思路:登入系统,访问数据时,检查redis是否有缓存,有则直接从redis中提取,没有则从数据库查询出,并存入redis中做缓存. 为什么要用redis做缓存: (1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录. (2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道