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基本原理的更多相关文章

  1. ES进阶--02

    第11节深度探秘搜索技术_案例实战基于dis_max实现best fields策略进行多字段搜索 课程大纲 1.为帖子数据增加content字段 POST /forum/article/_bulk{ ...

  2. 反汇编基本原理与x86指令构造

    反汇编基本原理与x86指令构造 概要:旨在讲述程序的二进制代码转换到汇编.即反汇编的基本原理.以及 x86 架构的 CPU 的指令构造,有这个基础后就能够自己编写汇编程序了,也能够将二进制代码数据转换 ...

  3. ES 内存深度解析

    注: 本文主要针对ES 2.x. “该给ES分配多少内存?”  “JVM参数如何优化?“ “为何我的Heap占用这么高?” “为何经常有某个field的数据量超出内存限制的异常?“ “为何感觉上没多少 ...

  4. ES 30 - Elasticsearch生产集群的配置建议

    目录 1 服务器的内存 2 服务器的CPU 3 服务器的磁盘 4 集群的网络 5 集群的节点个数 6 JVM的参数设置 7 集群的数据量 8 总结 在生产环境中, 要保证服务在各种极限情况下的稳定和高 ...

  5. 分库代价高的情况下,如何优化ES解决亿级数据量检索

    数据平台已迭代三个版本,从一开始遇到很多常见的难题,到现在终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,但愿能帮助大家少走些弯路,在此篇幅中偏重于ElasticSearch的优化 ...

  6. 「白帽黑客成长记」Windows提权基本原理(上)

    我们通常认为配置得当的Windows是安全的,事实真的是这样吗?今天让我们跟随本文作者一起深入了解Windows操作系统的黑暗角落,看看是否能得到SYSTEM权限. 作者将使用不同版本的Windows ...

  7. es 内存占用优化

    对6.3: 修改Elasticsearch中JVM配置文件jvm.options: Dlog4j2.enable.threadlocals=false 注: 本文主要针对ES 2.x. “该给ES分配 ...

  8. UMD、CommonJS、ES Module、AMD、CMD模块的写法

    AMD异步模块规范 RequireJS就是AMD的一个典型的实现. 以下是一个只依赖与jQuery的模块代码: // foo.js define(['jquery'], function($){ // ...

  9. Elasticsearch-head使用及ES相关概念

    elasticsearch-head安装和介绍已在上一篇讲了. 在浏览器访问http://localhost:9100,可看到如下界面,表示启动成功: 仔细观察,我们会发现客户端默认连接的是我们ela ...

随机推荐

  1. codeforces D Salary Changing

    题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdi ...

  2. YJJ's Salesman

    YJJ's Salesman YJJ is a salesman who has traveled through western country. YJJ is always on journey. ...

  3. 170830-关于JdbcTemplate的练习题以及其中的问题

    实验1:测试数据源 在spring文件中配置: 测试数据源: 结果: 实验2:将emp_id=5的记录的salary字段更新为1300.00[更新操作] update函数中,第一个是sql语句,后面的 ...

  4. WEB Fuzz中需要关注的7种响应

    WEB应用模糊测试(WEB Fuzz)是一种特殊形式的网络协议模糊测试,专门关注遵循HTTP规范的网络数据包. WEB Fuzz并不是新的概念,目前有多种WEB应用模糊测试器(WEB Fuzzer), ...

  5. Qt 之 ZIP开源库 QuaZIP

    2013-10-31 21:46 10856人阅读 评论(0) 收藏 举报  分类: Qt(12)  版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一.简介     ...

  6. p5437 【XR-2】约定

    分析 https://www.cnblogs.com/cjyyb/p/11111404.html 代码 #include<bits/stdc++.h> using namespace st ...

  7. 服务器上安装搭建node环境

    一.版本 : node  v4.4.3 npm  v2.15.1 pm2  v1.1.3 express v4.13.4 二.node安装与环境配置 新建node安装目录,与node项目目录     ...

  8. activiti 流程发起人控制

    最近做activiti流程发起人的控制,最开始的想法是新建一张表 ,通过控制流程定义id与发起人id进行控制,如果这样每次发布新的流程就必须 重新设置流程发起人,因为通过流程定义不能获取流程模型id, ...

  9. springmvc+ehcache简单例子

    这里采用的是spring3.2.ehcache2.7.tomcat7.0(必须) 1.web.xml <?xml version="1.0" encoding="U ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_2_Properties集合中的方法store

    第一行是注释,第二行是时间,时间是自动加的 使用FileOutputStream. 写入中文会乱码