一、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)中设置。

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

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

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

1.3.2在Redis客户端中进行设置

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

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主从同步分析(转)的更多相关文章

  1. Redis主从同步分析

    一.Redis主从同步原理1.1 Redis主从同步的过程配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开 ...

  2. redis主从同步故障切换及集群配置

    一.redis是一中高性能的缓存数据库, 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下 ...

  3. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  4. redis 主从同步

    修改redis.conf配置文件 vi redis.conf 在编辑模式下 输入  /slaveof 来搜索 将slaveof启用 即 将#删除 依次配置所有 slave 并将进程 kill 掉 重启 ...

  5. Redis主从同步介绍

    Redis主从同步命令和配置项 启动主从复制:master无需任何操作,slave中使用以下任意一种开启复制功能 (1).通过配置文件启动主从复制: 在redis.conf中加入"slave ...

  6. Redis系列之(二):Redis主从同步,读写分离(转)

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  7. Redis主从同步要深入理解?一篇文章足矣!

    前言: 今天想和大家分享有关 Redis 主从同步(也称「复制」)的内容. 我们知道,当有多台 Redis 服务器时,肯定就有一台主服务器和多台从服务器.一般来说,主服务器进行写操作,从服务器进行读操 ...

  8. 一文让你明白Redis主从同步

    今天想和大家分享有关 Redis 主从同步(也称「复制」)的内容. 我们知道,当有多台 Redis 服务器时,肯定就有一台主服务器和多台从服务器.一般来说,主服务器进行写操作,从服务器进行读操作. 那 ...

  9. Redis主从同步原理-SYNC【转】

    和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,下图为级 ...

随机推荐

  1. [转载]ASP.NET Error – Adding the specified count to the semaphore would cause it to exceed its maximum count

    http://jwcooney.com/2012/08/13/asp-net-error-adding-the-specified-count-to-the-semaphore-would-cause ...

  2. javascript完美拖拽的实现

    直接上代码: HTML代码: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...

  3. 新建 Spring Mvc Web + Maven 的 maven 错误 (二)

    新建项目后,可能由于哪边配置不正确,或也可能是编码问题,就有可能在创建初始就可能发生错误: 这是 pom.xml 中提示的错误,有的人说要删除 maven 的本地仓库位置:c:\用户[Users]\A ...

  4. 在 Linux 中安装 VMware Tools

    由于较新的Linux版本中都包含了vm的部分组件,导致直接安装VMware Tools失败.所以这里写了篇新的. 软件版本:VMware 12 Linux版本:Ubuntu Desktop 16.04 ...

  5. Ajax和jsonp区别

    大多数情况下,无论是框架还是自己实现都是通过Ajax的方式来向后端请求数据的,而Ajax之间是通过传输json格式的文件来进行数据的传输的,大家对Ajax也很熟悉了,那么为什么我又要使用jsonp呢? ...

  6. 基于FPGA(DDS)的正弦波发生器

    记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...

  7. Linux中Samba详细安装【转】

    转自:http://www.cnblogs.com/whiteyun/archive/2011/05/27/2059670.html 为了实现Windows主机与Linux服务器之间的资源共享,Lin ...

  8. Vue中发送ajax请求——axios使用详解

    axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...

  9. selenium玩转svg操作

    今天写脚本发现页面有svg结构,里面的元素无法定位,查找很多资料,然后就记录下来 初步尝试直接在页面中获取svg中包含元素的xpath,直接利用selenium方法访问,无法捕获到相关元素信息. SV ...

  10. Java ArrayList中对象的排序 (Comparable VS Comparator)

    我们通常使用Collections.sort()方法来对一个简单的数据列表排序.但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了.在使用这两者 ...