六、redis中AKF问题解决方案

导读

前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容框架进行了一个梳理。

二、redis中String和List两种数据类型和应用场景 】、【二、redis中Hash、Set、SortedSet应用场景 】两篇文章我们对redis中String、List、Hash、Set、SortedSet五种数据类型做了一下讲解,并且对他们各自的应用场景进行了介绍。

三、redis数据存储之跳跃表(SKIP LIST) 】深入学习了支撑SortedSet排序背后的数据结构,跳跃表;

【四、redis持久化之RDB与AOF 】学习了redis中的两种持久化策略:RDB(快照)和AOF(追加日志);
五、redis集群进化过程 】文章中我们学习了redis集群的进化过程,包括解决单点故障问题和性能瓶颈问题等。

本章我们将要讲解Redis使用过程中及集群进化过程中AKF问题的解决方案。

在这里插入图片描述如果大家在工作、学习、面试中针对redis还有什么疑问或者其他问题,可以评论区告诉我。
为了保证可以连续不间断地获取最新的技术分析及讲解,建议关注本博客【不吃_花椒】。

图示

在这里插入图片描述

解释

AKF(X-Y-Z)问题:

1.X轴:主从复制的全量同步解决了单点故障问题,也就是AKF理论中的X轴。

2.Y轴:按照不同的业务使用不同的redis服务。订单、用户、支付等都使用不同的服务。也就是AKF理论中的Y轴。

3.Z轴:解决单业务中的数据膨胀问题,使用分片模式。使用哈希取摩等散列算法进行散列。例如用户信息、订单信息、商品详情等日请求数据量特别大的问题。

同业务分治需要解决的问题:客户端散列、代理层散列(Twemproxy)、redis集群散列(包含散列路由、无主模型)

1.分区的好处

分区可以让redis管理更大的内存,redis将可以使用所有机器的内存;

分区可以使redis的计算能力通过简单的增加计算机得到成倍的提升,redis的网络带宽也会随着计算机和网卡的增加而成倍的增长;

2.分区的概念

范围分区:

将不同范围的对象映射到不同的redis实例。比如用户ID从0-10000的都被存储到R0,用户ID从10001到20000被存储到R1,依次类推。需要redis中key的形式为object_name:形式。这种分区方案需要维护一张数据到redis实例的映射关系。

-效率较低,要求高。

散列分区:

散列分区分两步进行。

①使用散列然互(如crc32)将redis的键名转换成一个数字。例如:键foobar,使用crc32(foobar)函数将产生散列值93024922.

②对转换后的散列值进行取模运算,以产生一个0-3的数字,以便可以使这个key映射到4个redis实例的其中一个。93024922%4等于2,所以foobar会被存储到第2个redis实例。

-效率高,伸缩性差。

一致性哈希分区:

一致性哈希算法可以按照不同的业务特点进行哈希倾斜或增加虚拟哈希节点形成均匀的一致性哈希环。

一致性哈希算法分为以下几步

① 先计算各个节点(ip:port)的哈希值,哈希值是一个0-Integer.MAX_VALUE之间的值。


0-Integer.MAX_VALUE按照顺时针形成一个封闭的哈希环,计算出的哈希值会落到这个hash环的某个点上,至此我们把多个服务器分散映射到了哈希环上。


当用户在客户端进行请求时,首先根据hash(用户id)计算路由规则(hash值),然后看hash值落到哈希环的那个位置,根据哈希值在哈希环的位置顺时针找距离最近的IP作为路由的服务IP。

一致性哈希算法需要注意以下几个特性:
单调性(如果一些请求通过哈希分派到了相应的服务器进行处理,又有新服务器加入系统时候,应保证原有的请求可以被映射到原有的或者新的服务器中而不会被映射到其他服务器)、分散性(好的哈希算法应该尽量避免尽量降低分散性)、
平衡性(指负载均衡,客户端hash后的请求应该能够分散到不同的服务器上去,并且每个服务器处理的请求数量大致相同)

3.不同的分区实现方案-分区可以在程序的不同层次实现

客户端分区:

在客户端就已经决定了数据会被存储到哪个redis节点。

代理分区:

客户端把请求发送给代理程序,代理程序根据分区规则把数据发送到不同的redis节点,然后根据redis的响应结果返回给客户端。Redis和memcached都使用同一种代理实现Twemproxy。

查询路由:

客户端可以随机的向任何一个redis服务器发送请求,由redis服务器集群内部根据算法把请求转发到正确的redis服务器。RedisCluster实现了一种混合形式的查询路由,但并不是在内部由一个redis转发到正确的redis,而是在客户端的帮助下直接redirected(重定向)到正确的redis节点。

4.分区的缺点

①多个key之间的交集、并集等操作不再刻意进行;

②同时操作多个key时候,不再可以使用事物;

③数据备份会非常复杂,需要到不同的服务器进行RDB文件和AOF文件的备份;

④动态伸缩非常复杂(目前只有在redis集群中才可以实现最大程度的对用户透明的数据再平衡,但是其他一些客户端分区和代理分区则不支持该特性),除了redis集群外,还有预分片技术。

6.使用预分片技术可以解决redis作为持久化存储时的动态扩容/缩容问题。

使用redis主从复制技术可以很快解决数据迁移问题。

7.redis分区实现:

①redis集群技术是自动分片和高可用的首选方案(20150401后可用)。

②twemproxy 是twitter维护的缓存代理系统。代理memcached的ASCII协议和redis协议。

① 支持一致性哈希的客户端如redis-rb和Predis.

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒

后续redis中将要讲解的内容梳理

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

往期文章

Redis

一、深入理解redis之需要掌握的知识点

二、redis中String和List两种数据类型和应用场景

二、redis中基础数据类型Hash、Set、SortedSet及其应用场景

三、redis数据存储之跳跃表(SKIP LIST)

四、redis持久化之RDB与AOF

五、redis集群进化过程简单梳理

Java集合

一、深入理解-Java集合初篇

二、Jdk1.7和1.8中HashMap数据结构及源码分析

三、JDK1.7和1.8HashMap数据结构及源码分析-续

四、深入理解Java中的HashMap「网易面试快答」

五、深入理解JDK1.7中HashMap哈希冲突解决方案

六、深入理解JDK1.8中HashMap哈希冲突解决方案

七、JDK1.7中HashMap扩容机制

八、JDK1.8中HashMap扩容机制

Java-IO体系

一、C10K问题经典问答

二、java.nio.ByteBuffer用法小结

三、Channel 通道

四、Selector选择器

五、Centos-Linux安装nc

六、windows环境下netcat的安装及使用

七、IDEA的maven项目的netty包的导入(其他jar同)

八、JAVA IO/NIO

九、网络IO原理-创建ServerSocket的过程

十、网络IO原理-彻底弄懂IO

十一、JAVA中ServerSocket调用Linux系统内核

十二、IO进化过程之BIO

十三、Java-IO进化过程之NIO

十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型

十五、使用Selector(多路复用器)实现Netty中Reactor主从模型

十六、Netty入门服务端代码

十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒