Elasticsearch是一个搜索和数据分析引擎,可用于分布式和RESTful风格。——ElasticStack官网关于Elasticsearch的“爱恨情仇”提到搜索服务器,大多数人会想到Solr和Elasticsearch甚至是国内厂商自研的。随着人工智能和大数据时代的到来,甚至带动了一系列机器引擎的出现,比如Splunk。其中Solr和Elasticsearch是基于Lucene的搜索服务器。一般来说,Solr是面向全文搜索引擎的,而Elasticsearch则用于全文搜索、结构化搜索和分析。对于Splunk的机器数据引擎,它收集、索引和利用由所有应用程序、服务器和设备生成的快速移动的计算机数据。但无论技术如何发展变化,作为程序员,我们要做的不仅仅是维护技术储备知识库,实时更新自己的技术缓存,还要实现可扩展技术深度的增长树。关于Elasticsearch,记得接触到Elasticsearch这个词的时候是2017年夏天,当时的工作任务是实现一个关于知识库的系统。当时小伙伴的技术选型主要以Solr+Lucene为主,甚至有人说直接使用Mysql数据库的内置函数。在网上查询搜索引擎实战技术时,无意中看到一篇关于Elasticsearch应用实战的应用报告分析,于是查询了Elasticsearch的相关资料。不过当时网上关于搜索功能的demo大多都是关于Solr的。可能那个时候,大部分的技术理念基本上都偏向于技术的长期稳定性和完整的文档,以及相对重度使用因子。不过我个人还是留个心眼,尝试自己打Elasticsearch。第一次上手操作是装在Windows机器上(22G内存)。其中,安装过程相对于使用Tomcat+Solr要复杂一些,占用机器内存和功耗也很大。这个开发基本上只能说是能跑,但是在稳定性上,感觉有点望而生畏。第二次实战是在本机上搭建虚拟机(2核8G)进行实战。不过在网络通信方面,当时选择了网络桥接的方式,这也让我觉得很麻烦。第三次,我有了自己的阿里云服务器。我在上面用的是传统部署方式(对比Docker部署),但是我个人服务器内存偏低(2核4G),修改配置JVM后无法启动成功。GC日志之类的问题一直被抛出,主要是当时资金紧张的问题。即使Elasticsearch服务运行起来,其他应用程序也无法启动和运行。后来接触到Docker,于是就有了第四篇Elasticsearch实战(单节点部署)。第四次升级了阿里云服务器的配置(2核8G),终于实现了我的第一个Elasticsearch服务。甚至,为后期工作中上手Elasticsearch分布式集群服务打下基础。基本概述看来Elasticsearch和MongoDB/Redis/Memcache一样,在某种意义上是一个Nosql数据库。它是一个近实时的搜索平台。从索引此文档到可搜索此文档只有轻微的延迟。企业应用定位:可扩展、高可用的全文搜索工具,使用RestfulAPI标准进行实时数据分析。然而,当时的ElasticStack只有Elasticsearch、Kibana和Logstash用例,并没有包含Beats等。而在应用方面,除了搭建ELK分布式日志系统外,更多的是Elasticsearch+Elasticsearch-Head插件来满足业务场景的需求,可以安全可靠的从任意来源、任意位置获取数据。格式化,然后实时快速搜索、分析和可视化数据。基本特性:可扩展:支持一主多从,易于扩展,只要cluster.name一致且在同一网络内,即可自动加入当前集群;本身是开源软件,也支持很多开源的第三方插件高可用:在集群的多个节点进行分布式存储,索引支持分片和复制。即使部分节点宕机,也能自动进行数据恢复和主从切换最小单位是文档,本质上是一个JSON文本Elasticsearch关键字Node:节点,一个带有Elasticsearch服务并提供故障转移和可伸缩服务器集群:Cluster,一个Elasticsearch-Cluster集群有一个Node或者至少2个Node组成的Server,共同服务共享Node节点数据,具有负载均衡的功能,甚至可以基于Zookeeper集群提供高可用服务。Index:索引,具有相同或相似特征的Document文档对象的集合Type:Type,具有相同Filed字段的文档定义一个Type类型,一个Type可以创建多个Index索引Document:Document,一个Document文档可以作为anIndexindex基本信息单位Field:字段列,Field是Elasticsearch的最小单位,对应数据的某一列Term:由很多字节组成。一般将Text类型的FieldValue分词后的每个最小单元称为Term。Shards:Sharding,Elasticsearch将Index索引分成几个部分,每个部分是一个ShardshardReplicas:Replication,每个Inex索引或数据备份中每个Shard分片的副本Elasticsearch结构与其他数据库对比数据模型databaseTypedatabaseNamedatabaseUnitdatabaseTabledatabaseRowdatabaseColumnsqlMysql数据库-数据库表-表数据行-行数据列-列NosqlElasticsearch索引-索引类型-类型文档-文档字段列-字段NosqlHbase命名空间-命名空间domain/slice-region数据行-行数据列-列使用场景对比databaseTypedatabaseNamedatabaseStoragedatabaseTransactiondatabaseConsistencydatabaseScalabilitysecondaryIndexfullTextsqlMysql行号数据存储,适用针对OLTP业务Innodb引擎支持强一致性-强一致性单机扩展性不高粒度支持NosqlElasticsearch索引存储-任意检索服务不支持可配置水平扩展支持NosqlHbase列数据存储,OLTP和OLAP模型之间不支持强一致性-strongconsistencyandtimeconsistency-timeseriesconsistencylevelexpansiondoesn'tsupport不支持ps【??注】:OLTP:OnLineTransactionProcessing在线事务处理过程(OLTP),主要对应传统关系型数据库,基本操作增删改查,修改检查,强调交易一致性,如银行系统、电子商务系统。OLAP:OnlineAnalyticalprocessing即联机分析处理(OnlineAnalyticalProcessing,简称OLAP),主要对应仓库型数据库,主要是读取数据,进行复杂的数据分析,侧重于技术决策支持,提供直观、简单的结果。Elasticsearch原理分析Gateway【索引数据存储格式】:Elasticsearch用于存储数据索引的索引文件系统,支持多种类型【LocalFileSystem-本地文件系统SharedFileSystem-分布式文件系统HadoopHDFS、AmazonS3】DistributedLuceneDirectory【底部API[framework]:Elasticsearch底层依赖Lucene框架,每个Elasticsearch节点服务都会有一个对应的Lucene框架MajorModule[处理方式]:在Lucene上层,IndexModule(创建Index模块),SearchModule(search模块)、Mapping(映射)、River(运行在Elasticsearch集群内部的一个插件,主要用于从外部获取异构数据,然后在ElasticsearchDiscovery中创建索引【Elasticsearch发现机制】:Discovery是用于Elasticsearch自动发现节点;Zen用于实现节点自动发现和主节点选举;Elasticsearch是一个基于P2P的系统,首先通过广播机制搜索存在的节点,然后通过组播协议在节点之间进行通信,以及还支持点对点交互Scripting【Elasticsearch脚本执行功能】:Scripting是脚本执行功能。有了这个功能,可以很方便的处理查询到的数据。elasticsearch-ik分词插件,elasticsearch-sqlsql插件。Transport[Elasticsearch传输机制]:传输模块支持Thrift、Memcached、HTTP,默认使用HTTP传输JMX[ElasticsearchJava-basedmanagementframework]:用于管理Elasticsearch应用的Java管理框架RSTfulStyleAPI[ElasticsearchAPIsupportmode]:基于Netty的网络通信,通过RSTfulAPI与Elasticsearch集群进行交互
