高并发7-Redis高可用集群扩展-一致性Hash算法-twemproxy实现hash分片
是不是只学习master cluster就行了
- 分析cluster集群方式原理
- 水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中。 分片是一种基于数据库分成若干片段的传统概念扩容技术,它将数据库分割成多个碎片并将这些碎片放置在不同的服务器上。
- 垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。按照业务维度将不同数据放入不同的表
- 故障转移
* 通过gossip节点信息同步实现,实现slave作为master的备份节点,并实现故障剔除master节点采用slave替换,并在替换完之后将结果通知到其他节点。
- Twitter推特公司twemproxy服务端分片和客户端分片集群解决方案
----------------------------------------------------------------------------------客户端分片-----------------------------------------------------------------------------
一致性Hash算法
- 2的32次方进行hash取模 0到2的32次方-1
- jedis分布式之 ShardedJedisPool (一致性Hash分片算法)
- 概念:
分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用
- 做法:
* hash环上顺时针从整数0开始,一直到最大正整数,我们根据四个ip计算的hash值肯定会落到这个hash环上的某一个点,至此我们把服务器的四个ip映射到了一致性hash环
* 当用户在客户端进行请求时候,首先根据hash(用户id)计算路由规则(hash值),然后看hash值落到了hash环的那个地方,根据hash值在hash环上的位置顺时针找距离最近的ip作为路由ip
- 一致性hash的特性
* 单调性(Monotonicity),单调性是指如果已经有一些请求通过哈希分派到了相应的服务器进行处理,又有新的服务器加入到系统中时候,应保证原有的请求可以被映射到原有的或者新的服务器中去,而不会被映射到原来的其它服务器上去。
* 分散性(Spread):分布式环境中,客户端请求时候可能不知道所有服务器的存在,可能只知道其中一部分服务器,在客户端看来他看到的部分服务器会形成一个完整的hash环。如果多个客户端都把部分服务器作为一个完整hash环,那么可能会导致,同一个用户的请求被路由到不同的服务器进行处理。这种情况显然是应该避免的,因为它不能保证同一个用户的请求落到同一个服务器。所谓分散性是指上述情况发生的严重程度。好的哈希算法应尽量避免尽量降低分散性。 一致性hash具有很低的分散性
* 平衡性(Balance):平衡性也就是说负载均衡,是指客户端hash后的请求应该能够分散到不同的服务器上去。一致性hash可以做到每个服务器都进行处理请求,但是不能保证每个服务器处理的请求的数量大致相同
一致性Hash算法虚拟节点
通过虚拟节点倾斜解决方案,均匀一致性hash
- 出现问题分析:
部分hash节点下架之后,虽然剩余机器都在处理请求,但是明显每个机器的负载不均衡,这样称为一致性hash的倾斜,虚拟节点的出现就是为了解决这个问题。
- 增设虚拟节点
当物理机器数目为A,虚拟节点为B的时候,实际hash环上节点个数为A*B,将A节点分部为A1,A2,A3;将A1、A2、A3平均分布在各个位置,使A服务的节点尽量均匀分配在各个角落
- 每台服务器负载相对均衡
当某个节点挂了之后,其数据均衡的分布给相邻的顺时针后面的一个节点上面,故所有数据比之前所述一致性hash相对均衡
----------------------------------------------------------------------------------服务端分片-----------------------------------------------------------------------------
twemproxy实现hash分片
服务端hash分片的工具:
twitter:twemproxy
豌豆荚:codis
- 概念:
Twemproxy,也叫nutcraker。是一个twitter开源的一个redis和memcache快速/轻量级代理服务器; Twemproxy是一个快速的单线程代理程序,支持Memcached 和Redis。Redis代理中间件twemproxy是一种利用中间件做分片的技术。twemproxy处于客户端和服务器的中间,将客户端发来的请求,进行一定的处理后(sharding),再转发给后端真正的redis服务器
- 作用:
Twemproxy通过引入一个代理层,可以将其后端的多台Redis或Memcached实例进行统一管理与分配,使应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有多少个真实的Redis或Memcached存储
- 特性:
* 支持失败节点自动删除
* 可以设置重新连接该节点的时间
* 可以设置连接多少次之后删除该节点
* 减少了客户端直接与服务器连接的连接数量
* 自动分片到后端多个redis实例上
* 多种哈希算法
* md5,crc16,crc32,crc32a,fnv1_64,fnv1a_64,fnv1_32,fnv1a_32,hsieh,murmur,jenkins
* 多种分片算法
* ketama(一致性hash算法的一种实现),modula,random