首页 > 编程知识 正文

php分布式系统架构,redis分布式存储方案

时间:2023-05-05 07:17:08 阅读:44592 作者:3174

第一个是什么是Redis?

Redis是一个基于内存、可持续日志和密钥值数据库的高性能存储系统,提供多语言API。

第二,背景出现

对数据结构(Data Structure )的需求日益增长,但memcache没有,这将影响开发效率

性能需要随着读取操作量的增加而解决,所经历的过程为:

读/写隔离(M/S )数据库移动到memcache redis,使用多个从属(增加缓存)

解决写作问题:

水平拆分,拆分表,将一个用户放在此表中,将一个用户放在另一个表中;

可靠性需求

Cache的“雪崩”问题让人头疼

Cache面临着快速恢复的挑战

开发成本要求

Cache和DB的一致性维护成本越来越高()清理DB再清理缓存,不行,太晚了! )

为了应对急剧增加的产品需求,需要开发

硬件成本最高的是数据库级计算机,基本上比前端计算机高数倍,主要是IO密集型,占用硬件

维护性复杂

一致性维护成本越来越高;

BerkeleyDB使用b树总是写新的东西,内部没有文件重组; 文件大小变大;大时需要文件归档,归档操作定期进行;

这样,需要一定的下降时间;

基于以上想法,选择了Redis

第三,Redis在新浪微博上的应用

Redis介绍

1.5种数据结构

支持strings、hashes、lists、sets和sorted sets

string是一种很好的存储方式,用作计数存储。 sets被用来创建索引库

2. K-V存储vs K-V缓存

新浪微博目前98%用于持续化的APP应用,2%用于缓存,600服务器

持久化在Redis中的应用和非持久化的方法没有很大的不同:

不持续化的为8-9万tps,持续化的为7-8万tps左右

使用持久化时,需要考虑持久化和写入性能的配合比,即redis使用的存储器大小和硬盘写入速度的比率来进行计算

3 .社区活跃

Redis目前拥有3万多行代码,代码编写简洁,实现巧妙,作者技术洁癖

Redis的社区活跃度很高,这是衡量开源软件质量的重要指标,开源软件初期一般没有商业技术服务支持,如果没有活跃的社区支持,出现问题也要寻求帮助

Redis的基本原理

redis持久化(aof ) append在线文件:

写log(AOF ),并与内存合并到一定程度。 追加追加。 按顺序写光盘。 对性能的影响非常小

1 .单实例单进程

由于Redis使用单个进程,因此在配置时每个实例只使用一个CPU。

如果在配置期间需要最大化CPU利用率,则可以配置与CPU数量对应的Redis实例数和与端口数对应的Redis实例数(8核CPU、8实例和8端口),以提高并发性

单机测试时,一个数据200字节,测试结果为8~9万tps;

2 .复制

进程:的数据由mastermaster存储在slave的rdb中,slave将rdb加载到内存中。

在网络断开并连接后,“存储点”(save point ) :将继续传输。

主存储区中的第一个同步是所有路径,然后是增量同步; 在、

3 .数据一致性

长期运行后,多个节点之间可能发生不一致;

开发两个工具程序:

1 .对数据量大的数据,周期性进行总量检查;

2 .实时检查增量数据,是否一致;

由于主库与从库不及时同步而导致的不一致称为延迟问题;

对于一致性要求不那么严格的场景,只需要保证最终的一致性即可

对于延迟问题,需要根据业务场景的特点进行分析,从应用层面增加策略来解决这个问题

例如:

1 .新注册的用户必须先查询主库;

2 .注册成功后,需要等待3s再跳。 后台此时正在进行数据同步。

第四,分布式缓存的体系结构设计

1 .体系结构设计

redis是单点,因此必须在项目中使用,并且必须自己实现分布式。 基本体系结构图如下:

2 .分布式实施

通过key进行一致散列,key实现与redis节点对应的分布。

实现一致性散列:

l散列值计算:通过支持MD5和MurmurHash两种计算方式,默认情况下采用MurmurHash,实现高效的散列计算。

实现l一致性:通过java的TreeMap模拟环状结构,实现均匀分布

3 .客户端选择

p>

对于jedis修改的主要是分区模块的修改,使其支持了跟据BufferKey进行分区,跟据不同的redis结点信息,可以初始化不同的 ShardInfo,同时也修改了JedisPool的底层实现,使其连接pool池支持跟据key,value的构造方法,跟据不同 ShardInfos,创建不同的jedis连接客户端,达到分区的效果,供应用层调用

4.模块的说明

l        脏数据处理模块,处理失败执行的缓存操作。

l        屏蔽监控模块,对于jedis操作的异常监控,当某结点出现异常可控制redis结点的切除等操作。

整个分布式模块通过hornetq,来切除异常redis结点。对于新结点的增加,也可以通过reload方法实现增加。(此模块对于新增结点也可以很方便实现)

对于以上分布式架构的实现满足了项目的需求。另外使用中对于一些比较重要用途的缓存数据可以单独设置一些redis结点,设定特定的优先级。另外对 于缓存接口的设计,也可以跟据需求,实现基本接口与一些特殊逻辑接口。对于cas相关操作,以及一些事物操作可以通过其watch机制来实现。

声明:所有博客服务于分布式框架,作为框架的技术支持及说明,框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。