导读
本章我们将要讲解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.