`

集群访问

 
阅读更多

集群访问

客户端在初始化的时候只需要知道一个节点的地址即可,客户端会先尝试向这个节点执行命令,比如“get key”,如果key所在的slot刚好在该节点上,则能够直接执行成功。如果slot不在该节点,则节点会返回MOVED错误,同时把该slot对应的节点告诉客户端。客户端可以去该节点执行命令。目前客户端有两种做法获取数据分布表,一种就是客户端每次根据返回的MOVED信息缓存一个slot对应的节点,但是这种做法在初期会经常造成访问两次集群。还有一种做法是在节点返回MOVED信息后,通过cluster nodes命令获取整个数据分布表,这样就能每次请求到正确的节点,一旦数据分布表发生变化,请求到错误的节点,返回MOVED信息后,重新执行cluster nodes命令更新数据分布表。

在访问集群的时候,节点可能会返回ASK错误。这种错误是在key对应的slot正在进行数据迁移时产生的,这时候向slot的原节点访问,如果key在迁移源节点上,则该次命令能直接执行。如果key不在迁移源节点上,则会返回ASK错误,描述信息会附上迁移目的节点的地址。客户端这时候要先向迁移目的节点发送ASKING命令,然后执行之前的命令。

这些细节一般都会被客户端sdk封装起来,使用者完全感受不到访问的是集群还是单节点。

集群支持hash tags功能,即可以把一类key定位到同一个节点,tag的标识目前支持配置,只能使用{},redis处理hash tag的逻辑也很简单,redis只计算从第一次出现{,到第一次出现}的substring的hash值,substring为空,则仍然计算整个key的值,这样对于foo{}{bar}、{foo}{bar}、foo这些冲突的{},也能取出tag值。使用者需遵循redis的hash tag规范。

127.0.0.1:6379> CLUSTER KEYSLOT foo{hash_tag}
(integer) 2515
127.0.0.1:6379> CLUSTER KEYSLOT fooadfasdf{hash_tag}
(integer) 2515
127.0.0.1:6379> CLUSTER KEYSLOT fooadfasdfasdfadfasdf{hash_tag}
(integer) 2515
集群版本的redis能够支持全部的单机版命令。不过还是有些命令会有些限制。

订阅在使用上与单机版没有任何区别。订阅功能通过集群间共享publish消息实现的,客户端可以向任意一个节点(包括slave节点)订阅消息,然后在一个节点上执行的publish命令,该节点会把该命令传播给集群内的每个节点,这样订阅该消息的客户端就能收到该命令。

redis集群版只使用db0,select命令虽然能够支持select 0。其他的db都会返回错误。
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 1
(error) ERR SELECT is not allowed in cluster mode
redis集群版对多key命令的支持,只能支持多key都在同一个slot上,即使多个slot在一个节点上也不行。

127.0.0.1:6379> mget key7 key28
(error) CROSSSLOT Keys in request don't hash to the same slot
事务的支持只能在也一个slot上完成。MULTI命令之后的命令的key必须都在同一个slot上,如果某条命令的key对应不在相同的slot上,则事务直接回滚。迁移的时候,在迁移源节点执行命令的key必须在移原节点上存在,否则事务就会回滚。在迁移目的节点执行的时候需要先执行ASKING命令再执行MULTI命令,这样接下来该slot的命令都能被执行。可以看出,对于单key和相同hash tags的事务,集群还是能很好的支持。

在迁移的时候有个地方需要注意,对于多key命令在迁移目的节点执行时,如果多个key全在该节点上,则命令无法执行。如下所示,key和key14939对应的slot为12539,执行命令的节点是迁移目的节点:

127.0.0.1:6379> asking
OK
127.0.0.1:6379> mget key key14939
(error) TRYAGAIN Multiple keys request during rehashing of slot

分享到:
评论

相关推荐

    apache Tomcat 集群 访问问题

    Apache Tomcat集群访问问题主要涉及的是在高并发或者负载均衡场景下,如何通过配置多个Tomcat实例来提高Web服务的可用性和性能。集群允许将请求分发到多个服务器上,从而实现负载均衡,并且提供了故障转移的能力,...

    elasticsearch开启ssl安全认证和跨集群访问配置

    本人记录了elasticsearch开启ssl安全认证和跨集群访问配置

    阿里云redis集群公网访问

    阿里云redis集群公网访问,百分之百成功率。亲自试验,详细步骤。

    hadoop集群高可用搭建

    - 在`core-site.xml`中配置HDFS的默认文件系统为Hadoop服务名(如myha01),指定Hadoop的工作目录,以及ZooKeeper集群访问地址。 - 在`hdfs-site.xml`中设置数据副本数(如`dfs.replication`设置为2),并且指定...

    阿里云公网redis集群搭建以及java访问redis集群

    阿里云公网Redis集群搭建及Java访问教程 在云计算日益普及的今天,阿里云提供了便捷的公共服务,如Redis缓存服务,帮助企业或个人快速构建高效、可靠的分布式应用。本教程将详细讲解如何在阿里云上搭建公网Redis...

    weblogic集群(适用于WebLogic Server 9.2)

    ### 集群访问与 Proxy Server Proxy Server 通常用于在客户端和集群之间提供透明的访问。配置 Proxy Server 时,需要在同一个 Domain 下创建一个新的 Managed Server,然后配置其作为代理。Proxy Server 能够接收...

    VMWARE 虚拟机集群搭建.doc

    5. **网络存储设置**:配置虚拟交换机,添加VMkernel,设定IP地址和网关,使存储能够被集群访问。接着,设置ISCSI存储,添加网络存储地址,最后在存储器中看到新的存储设备。 通过以上步骤,一个完整的VMware虚拟机...

    Was7集群部署、IHS搭建及HTTPS的实现方式

    - 修改IHS的配置文件,如httpd.conf,以确保正确的集群访问配置。 6. **启动IHS服务并验证:** - 启动IHS服务。 - 测试访问Was7集群的应用程序。 --- #### 配置访问集群的HTTPS 为了提高安全性,可以通过配置...

    Oracle RAC集群在Windows2003环境下的实现.pdf

    在软件组件层面,Oracle RAC集群由多台服务器构成,每台服务器有自己的监听器(Listener)监听网络端口,Oracle RAC服务负责数据库的集群访问,集群就绪服务(Clusterware)用于集群管理。所有服务器通过操作系统...

    华为GaussDB(DWS)最佳实践系列之集群操作类.md

    5. 配置集群访问白名单:通过命令gs_gucset,用户可以设置允许连接到集群的主机白名单。例如,-Zcoordinator-Nall-Iall-h"hostalljack**.**.*.**/32sha256"可以限定只允许IP为**.**.*.**的主机连接到集群。 6. 清理...

    阿云里redis集群安装远程访问

    **Redis集群安装与远程访问详解** 在现代互联网应用中,Redis作为一款高性能的键值存储系统,被广泛用于缓存、消息队列等场景。阿里云提供了便捷的Redis服务,但有时我们需要自建Redis集群以满足特定需求。本文将...

    c#.net客户端与redis集群

    最全的教程部署redis cluster方式集群,及c# 写的访问集群的源码,自己的下载分数快不够,赚2分,教程地址:http://www.cnblogs.com/uucode/p/6486395.html

    PHP访问数据库集群的方法小结

    在构建高可用性和可扩展性的Web应用时,数据库集群是一个重要的解决方案。... 1. 自动判断SQL类型进行连接: 这种方法在初始化DB类时,会同时连接到读写两...通过不断学习和实践,可以更好地应对各种数据库集群访问挑战。

    kettle集群及动态集群设置

    6. **查看子服务器状态**:在主服务器的浏览器中访问`http://ip地址:8080/kettle/getSlaves`,查看可用子服务器列表。 7. **集群作业与转换的配置和监控**:与固定集群方式相同。 在Kettle的集群环境中,主服务器...

    linux 实现nginx+Lua 访问redis集群

    最近有个需求是需要用nginx播放服务器的视频,考虑安全问题,需要在nginx加个lua去取redis的token进行验证,刚开始访问测试环境单机还挺好用,可是要访问生产的是集群环境,找了多了资料趟了数不尽的坑,最终形成这...

    Java访问Hadoop集群源码

    在Java编程环境中,访问Hadoop集群是一项常见的任务,特别是在大数据处理和分析的场景下。Hadoop是一个开源框架,主要用于存储和处理大规模数据集。本文将深入探讨如何利用Java API来与Hadoop集群进行交互,包括读取...

    安装基于RHCS集群存储的Mysql HA集群

    当至少有(N/2)+1个节点能访问qdisk时,集群可以正常运行,其中N为总节点数。qdiskd服务定期检查并更新节点状态,确保仲裁的有效性。 其次,Global Network Block Device (GNBD)提供了集群间的块级存储共享。GNBD...

    AgiSoft PhotoScan集群部署使用指导

    - 设置共享目录:需要设置一个网络共享目录,用于存放照片数据和项目文件,以便集群中的所有计算机都可以访问。 - 共享照片和项目文件目录:确保所有参与集群的计算机都可以访问照片和项目文件目录。这一步骤确保...

    spring_cloud_gateway负载均衡,动态路由

    demo_01,demo_02,demo_03 这三个服务相当于是集群的微服务 gateway这个服务是 springcloude gateway + ribbon 做的负载均衡 gateway_01 这个服务 是动态路由的实现 其中redis部分,有一个jar是自己封装的,可以...

Global site tag (gtag.js) - Google Analytics