`
qindongliang1922
  • 浏览: 2184445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117546
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125934
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59928
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71305
社区版块
存档分类
最新评论

ElasticSearch里面的路由功能介绍

    博客分类:
  • ELK
阅读更多

在ElaticSearch里面,路由功能算是一个高级用法,大多数时候我们用的都是系统默认的路由功能,我们知道一个es索引可以分多个shard和每个shard又可以有多个replia,那么现在思考一个问题,我们添加进去的数据,是如何分布在各个shard上面的,而查询时候它是又怎么找到特定的数据呢。



默认情况下,索引数据的分片规则,是下面的公式:

shard_num = hash(_routing) % num_primary_shards


_routing字段的取值,默认是_id字段或者是_parent字段,这样的取值在hash之后再与有多少个shard的数量取模,最终得到这条数据应该在被分配在那个一个shard上,也就是说默认是基于hash的分片,保证在每个shard上数据量都近似平均,这样就不会出现负载不均衡的情况,然后在检索的时候,es默认会搜索所有shard上的数据,最后在master节点上汇聚在处理后,返回最终数据。


但有时候,我们会有另外一种情况,比如说存储一年的数据,如果按hash去索引,那就是分布非常均匀,这样的话无论查询什么数据都会去所有的shard上查询,如果数据量比较大,那么响应速度就比较慢,但这时,我们通过调查发现,一年12个月的数据本身分布并不均匀,有几个月的数据偏多,有几个月的数据偏少,理想情况下,数据偏少的月,查询性能应该更快,但如果是基于hash分片,那么我们并不能实现这种需求,因为hash分片,查询时候必须要命中所有shard之后,查询的结果才是准的,这样以来,每次查询都要扫描所有shard,比如我已经知道数据本身就是1月份的,那其实最好的情况下,只查询1月的数据就行,而不需要把一年的数据都扫描一遍,导致最终的结果就是慢的更慢,快的也慢,所以我们要针对性的做优化。


那么如何优化,其实思路也比较明确了,那就是按照月份分区,每一个月的数据都存在指定的分区中,如果是mysql那就是每个月份一张表,然后查询时候,直接查询对应月份的数据即可,在es和solr中原理也大致如此,唯一不同的地方在于es和solr都比较方便的支持了路由字段的设置而如果是数据库,则需要自己通过中间件的方式来搞定,比如说mycat等。



下面来介绍如何在es中使用路由字段,先看一个官网给的简单的例子:

PUT my_index/my_type/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}

GET my_index/my_type/1?routing=user1


上面的代码中,指定了一个用户属性作为路由进行分区,然后查询的时候也必须指定路由。这一点需要注意
只要在索引时候加入路由字段,那么在以后的get,delete,update操作中都必须使用路由字段,否则会出现问题。

当然,路由字段本身,也是可以被查询的,看下面的代码:

GET my_index/_search
{
  "query": {
    "terms": {
      "_routing": [ "user1" ] 
    }
  }
}




除此之外,路由字段,也可以指定多个:
GET my_index/_search?routing=user1,user2 
{
  "query": {
    "match": {
      "title": "document"
    }
  }
}


如果指定多个用户属性,那么es会仅仅查询关联了这两个route属性的shard

如果加入路由字段之后,其他的操作(indexing,getting,deleting,updating)都必须指定路由字段,为了避免在使用时忘记添加路由字段,导致同类数据会分布在多个shard上,这就违反了路由的原则,所以我们可以在mapping中
设置路由字段是必须字段,否则会提示错误:
PUT my_index2
{
  "mappings": {
    "my_type": {
      "_routing": {
        "required": true 
      }
    }
  }
}

PUT my_index2/my_type/1 
{
  "text": "No routing value provided"
}


缺失路由字段会抛出异常:
routing_missing_exception



还需要注意到是如果使用了路由字段,那么_id字段只能由用户保证唯一性,因为同一个id的数据,如果路由字段不一样,它是可以被存在到多个shard中的,而默认情况下是不会出现这种情况的。



最后接着说开头的例子,如果某个月数据量偏大,全部路由到一个shard里面依然性能有问题,es也提供了同一个路由的字段的数据可以被分配到多个shard上,注意这是是多个shard,而不是所有shard,当然这里面有一定限制一般情况下,不建议使用这种模式。



对solr中路由感兴趣的朋友,可以查看我以前写的文章:

http://qindongliang.iteye.com/blog/2312193

参考资料:

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html

0
1
分享到:
评论

相关推荐

    通过Vite搭建的Vue项目,里面安装了Vue Router,Pinia和Vant

    Vite利用了现代浏览器的原生ES模块导入功能,因此它可以跳过打包过程直接从源代码开始工作。这使得项目的初始启动时间大大减少。此外,Vite还集成了热模块替换(HMR),当代码发生变化时,只有受影响的部分会实时...

    多个vue子路由文件自动化合并的方法

    总结,本文介绍了一个在Vue项目中自动化合并多个Vue子路由文件的方法,通过Webpack的`require.context`功能,实现了动态加载和合并子路由。这种方法有助于简化路由配置,提高项目的可维护性和开发效率。

    Python-Vataxia社交网络引擎

    此外,搜索引擎集成,如Elasticsearch,可以帮助用户进行高效的全文搜索,查找感兴趣的内容和用户。 Vataxia的压缩包文件名"Vataxia-master"暗示这是一个源代码仓库的主分支,很可能包含了项目的根目录结构、源代码...

    基于 Vue3 + Vite3 + Pinia2 的王者荣耀后台管理系统源码.zip

    1. **项目结构**:通常包括src目录,里面分为components(组件)、views(视图)、router(路由)、store(状态管理)、api(接口请求)等子目录。 2. **Vue组件**:Vue3的组件化开发使得代码可复用性高,每个组件...

    微信小程序demo:titans.rar

    1. **app.js**: 这是小程序的全局配置文件,用于定义小程序的基本信息,如启动页面、页面路由、全局变量等。在这里,开发者可以设置小程序的生命周期函数,实现全局的功能。 2. **app.json**: 用来管理整个小程序的...

    基于gulp打包的vue单页

    它可以处理路由的配置、导航守卫、动态路由匹配和组件懒加载等功能,使得在Vue应用中实现多页面跳转变得简单。 3. **Gulp**: Gulp使用流式处理任务,允许通过编写自定义任务来自动化构建过程。常见的Gulp任务包括:...

    vite+vue3后台管理系统

    实际的项目文件结构可能包括src目录,里面含有components(组件)、views(视图)、router(路由)、store(状态管理)、api(接口请求)等子目录,以及App.vue(主组件)、main.js(入口文件)等关键文件。...

    API-App-ReactNative-Transportes:后端到应用程序传输

    本项目"API-App-ReactNative-Transportes"显然是一个使用React Native开发的移动应用,其核心功能在于处理后端数据的传输。下面我们将深入探讨这个项目涉及的关键知识点。 1. **API(应用程序接口)**: - API通常...

    pushplan-master(1).zip_effectdml_vue

    1. `src`:源代码目录,通常包括`components`(组件)、`views`(视图)、`router`(路由)、`store`(Vuex状态管理)、`assets`(静态资源)、`styles`(样式文件)等子目录。 2. `public`:静态资源目录,包含`...

    nodejs学院会议纪要管理系统.zip

    6. `src`:源代码目录,里面通常包含了项目的业务逻辑和路由定义等核心代码。 7. `db`:数据库相关的文件或目录,可能包含数据库连接配置、模型定义或实际的数据文件,用于存储会议纪要信息。 综合以上信息,我们...

    report.rar,vue

    在 "src" 文件夹中,我们通常会看到组件(components)目录,里面包含了各种自定义的 Vue 组件,这些组件可能对应着报表的不同部分,如图表、表格或过滤器。 `.babelrc` 文件用于配置 Babel,这是一个转换 ...

    基于Vue3+Vite开发的电量监控后台系统源码.zip

    【源码分析】PowerMonitor-main可能代表项目的主目录,里面包含着项目的所有源代码文件,如组件、路由、样式、配置等。开发者可以通过阅读这些源码来学习Vue3+Vite的实践应用,了解如何构建类似的电量监控系统。源码...

    1007自己的my-react.rar

    在学习React的过程中,开发者可能会创建各种组件、状态管理解决方案(如Redux或Context API)、路由(如React Router)以及其他自定义功能。此外,他们还可能使用CSS-in-JS库(如styled-components)或预处理器(如...

    2.(vue3.x+vite)组件注册并调用.rar

    Vite,由Vue.js作者尤雨溪创建,是一个基于ES模块的现代化前端构建工具,它提供了更快的开发环境启动速度和更直观的热更新体验。 首先,让我们详细了解一下Vue 3中的组件注册。Vue 3有两种类型的组件注册:全局注册...

    Java理发店管理系统源码.zip

    10. **API设计**:后端与前端之间的通信通过API完成,可能会有用户登录注册、预约服务、查询预约状态、支付等功能对应的API接口。 总的来说,这个项目展示了现代Web开发的常见流程和技术栈,包括前后端分离、...

    基于Vue.js的问卷调查平台设计源码

    `src`目录是源代码目录,里面包含了所有应用的组件、路由、样式和逻辑代码。`public`目录则是静态资源的存放地,如HTML入口文件、图标和其他公共静态资源。 在Vue.js框架下,问卷平台的实现可能会涉及到以下知识点...

    节点微服务:微服务

    对微服务进行监控是关键,可以使用Prometheus和Grafana组合进行度量收集和可视化,以及使用Elasticsearch、Logstash和Kibana(ELK Stack)进行日志管理和分析。 6. **服务发现与路由** 使用Consul、Etcd或...

    prototype.zip

    - src:源代码目录,包括main.js(入口文件)、App.vue(主组件)、components(其他组件)、router(路由配置)、store(Vuex状态管理)等。 - public:静态资源目录,如index.html(应用的入口页面)和其他非模块...

    vuetest:首个前端项目

    在压缩包文件`vuetest-master`中,你将找到项目的源代码目录,其中包括`src`文件夹,里面存放着Vue组件、路由、样式、脚本等;`public`文件夹,通常包含HTML入口文件和静态资源;还有`node_modules`文件夹,存储了...

    拷贝自vue官方webpack可供vuecli使用的一个自定义模板

    3. **源代码结构**:通常包含`src`目录,里面会有`main.js`(入口文件)、`App.vue`(应用主组件)、`router`(路由配置)、`components`(组件目录)等,这些是Vue应用的基础架构。 4. **依赖库**:在`package....

Global site tag (gtag.js) - Google Analytics