感谢doyoubi提供这么好的项目,原文:https://github.com/doyoubi/undermoon/blob/master/docs/redis_cluster_protocol。mdRedisCluster是官方提供的Redis分布式解决方案,支持分片(sharding)和故障转移(failover)。与使用单实例redis相比,连接RedisCluster的客户端需要实现RedisClusterClientProtocol。它基本上做的是:如果我们没有将命令发送到正确的节点,则重定向请求。从CLUSTERNODES和CLUSTERSLOTS命令中的任一个缓存集群路由表。此类客户端称为智能客户端。https://redis.io/topics/cluster-tutorial为了兼容现有的Redis客户端,还有一些RedisClusterProxies,比如redis-cluster-proxy(官方)、aster、corvus和samaritan,来使集群协议适应范围广泛的受支持的单实例协议。https://github.com/RedisLabs/redis-cluster-proxyhttps://github.com/wayslog/asterhttps://github.com/eleme/corvushttps://github.com/samaritan-proxy/samaritanUndermoon是怎么来的《RedisClusterProtocol》的实现?Undermoon实现了基于服务器端代理或ServerProxy的RedisClusterProtocol。ServerProxy将像官方RedisClusterRedis一样工作,并在需要时返回重定向响应。为什么要实现另一个“RedisClusterProtocol”?该实现不仅支持横向扩展和高可用,还可以让你构建一个自我管理的分布式Redis,支持:Redis资源池管理,为不同用户提供多个集群将流量洪流均匀分散到所有物理机快速扩展运维和Kubernetes集成更容易。为什么服务器端代理?Redis和大多数redis代理(如redis-cluster-proxy、corvus、aster、codis)都部署在不同的机器上,因为代理通常需要将请求分发到不同的Redis实例。Server-sideProxy不是路由请求,而是扮演与这些代理不同的角色,类似于Redis的集群模块,通过使用一些定制的迁移协议使其能够快速迁移数据和扩展。Server-sideProxy下面是Server-sideProxy和RedisClusterProtocol的一小部分操作。首先运行一个redis-server。$redis-server构建并运行server_proxy,运行在端口5299并将命令转发到127.0.0.1:6379。>cargobuild>makeserver>redis-cli-p5299#通过`UMCTL`命令初始化代理。127.0.0.1:5299>UMCTLSETCLUSTERv21NOFLAGSmydb127.0.0.1:637910-8000PEER127.0.0.1:700018001-16383#完成!我们可以像RedisCluster一样使用它!#与官方的RedisCluster不同,这里只显示master节点#而不是同时显示master和replica。127.0.0.1:5299>CLUSTERNODESmydb________________9f8fca2805923328____127.0.0.1:5299myself,master-001connected0-8000mydb________________d458dd9b55cc9ad9____127.0.0.1:7000master-001connected8001-16383#当我们使用UMCTLSETCLUSTER初始化它时,#插插槽8001-16383属于另一个服务器代理127.0.0.1:7000#所以我们得到重定向响应。##这是普通Redis客户端和RedisCluster客户端之间的关键区别#因为我们需要处理重定向。127.0.0.1:5299>geta(error)MOVED15495127.0.0.1:7000#key'b'是这个代理负责的,所以我们处理请求。127.0.0.1:5299>设置b1OK
