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. 如何快速优雅的解决:ORA-02290: 违反检查约束条件 异常问题

    在向oracle保存数据时,控制台报错如下: 很明显是保存时,该表的设计不允许某个字段非空导致的,但由于该表的数量较多,采用断点的方式有太过麻烦, 这里笔者采用 oracle 的客户端连接工具orac ...

  2. z-index的各种坑

    z-index属性 z-index : auto | number z-index 属性设置元素的堆叠顺序,如果为正数,则离用户更近,为负数则表示离用户更远: 拥有更高堆叠顺序的元素总是会处于堆叠顺序 ...

  3. PJSIP库设置Via地址

    好记性不如烂笔头,解决项目问题,调试代码跟踪到PJSIP 设置Via地址位置,记录下来,以备后用. PJSIP库在方法stateless_send_transport_cb中设置Via地址值,该方法在 ...

  4. kill的各种讯号?

    kill 程序 不仅仅只是k掉某个进程, 她还有很多作用和用途. 其实, 这也是linux的程序的一个特点: 一个程序(很多是 命令行的程序), 除了主要的作用外, 还有很多" 重要的, 有 ...

  5. centos安装mycat(支持mysql8连接)

    1.参考前文安装jdk 2.官网 http://www.mycat.io/ 或 http://dl.mycat.io/ 下载 mycat1.6.7 release 版本 3.解压安装 cd /usr/ ...

  6. spring boot添加logging不能启动且不报错

    1.问题: application.yml中添加logging启动失败,不报错,去除后又正常 logging: config: classpath:test-logback-spring.xml报错 ...

  7. #1146 - Table 'phpmyadmin.pma__table_uiprefs' doesn't exist

    在使用phpmyadmin时,数据库总报错#1146 - Table ‘phpmyadmin.pma_table_uiprefs' doesn't exist 修改phpmyadmin的配置文件con ...

  8. lateral view 使用方法

    这个函数相当于拆开行变成列. 可以理解为行转列. select id,order_label from table_bx lateral view explode(split(work_order_l ...

  9. html php插入百度地图定位

    CSS样式 1 2 3 4 <style> .iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hi ...

  10. 【BASIS系列】SAP 批量锁住用户和TCODE的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 批量锁住用户和TCOD ...