redis-cluster集群--下篇

  上篇说到redis集群中有7000,7001,7002,7003,7004,7005节点,其中7000负责0-5000,7002负责5001-10000,7004负责10001-16383。

  如果集群进行了扩容,新加入了7006节点,需要把7004中15000-16383区间的slots交给7006节点处理,如何做到线上迁移的同时不影响业务的呢?

  假设7004节点正在迁移16111 slot,其中hello和world这两个key属于16111。hello已经迁移到7006,但world还未迁移完成。此时客户端如果在7004节点上执行get 'world',7004会直接返回结果。但如果执行get ‘hello’,7004会判断自己是否正在迁移该slot,如果正在迁移,会返回客户端ASK错误,将客户端重定向到7006节点,如果没在迁移,会返回客户端key不存在。

  当客户端收到了ASK错误后,客户端会携带ASK标识,去7006节点执行get ‘hello’,7006节点同样会判断‘hello’的slot是否属于自己处理,由于16111 slot还未迁移完成,所以还不属于自己处理,7006就会去判断是否自己正在导入该slot,如果是,同时客户端带有ASK标识,就执行get ‘hello’,否则,就返回我们上篇说的MOVED错误。

上篇中提到,如果从节点也负责读取,会有什么问题呢?

为了保证数据一致性,从节点的数据全部来自于主节点,这其中也包含过期键的处理。假设hello键已经过期,客户端在主节点上执行get hello,主节点会删除该key,并通知从节点。但如果在从节点上执行get hello,从节点并不会判断键是否过期,而会直接返回给客户端。所以需要客户端自己去判断键是否已经过期。

  redis-cluster提供了集群管理工具redis-trib,很好用。

  https://www.jianshu.com/p/21f67bd739cc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容