转自:http://my.oschina.net/crxy/blog/422287?p=1

Es查询的时候默认是随机从一些分片中查询数据,可以通过配置让es从某些分片中查询数据

1:_local

指查询操作会优先在本地节点有的分片中查询,没有的话再在其它节点查询。

2:_primary:指查询只在主分片中查询

3:_primary_first:指查询会先在主分片中查询,如果主分片找不到(挂了),就会在副本中查询。

4:_only_node:指在指定id的节点里面进行查询,如果该节点只有要查询索引的部分分片,就只在这部分分片中查找,所以查询结果可能不完整。如_only_node:123在节点id为123的节点中查询。

5:_prefer_node:nodeid 优先在指定的节点上执行查询

6:Custom (string) value:随机指定一个值就可以。

7:_shards:0,1,2,3,4:查询指定分片的数据

8:自定义:_only_nodes:nodeid1,nodeid2,nodeid3根据多个节点进行查询

Es默认没有提供这种查询方式,所以就只能修改源码了。

首先找到org.elasticsearch.cluster.routing.operation.plain.PlainOperationRouting这个类,es搜索时获取分片信息是通过这个类的。它的preferenceActiveShardIterator()方法就是根据条件来找出响应的分片。

看源码可知其主要是根据preference这个参数来决定取出的分片的。如果没有指定该参数,就随机抽取分片进行搜索。

下面的代码就是根据上面说的不同情况进行的一些判断,使用的switch case语句。

在里面多增加一项ONLY_NODES,这个可以接收多个节点id,这个参数需要配置到preference枚举类中,还要在这个类中的switch判断中判断参数_only_nodes。添加case语句。

接下来就需要完善PlainOperationRouting类中的case语句判断逻辑了。

首先获取传递过来的所有节点id,以逗号分割。获取一个节点id的数组,下面循环判断传递的节点是否存在,如果不存在就抛异常。

下面就返回一个方法的返回值,这个方法是需要我们自己实现的,这个方法可以参考上面的onlyNodeActiveInitializingShardsIt这个方法。

接下来完善onlyNodesActiveShardsIt这个方法,

这样的话就可以从用户指定的多个节点中获取数据。

把项目重新打包,放到服务器上重新启动。

修改ES分片规则的更多相关文章

  1. MyCAT常用分片规则之分片枚举

    MyCAT支持多种分片规则,下面测试的这种是分片枚举.适用场景,列值的个数是固定的,譬如省份,月份等. 在这里,需定义三个值,规则均是在rule.xml中定义. 1. tableRule 2. fun ...

  2. MyCat分片规则--笔记(二)

    概述 myCat实现分库分表的策略,对数据量的处理带来很大的便利,这里主要整理下MyCat的使用以及常用路由算法,针对MyCat里面的事务.集群后续再做整理:另外内容整理,不免会参考技术大牛的博客,内 ...

  3. Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)

    一.Mycat分片路由原理 我们先来看下面的一个SQL在Mycat里面是如何执行的: , ); 有3个分片dn1,dn2,dn3, id=5000001这条数据在dn2上,id=10000001这条数 ...

  4. MyCat 介绍、分片规则、调优的内容收集

    一.MyCat的简介 MyCat高可用.负载均衡架构图: 详细知识点:  MySQL分布式集群之MyCAT(一)简介(修正) 二.MyCat的schema.xml讲解 详细知识点:MySQL分布式集群 ...

  5. js修改样式表规则

    <div>adasfsfs</div> <div id="div">adasfsfs</div> <div>adasfs ...

  6. Mycat 分片规则详解--单月小时分片

    实现方式:单月内按照小时拆分,最小粒度是小时,一天最多可以有24个分片,最少1个分片,下个月从头开始循环 优点:使数据按照小时来进行分时存储,颗粒度比日期(天)分片要小,适用于数据采集类存储分片 缺点 ...

  7. Mycat 分片规则详解--日期(天)分片

    实现方式:按照日期来分片 优点:使数据按照日期来进行分时存储 缺点:由于数据是连续的,所以该方案不能有效的利用资源 配置示例: <tableRule name="sharding-by ...

  8. Mycat 分片规则详解--应用指定分片

    实现方式:根据字符串的子串(必须是数字)计算分区号(由调用方传递参数,显示指定分区号),例如,id=05-12232323,其中 id 是从 startIndex = 0,size=2,即截取的子串是 ...

  9. Mycat 分片规则详解--取模分片

    实现方式:切分规则根据配置中输入的数值n.此种分片规则将数据分成n份(通常dn节点也为n),从而将数据均匀的分布于各节点上. 优点:这种策略可以很好的分散数据库写的压力.比较适合于单点查询的情景 缺点 ...

随机推荐

  1. SSAS多维数据集以及维度的建立

    首先打开vs建立一个Analysis Services项目,然后点击数据源文件右键[新建数据源],根据数据源向导建立自己的数据源,如图1: 点击[确定],选择刚才的数据连接,点击[下一步]进入模拟信息 ...

  2. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  3. php 设置自动加载某个页面

    首先要找到Php.ini文件. 新建一个php文件,使用phpinfo(); 之后找到 Loaded Configuration File 指定的路径就是php.ini文件 打开文件,找到 auto_ ...

  4. 使用 dockerfile 创建镜像

    dockerfile 是一个文本格式的配置文件,可以使用 dockerfile 快速创建自定义的镜像. dockerfile 一般包含4部分信息:基础镜像信息.维护者信息.镜像操作指令.容器启动时执行 ...

  5. Spring中xml文件配置也可以配置容器list、set、map

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 在centos7中用mariadb代替了mysql数据库吗

    从最新版本的linux系统开始(如 Centos7),默认的是 Mariadb而不是mysql!(mysql被闭源厂家收购,有闭源风险) 使用系统自带的repos安装很简单: yum install ...

  7. cocos2dx当节点存在缩放时要注意的问题

    cocos2dx(所有引擎也均如此),如果一个节点存在缩放,一定不要忘了其局部空间里的单位长度也会发生变化.其子节点位移,局部空间转世界空间结果等都会受影响. 有时候我们想将父节点的缩放转移到子节点中 ...

  8. unity5 创建material

    在material文件夹下 unity5中新创建的material默认如下 开始我不知道贴图应该加在哪儿.于是跳过教程上这一步,直接去选shader: 在这个shader下很明显看到加贴图的地方了: ...

  9. Java中instanceof关键字的理解

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...

  10. c# 获取当前程序运行根目录

    //获取绝对路径,调用如 string fileName = string.Format("~/RuleConfigFiles/Campaign_{0}.JSON", Campai ...