ES基本原理
Elasticsearch是基于一款高性能的、可扩展的信息检索工具库Lucene构建的强大的搜索引擎,在很多情况,它也被作为NoSql数据库并取得了很好的效果,下面介绍下ES的基本概念,映射到数据库的概念就比较好理解。
集群(Cluster):一组拥有共同的cluster name的节点,新创建的节点只要指定集群名,启动后就会自动加入集群,称为其中的节点,整个集群可以认为是一个数据库引擎。
节点(Node) :集群中的一个Elasticearch实例,可以是一个虚机,容器等,每个实例有独立的存储,不会由于一个节点的故障导致数据丢失。
索引(Index) :相当于关系数据库中的database概念,一个集群中可以包含多个索引,索引名就是库名
分片(shard):一个索引会被切割成多个分片,分布到不同的集群节点上,每个主分片可以有一个或者多个副本,副本不和主分片在同一个节点上,以便完成数据备份。
类型(Type):相当于数据库中的table概念,mapping相当于数据库中的schema,是针对 Type 的,同一个type下要求格式一致,同一个索引里可以包含多个 Type。
文档(Document) :相当于数据库中的row,是查询的实体。
字段(Field)相当于数据库中的column。
ES也是采用主从模式和运用了服务发现的原理,业界成熟的服务发现组件有Zookeeper/etcd/Consul,但是ES并没有采用这些组件,而是自己实现了一个ZenDiscovery,当启动节点时,先使用内部实现的RPC命令ping来调用其他host,从各节点返回的信息里获取master节点信息并认主,如果没有主,则根据id的排序顺序选一个主出来,主节点负责监控从节点的状态,并协调分片的位置和职责。一旦有节点加入集群,主节点会根据分片及节点数量调整各节点拥有的分片数量,调整始终会保证主分片和副本分片(一般有多个副本)放在不同的节点,当某节点故障后,主节点会删除该节点,并重新调整分片,如果某主分片在那个节点,主节点会重新为该分片指定一个主分片,必须保证任一单个节点故障,ES都能正常提供服务,数据不会丢失,节点主从,索引分片,分片副本,副本散列分布都是为了解决这个问题,而分片分散分布在各节点也会提高搜索效率。
ES最为我们所赞叹的是其强大的索引能力,这也是现在ES如此受亲睐的原因。在索引机制上,ES使用倒排索引,倒排索引是相对正排索引的,正排索引大概是这样一个套路:文档1包含什么单词,出现了几次,在哪里出现的,文档2包含什么单词,出现几次,在哪里出现...。这样方式在查询的时候我们必须去扫描所有文档,并获取文档存储的内容,大大影响的查询效率,而倒排索引反其道而行,以关键词为key,映射文档的id,当我们存储一个文档,首先提取其包含的关键字,然后将关键字作为key,包含该关键字的文档id作为value,类似这样:key1:1,2,3;key2:2,4,这样当我们查询某key的时候就可以直接查询到哪些文档包含个key,大大节省了查询效率。但ES做的不止这些,比如查到的文档非常多我们该怎定位到某一个文档,全部放到内存里过滤不太现实,会把内存撑爆,ES采用的index分页机制和FST压缩技术来实现,index分页机制会存储查询条目的前缀,以及前缀所指向的block的映射关系,FST压缩技术则通过对前缀和后缀的重复利用来压缩存储空间这样,存储在内存的数据量就会大幅度下降,我们通过前缀找到对应的block,然后再通过二分法查找目标文档,减少了磁盘读取次数。总体来讲,Elasticsearch的索引思路就是将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种奇技淫巧的压缩算法,用及其苛刻的态度使用内存。
为了理解ES的一些机制,下面通过ES的读写操作来进行说明。
当我们向ES写数据时,节点收到信息会先查找文档属于哪个分片,该分片位置,然后将消息路由过去,执行插入命令成功时,将内容返回,并并行的将数据同步到其他分片的副本,全部副本更新成功后才会向客户端返回成功。这么做是为了保证主切片与副本的数据同步。
对于读操作,请求节点会为每个请求选择不同的副本来完成负载均衡,默认的负载均衡策略是轮询。
对于更新操作,节点收到信息会先查找文档属于哪个分片,该分片位置,然后将消息路由过去,查询当前内容,把查到的内容修改然后执行插入,如果发现文档被修改,则重新查询、修改、插入,完成后,并并行的将数据同步到其他分片的副本,全部副本更新成功后才会向客户端返回成功。
ES基本原理的更多相关文章
- ES进阶--02
第11节深度探秘搜索技术_案例实战基于dis_max实现best fields策略进行多字段搜索 课程大纲 1.为帖子数据增加content字段 POST /forum/article/_bulk{ ...
- 反汇编基本原理与x86指令构造
反汇编基本原理与x86指令构造 概要:旨在讲述程序的二进制代码转换到汇编.即反汇编的基本原理.以及 x86 架构的 CPU 的指令构造,有这个基础后就能够自己编写汇编程序了,也能够将二进制代码数据转换 ...
- ES 内存深度解析
注: 本文主要针对ES 2.x. “该给ES分配多少内存?” “JVM参数如何优化?“ “为何我的Heap占用这么高?” “为何经常有某个field的数据量超出内存限制的异常?“ “为何感觉上没多少 ...
- ES 30 - Elasticsearch生产集群的配置建议
目录 1 服务器的内存 2 服务器的CPU 3 服务器的磁盘 4 集群的网络 5 集群的节点个数 6 JVM的参数设置 7 集群的数据量 8 总结 在生产环境中, 要保证服务在各种极限情况下的稳定和高 ...
- 分库代价高的情况下,如何优化ES解决亿级数据量检索
数据平台已迭代三个版本,从一开始遇到很多常见的难题,到现在终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,但愿能帮助大家少走些弯路,在此篇幅中偏重于ElasticSearch的优化 ...
- 「白帽黑客成长记」Windows提权基本原理(上)
我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...
- es 内存占用优化
对6.3: 修改Elasticsearch中JVM配置文件jvm.options: Dlog4j2.enable.threadlocals=false 注: 本文主要针对ES 2.x. “该给ES分配 ...
- UMD、CommonJS、ES Module、AMD、CMD模块的写法
AMD异步模块规范 RequireJS就是AMD的一个典型的实现. 以下是一个只依赖与jQuery的模块代码: // foo.js define(['jquery'], function($){ // ...
- Elasticsearch-head使用及ES相关概念
elasticsearch-head安装和介绍已在上一篇讲了. 在浏览器访问http://localhost:9100,可看到如下界面,表示启动成功: 仔细观察,我们会发现客户端默认连接的是我们ela ...
随机推荐
- 终于决定要开始写自己的博客了,先Mark一下
终于决定要开始写了,但事实是,打开就觉得浪费时间,懒癌犯了
- iOS9 3DTouch 之 Home Screen Quick Actions
最后更新:2016-12-18 测试环境: Xcode8.1 一.前言 iOS9 已经过去一年了,3D Touch也在项目中实战过,但一直没有总结一下,现在新的项目也用到了3D Touch, 网上找了 ...
- UVALive 6858 Frame (模拟)
Frame 题目链接: http://acm.hust.edu.cn/vjudge/contest/130303#problem/D Description http://7xjob4.com1.z0 ...
- [CSP-S模拟测试]:visit(组合数学+exLucas+CRT)
题目传送门(内部题6) 输入格式 第一行包含两个整数$T$,$MOD$:第二行包含两个整数$n$,$m$,表示$dirty$房子的位置. 输出格式 一行一个整数,表示对$MOD$取模之后的答案. 样例 ...
- 基于vue模块化开发后台系统——构建项目
文章目录如下:项目效果预览地址项目开源代码基于vue模块化开发后台系统--准备工作基于vue模块化开发后台系统--构建项目基于vue模块化开发后台系统--权限控制 前言 在熟悉上一篇说到准备工具之后, ...
- react-native 组件之间传值
1.通过 AsyncStorage 将值保存在本地(最低端的方法) import { AsyncStorage, } from 'react-native'; // 保存 IP AsyncStorag ...
- dp基础大概 (8.6)
一些前言: 据说动态规划会用排序,数据结构来进行乱搞优化操作 动态规划滴核心是个啥呢?状态表示和状态转移 设状态:哪些因素会影响到最终答案,就把哪些因素用数组的维度表示出来 要充分描述,也要简洁 举个 ...
- uni-app学习资料整理-1.白话uni-app
白话uni-app https://ask.dcloud.net.cn/article/35657 文件内代码架构的变化 以前一个html大节点,里面有script和style节点: 现在templ ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_2_数据结构_队列
先进先出 队列 队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入, 而在表的另一端进行删除. 简单的说,采用该结构的集合,对元素的存取有如下的特点: ...
- 【SD系列】SAP 创建销售订单-用外部给号的方法步骤
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP 创建销售订单-用外部给号的方 ...