2.分布式实现
通过key做一致性哈希,实现key对应redis结点的分布。
一致性哈希的实现:
l hash值计算:通过支持MD5与MurmurHash两种计算方式,默认是采用MurmurHash,高效的hash计算。
l 一致性的实现:通过java的TreeMap来模拟环状结构,实现均匀分布
3.client的选择
对于jedis修改的主要是分区模块的修改,使其支持了跟据BufferKey进行分区,跟据不同的redis结点信息,可以初始化不同的ShardInfo,同时也修改了JedisPool的底层实现,使其连接pool池支持跟据key,value的构造方法,跟据不同ShardInfos,创建不同的jedis连接客户端,达到分区的效果,供应用层调用
4.模块的说明
l 脏数据处理模块,处理失败执行的缓存操作。
l 屏蔽监控模块,对于jedis操作的异常监控,当某结点出现异常可控制redis结点的切除等操作。
整个分布式模块通过hornetq,来切除异常redis结点。对于新结点的增加,也可以通过reload方法实现增加。(此模块对于新增结点也可以很方便实现)
对于以上分布式架构的实现满足了项目的需求。另外使用中对于一些比较重要用途的缓存数据可以单独设置一些redis结点,设定特定的优先级。另外对于缓存接口的设计,也可以跟据需求,实现基本接口与一些特殊逻辑接口。对于cas相关操作,以及一些事物操作可以通过其watch机制来实现。(参考我以前写的redis事物介绍)
1.Mysql日志格式介绍可参考我以前的的介绍。
2.对于使用MIXED日志格式,此日志格式,记录的是对应数据库操作的SQL语句,采用此日志方式存在的问题:
l 对于一些未任何更新操作的SQl语句,像条件不满足,对应的sql也会记录到binlog日志中。
l SQL语句记录的未必包括所有的更新操作。
l 对于一些分布式数据库,对于SQL中的where条件指定的是非均衡字段,也许会存在多条SQL,跟设计有关!
基于以上考虑,采用MIXED的日志格式进行binlog解析是行不通的。(官网给出的指示是failed statementsare not logged ,但不包括语法没错误,更新条件不符合对应的SQL)
3.采用ROW日志格式
对于此日志格式,每行变化都有对应的记录,此日志格式,对于解析及采集数据都是非常方便的,也只有采用此日志格式,才能基于binlog修改,做刷新缓存相关方案的设计。但是基于此日志格式也存在一些问题:
l 需要考虑项目中是否有大量的批量的update操作,如果采用此日志格式,批量操作每一行修改都会记录一条日志,大量的批量操作所产生的日志量,以及所带来的IO开销是否可以接受。
通过以上分析,最终项目中还是考虑基于ROW日志格式进行缓存刷新,还有一个问题需要考虑,在应用层DB进行了相应的update操作后,所产生的Binlog是会带来一定的延迟,如果Binlog处理模块正常运行,数据是的延迟会非常少,MS级别以内,对用户体验是没有感知的,但是Binlog模块是多点,异常,以及相应的延迟肯定会是存在的,这样,缓存数据肯定会存在脏数据。
不过通过以上方案,数据能达到最终一致性,因此how to权衡,需要考虑。
通过以上分析,是否采用Binlog来做缓存数据刷新相信大家有一个基本概念了
2.分布式实现
通过key做一致性哈希,实现key对应redis结点的分布。
一致性哈希的实现:
l hash值计算:通过支持MD5与MurmurHash两种计算方式,默认是采用MurmurHash,高效的hash计算。
l 一致性的实现:通过java的TreeMap来模拟环状结构,实现均匀分布
3.client的选择
对于jedis修改的主要是分区模块的修改,使其支持了跟据BufferKey进行分区,跟据不同的redis结点信息,可以初始化不同的ShardInfo,同时也修改了JedisPool的底层实现,使其连接pool池支持跟据key,value的构造方法,跟据不同ShardInfos,创建不同的jedis连接客户端,达到分区的效果,供应用层调用
4.模块的说明
l 脏数据处理模块,处理失败执行的缓存操作。
l 屏蔽监控模块,对于jedis操作的异常监控,当某结点出现异常可控制redis结点的切除等操作。
整个分布式模块通过hornetq,来切除异常redis结点。对于新结点的增加,也可以通过reload方法实现增加。(此模块对于新增结点也可以很方便实现)
对于以上分布式架构的实现满足了项目的需求。另外使用中对于一些比较重要用途的缓存数据可以单独设置一些redis结点,设定特定的优先级。另外对于缓存接口的设计,也可以跟据需求,实现基本接口与一些特殊逻辑接口。对于cas相关操作,以及一些事物操作可以通过其watch机制来实现。(参考我以前写的redis事物介绍)
1.Mysql日志格式介绍可参考我以前的的介绍。
2.对于使用MIXED日志格式,此日志格式,记录的是对应数据库操作的SQL语句,采用此日志方式存在的问题:
l 对于一些未任何更新操作的SQl语句,像条件不满足,对应的sql也会记录到binlog日志中。
l SQL语句记录的未必包括所有的更新操作。
l 对于一些分布式数据库,对于SQL中的where条件指定的是非均衡字段,也许会存在多条SQL,跟设计有关!
基于以上考虑,采用MIXED的日志格式进行binlog解析是行不通的。(官网给出的指示是failed statementsare not logged ,但不包括语法没错误,更新条件不符合对应的SQL)
3.采用ROW日志格式
对于此日志格式,每行变化都有对应的记录,此日志格式,对于解析及采集数据都是非常方便的,也只有采用此日志格式,才能基于binlog修改,做刷新缓存相关方案的设计。但是基于此日志格式也存在一些问题:
l 需要考虑项目中是否有大量的批量的update操作,如果采用此日志格式,批量操作每一行修改都会记录一条日志,大量的批量操作所产生的日志量,以及所带来的IO开销是否可以接受。
通过以上分析,最终项目中还是考虑基于ROW日志格式进行缓存刷新,还有一个问题需要考虑,在应用层DB进行了相应的update操作后,所产生的Binlog是会带来一定的延迟,如果Binlog处理模块正常运行,数据是的延迟会非常少,MS级别以内,对用户体验是没有感知的,但是Binlog模块是多点,异常,以及相应的延迟肯定会是存在的,这样,缓存数据肯定会存在脏数据。
不过通过以上方案,数据能达到最终一致性,因此how to权衡,需要考虑。
通过以上分析,是否采用Binlog来做缓存数据刷新相信大家有一个基本概念了