redis cluster

redis cluster
  • 支撑N哥redis master node,每个master node都可以挂载多个slave node。
  • 读写分离的架构,对于每个master来说,写就写在master,然后读就丛master对应的slave去读。
  • 高可用,因为每个master都有slave节点,那么如果master挂掉,redis cluster这套机制,就会自动将某个slave切换成master。

redis cluster 与replication + sentinal

如果数据量少,主要承载高并发高性能的场景,比如缓存一般几个G,单机足够。
redis cluster,主要针对海量数据+高并发+高可用的场景。


分布式数据存储的核心算法
hash算法 -> 一致性hash算法 -> redis cluster的hash slot算法。

hash slot算法:
redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。
redis cluster中每个master都会持有部分slot
hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上


redis cluster hash slot算法.png
一致性hash算法的讲解和优点.png
一致性hash算法的虚拟节点实现负载均衡.png
最老土的hash算法以及弊端.png

redis cluster 节点间采用gossip协议进行通信

跟集中式的不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是相互不断的通信,保持整个集群所有节点的数据是完整的。

集中式:
  • 优点:元数据的更新和读取,时效性非常好,一旦元数据出现了更新,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到。
  • 缺点:所有元数据更新压力放在一个地方,可能会导致元数据的存储有压力。
gossip:
  • 优点:元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有的节点上去更新,有一定的延迟,降低了压力。
  • 缺点:元数据更新有一定延时,可能导致集群的一些操作会有滞后。

gossip协议

gossip协议包括多种消息,包括ping,pong,meet,fail等等。

meet:

某个节点发送meet给新加入的节点,让新节点加入集群种,然后新节点就会开始与其他节点进行通信。
其实内部就是发送了一个gossip meet消息,给新加入的节点,通知那个节点去加入到我们的集群

ping:

每个节点都会频繁给其他节点发送ping,其中包括自己的状态还有自己维护的集群元数据,互相通过ping交换元数据。

pong:

返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新。

fail:

某个节点判断另一个节点fail之后,就会发送fail给其他节点,通知其他节点,指定节点宕机了。


ping消息深入:

ping很频繁,而且要携带一些元数据,所以可能会加重网络负担,每个节点每秒会执行10次ping,每次会选择5个最久没有通信的其他节点。
当然如果发现某个节点通信延迟达到cluster_node_timeout /2,那么立即发送ping,避免数据交换延时过长,落后时间太长。
比如,两个节点之间都10分钟没有交换数据了,那么整个集群处于严重的元数据不一致情况,就会有问题。
所以cluster_node_timeout可以调节,比如调节比较大,那么会降低发送的频率。
每次ping,一个是带上自己节点的信息,还有就是带上1/10其他节点的信息,发送出去,进行数据交换,至少包含3个其他节点信息,最多包含总节点-2个其他节点信息。


面向集群的jedis内部实现原理
开发,jedis redis的java client客户端,redis cluster,jedis cluster api,jedis cluster api与redis cluster集群交互的一些基本原理。
基于重定向的客户端 redis-cli -c,自动重定向
  • 请求重定向
    客户端可能会挑选任意一个redis实例去发送命令,每个redis实例接收到命令,会计算key对应的hash slot,如果在本地就在本地处理,否则返回moved给客户端,让客户端进行重定向。
    cluster keyslot mykey,可以查看一个key对应的hash slot是什么,用redis-cli时候,可以加入-c参数,支持自动请求重定向,redis-cli接收到moved之后,会自动重定向到对应的节点执行命令。
  • 计算hash slot
    计算hash slot算法,就是根据key计算CRC16的值,然后对16384取模,拿到对应的hash slot,用hash tag可以手动指定key对应的slot,同一个hash tag下的key,都会在一个hash slot中。
  • hash slot查找
    节点间通过gossip协议进行数据交换,就知道每个hash slot在哪个节点上。
smart jedis
  • 什么是smart jedis
    基于重定向的客户端,很消耗网络io,因为大部分情况,可能都会出现一次重定向请求,才能找到正确的节点。所以大部分的客户端,比如java redis客户端,就是jedis ,都是smart的,本地维护一份hashslot ->node的映射表,缓存,大部分情况下,直接走本地缓存就可以找到hashslot->node,不需要通过节点进行moved重定向。
  • jedisCluster的工作原理
    在jedsicluster初始化的时候,就会随机选择一个node,初始化hashslot->node映射表,同时为每个节点创建一个jedispool连接池,每次基于jedisCluster执行操作的时候,首先JedisCluster都会在本地计算Key的hashSlot,然后再本地映射表找到对应节点。
    如果那个node正好还是持有那个hashslot,那么就ok; 如果说进行了reshard这样的操作,可能hashslot已经不在那个node上了,就会返回moved。
    如果JedisCluter API发现对应的节点返回moved,那么利用该节点的元数据,更新本地的hashslot -> node映射表缓存
    重复上面几个步骤,直到找到对应的节点,如果重试超过5次,那么就报错,JedisClusterMaxRedirectionException。
  • hashslot迁移和重定向
    如果hash slot正在迁移,那么会返回ask重定向给jedis
    jedis接收到ask重定向之后,会重新定位到目标节点去执行,但是因为ask发生在hash slot迁移过程中,所以jediscluster API收到ask就不会更新hashslot本地缓存。
    已经确保hashslot已经迁移完了,moved是会更新本地hashslot->node映射表缓存的。

高可用性与主备切换
redis cluster的高可用的原理,几乎跟哨兵是类似的
  • 判断节点宕机
    如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机
    如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机,跟哨兵的原理几乎一样,sdown,odown
    在cluster-node-timeout内,某个节点一直没有返回pong,那么就被认为pfail
    如果一个节点认为某个节点pfail了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail
  • 从节点过滤
    对宕机的master node,从其所有的slave node中,选择一个切换成master node
    检查每个slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master
    这个也是跟哨兵是一样的,从节点超时过滤的步骤
  • 从节点选举
    哨兵:对所有从节点进行排序,slave priority,offset,run id
    每个从节点,都根据自己对master复制数据的offset,来设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举
    所有的master node开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成master
    从节点执行主备切换,从节点切换为主节点
  • 与哨兵比较
    整个流程跟哨兵相比,非常类似,所以说,redis cluster功能强大,直接集成了replication和sentinal的功能
gossip协议维护集群元数据.png
集中式的集群元数据存储和维护.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容