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)中设置。
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服务器集群对应用层透明。
相关推荐
【Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式】 这门课程是针对Java开发者设计的,旨在提升他们的企业级项目架构能力,特别是聚焦于Tomcat集群和Redis分布式缓存的应用。课程内容丰富,适合希望晋升...
Redis分布式缓存技术在Hadoop平台上的应用 作为一种开源的商业化工具,Redis在Hadoop平台上的应用可以解决共享数据...Redis分布式缓存技术在Hadoop平台上的应用可以解决共享数据访问问题,提高数据分析和处理的速度。
通过以上分析,我们可以看出 Redis 在分布式锁和信号量的实现上具有较高的灵活性和性能,是分布式系统中解决并发问题的有效工具。深入理解和熟练掌握 Redis 分布式锁的原理和实践,对于提升系统的稳定性和可扩展性至...
通过Scrapy-Redis框架搭建的分布式微博数据采集平台,可以有效地进行数据采集和处理,提供更高效、更全面的数据分析支持。此类平台在大数据时代,对于企业决策支持、市场研究、公共安全监控等领域的应用具有广泛的...
本压缩包“zk:redis分布式锁.zip”提供了基于Zookeeper(zk)和Redis两种分布式锁实现的示例和相关资料。 首先,我们来看Zookeeper(zk)的分布式锁。Zookeeper是Apache的一个开源项目,提供了一个高可用的、高性能...
2. 高效数据处理:Scrapy-Redis分布式爬虫环境可以应用于高效数据处理,例如数据清洁、数据转换、数据分析等。 3. 实时数据采集:Scrapy-Redis分布式爬虫环境可以应用于实时数据采集,例如实时采集股票数据、实时...
【基于Redis的分布式缓存系统架构分析】 在现代高并发的互联网应用中,为了提高数据访问的速度和系统性能,往往采用缓存技术。基于Redis的分布式缓存系统因其高效、灵活的特点,被广泛应用于大型应用系统中。Redis...
通过阅读和分析源码,我们可以深入理解Redis的内部工作原理,如命令处理、内存管理、持久化机制(RDB和AOF)、网络通信等。 6. **数据类型**:Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表...
【标题】中的“Python基于Scrapy+Redis分布式爬虫设计”是一个关于利用Python的Scrapy框架和Redis数据库来构建分布式网络爬虫的项目。Scrapy是一个强大的Python爬虫框架,而Redis则常被用于分布式环境中的数据存储和...
但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个实例有效,就需要用到分布式锁—-redis setnx 原理 修改某个资源时, 在redis中设置一个key,value根据实际情况自行决定如何表示 我们既然要通过...
### Scrapy-Redis分布式爬虫与搜索网站构建 #### 一、引言 随着大数据时代的来临,信息的获取与检索变得尤为重要。面对海量的数据,如何快速准确地获取所需内容成为了研究的重点之一。本文旨在探讨如何利用网络...
### 基于Redis分布式锁实现“秒杀” #### 一、引言 在现代互联网应用中,“秒杀”作为一种常见的促销手段,被广泛应用于电商领域。为了保证系统的稳定性和公平性,在高并发环境下实现秒杀功能时,合理地利用分布式...
Redis是一种高性能的键值数据库,常用于数据缓存、消息队列和实时分析等领域。在分布式系统中,为了实现线程或进程之间的互斥访问,我们可以利用Redis来构建分布式锁。分布式锁是解决多节点共享资源时防止并发冲突的...
**Redis分布式锁** Redis作为内存数据库,具有高性能、低延迟的特点,常被用作实现分布式锁。Redis分布式锁主要基于`SETNX`命令或者RedLock算法。`SETNX`命令在键不存在时设置键值,但如果存在则返回失败,这可以...
Python基于Scrapy-Redis分布式爬虫设计是一种高效的数据抓取技术,常用于大规模网页数据的采集。在毕业设计中,采用这种技术可以处理大量数据,提高爬虫的性能和可扩展性。Scrapy是一个强大的Python爬虫框架,而...
标题中的“java 基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统”表明了这是一个使用Java编程语言,基于SpringBoot框架构建的实时通信系统。该系统利用WebSocket技术实现双向通信,通过Redis进行数据缓存和...
Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。...数据分析和科学计算:Python的数据分析库(如NumPy和Pandas)和科学计算库(如SciPy)可以用于处理和分析大量数据。 人工智能
综上所述,这个"redis分布式锁"项目可能包含了一个完整的、适用于生产环境的Redis分布式锁实现,涵盖了从获取锁、执行操作到释放锁的整个生命周期,并且可能已经经过了多次测试和优化。在实际使用时,开发者需要结合...
Redis分布式锁是一种基于键值存储系统的锁机制,它通过在Redis中设置一个带有超时时间的key来实现锁的功能。当一个客户端获取到锁时,它会在Redis中设置一个key,当不再需要锁时,客户端会删除这个key。这种方法确保...