转自: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. 使用fork并发处理多个client的请求和对等通信p2p

    一.在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现.网络服务 ...

  2. 使用Xfire发布WebService接口遇到的问题:

    问题一: log4j:WARN No appenders could be found for logger (org.codehaus.xfire.transport.DefaultTranspor ...

  3. 如何用Latex合并多个pdf文件?

    如何用Latex合并多个pdf文件?   用TeX合并pdf, 用LaTeX合并pdf 代码: \documentclass[a4paper]{article} \usepackage{pdfpage ...

  4. linux c:关联变量的双for循环

    举例说明: 比如打印一个倒三角形. * * * * * * * * * * 第一层循环为行数,第二层循环为每行打印的*数,且随着行数的变化,打印的*数也随着改变. 这就是关联变量的双层循环.我的做法是 ...

  5. 【Android】3.25 示例25--调启百度地图

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 调启百度地图是指:利用SDK接口,可直接在本地打开百度地图客户端或WebApp实现地图功能. 目前支 ...

  6. mongo操作及相关资料

    mongo操作 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): ...

  7. MD5加密 时间差 流水号等方法

    /// <summary> /// 使用TimeSpan计算两个时间差 /// </summary> /// <param name="DateTime1&qu ...

  8. 每日英语:China's Retirement Age Sets Experts at Odds

    The politically explosive issue of the official retirement age has drawn academics from two of China ...

  9. feginclient和hystrix的配置

    1.如果设置了 feign: hystrix: enabled: true 则 @FeignClient(value = "service-hi",configuration = ...

  10. filebeat+kafka+SparkStreaming程序报错及解决办法

    // :: WARN RandomBlockReplicationPolicy: Expecting replicas with only peer/s. // :: WARN BlockManage ...