Elasticserach由来:
许多年前,一个叫Shay Banon的待业工程师跟随他的新婚妻子来到伦敦,他的妻子想在伦敦学习做一名厨师。而他在伦敦寻找工作的期间,接触到了Lucene的早期版本,他想为自己的妻子开发一个方便搜索菜谱的应用。
Elasticsearch发布的第一个版本是在2010年的二月份,从那之后,Elasticsearch便成了Github上最受人瞩目的项目之一,并且很快就有超过300名开发者加入进来贡献了自己的代码。后来Shay和另一位合伙人成立了公司专注打造Elasticsearch,他们对Elasticsearch进行了一些商业化的包装和支持。但是,Elasticsearch承诺,永远都将是开源并且免费的。
Elastic为主体的公司提供了很多优秀的解决方案,拿到很多的投资,现已上市,后来收购logstash,kibana及一些其他的服务。
据国际权威的数据库产品评测机构DBEngines的统计,在2016年1月,Elasticsearch已超过Solr等,成为排名第一的搜索引擎类应用.
1)ES = elasticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎.
2)Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
ES国内外使用优秀案例
我们也需要
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.
实际项目开发实战中,几乎每个系统都会有一个搜索的功能,当数据达到很大且搜索要做到一定程度时,维护和扩展难度就会越来越高,并且在全文检索的速度上、结果内容的推荐、分析以及统计聚合方面也很难达到我们预期效果。
并且 Elasticsearch ,它不仅包括了全文搜索功能,还可以进行以下工作:
1)网站搜索:ES搜索自动:补全建议、关键词搜索
2)日志分析:ELK经典组合,ElasticSearch + logstash + kibana === 日志收集 + 日志分析 + 运维
3)数据预警:第三方插件 wathcer 监控数据
4)商业智能,数据分析:ES数据分析
一线公司ES使用场景
1)新浪ES 如何分析处理32亿条实时日志 http://dockone.io/article/505
2)阿里ES 构建挖财自己的日志采集和分析体系 http://afoo.me/columns/tec/logging-platform-spec.html
3)有赞ES 业务日志处理 http://tech.youzan.com/you-zan-tong-ri-zhi-ping-tai-chu-tan/
4)ES实现站内搜索 http://www.wtoutiao.com/p/13bkqiZ.html
Gateway:
Local FileSystem:本地文件系统
Shared FileSystem:共享文件系统
Hadoop HDFS:大数据HDFS分布式文件系统
Amazon S3:亚马逊的一个分布式文件系统
ES目前主要使用Local FileSystem,主要利用本机节点、本地文件系统存储索引和文档,其他三个都废弃掉了
Gateway上层就是一个lucene的分布式框架
lucene是做检索的,但是它是一个单机的搜索引擎,像这种es分布式搜索引擎系统,虽然底层用lucene,但是需要在每个节点上都运行lucene进行相应的索引、查询以及更新,所以需要做成一个分布式的运行框架来满足业务的需要。
Distributed Lucene Directory:分布式lucene目录,lucene只能支持单体架构的搜索,不具有分布式的能力,那怎么让他具有分布式能力,就要对他改造,使用lucene的API把它做成了具有分布式的一种lucene的目录结构
districted lucene directory 之上就是 ES 的四大模块 :
Index Module
是索引模块,就是对数据建立索引也就是通常所说的建立一些倒排索引等;Search Module
是搜索模块,就是对数据进行查询搜索;Mapping Module
是数据映射与解析模块,就是你的数据的每个字段可以根据你建立的表结构通过mapping进行映射解析,如果你没有建立表结构,es就会根据你的数据类型推测你的数据结构之后自己生成一个mapping,然后都是根据这个mapping进行解析你的数据;River Module
在es2.0之后应该是被取消了,它的意思表示是第三方插件,例如可以通过一些自定义的脚本将传统的数据库(mysql)等数据源通过格式化转换后直接同步到es集群里,这个River大部分是自己写的,写出来的东西质量参差不齐,将这些东西集成到es中会引发很多内部bug,严重影响了es的正常应用,所以在es2.0之后考虑将其去掉。Index Module:索引模块,添加数据要使用索引模块,创建索引
Search Module:搜索模块,根据关键词匹配索引查询想要的文档
Mapping:映射,相当于创建数据库时约束的字段一样,例如varchar,int,long类型都在mapping中进行约束
River:第三方插件,用来实时导入数据库数据的,已经废弃掉
ES 四大模块 组件之上有 Discovery 模块:
es是一个集群包含很多节点,很多节点需要互相发现对方,然后组成一个集群包括选主的,这些es都是用的discovery模块,默认使用的是 Zen
es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
es查询还可以支撑多种script即脚本语言,包括mvel、js、python等等
Discovery:集群中节点之间发现的组件
Scripting:脚本,支持一些脚本语言
3rd Plugins:支持第三方插件的整合,留了入口,例如ik分词器
Transport - RESTful Style API:RESTful方式访问,支持Thrift、Memcached、Http协议
JMX - Java(Netty):Java客户端方式访问,利用Netty,通过JMX协议
最上层就是ES暴露给我们的 访问接口
官方推荐的方案就是这种Restful接口,直接发送http请求,方便后续使用nginx做代理、分发包括可能后续会做权限的管理,通过http很容易做这方面的管理。
如果使用java客户端它是直接调用api,在做负载均衡以及权限管理还是不太好做。
可以看到一个节点是亚健康状态
场景:
1)单node环境下,创建一个索引index,默认创建5个primary shard,5个replica shard
2)yellow
3)分片分配:把5个主分片分配到一台机器
4)伪集群可以正常工作的,但是一旦宕机,可能出现数据丢失的现象。而集群不可用。
设置语法:
PUT /索引库名字
{
"number_of_shards": 3, //主分片数量
"number_of_replicas": 1 //每个主分片的副本分片数量
}
启动集群环境:
# -Ecluster.name:集群名称 # -Epath.data:数据存储路径 # -Enode.name:集群中的节点名称 # -Ehttp.port:http的端口 # -d:后台启动 bin/elasticsearch -Ecluster.name=c_cluster -Epath.data=my_cluster_node1 -Enode.name=node1 -Ehttp.port=5100 -d
删掉所有索引,新建索引演示效果:
看到一共有3个主分片,3个副本分片,均匀放在三个节点中
注意分片分配的原则是主分片和它的副本分片不会放在同一个节点中
,保证数据安全性(和Kafka相似)
AP架构肯定要有master节点
master节点和从节点都具有读写能力,因为写的操作最终都是写入到主分片中的,只要节点中有主分片都可以写入数据
ElasticSearch是一个分布式的,高效的搜索框架,底层封装lucence,分布式应对大数据量存储,检索,
关键是:让开发变得简单,隐藏了很多Lucene复杂操作
1)分片机制
2)cluster discovery
3)shard分片负载
4)shard副本、请求路由、集群扩容、shard重新分配
master节点特点:
master节点的作用:
cluster state
)的变化,并推送给所有节点。集群节点都各有一份完整的cluster state,只是master node负责维护。master节点的配置如下(elasticsearch.yml)
node.master: true
node.data: false
data节点的作用:
data节点的配置如下(elasticsearch.yml)
node.master:false
node.data: true
协调节点的作用:
协调节点的配置如下(elasticsearch.yml)
node.master:false
node.data: false
5.0之后被协调节点取代
部落节点可以把多个集群整合在一起,来维护多个集群的状态
ES重点名词解释,Index、Type、Document、Mapping
注意:
在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
所以也可以认为一个索引就是一张表。
向索引库中添加两条数据:
ES做搜索的时候,第一件事就要把映射Mapping的约束条件提前规定好,和创建数据库表有点类似,把表字段,长度类型决定好,不想弄也是可以的,直接创建一条数据,ES自动根据数据创建
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作并通过ElasticSearch内部使用Lucene将数据写入索引或从索引中检索数据。一个ES集群中可以按需创建任意数目的索引。
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
所以Index可以理解为就是mysql中的表
类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。
注意!!!
6.0之后删除了Type的概念,一个索引中只能有一个类型,原因:type本来就跟表的概念不一样,table在数据库中是独立存储的,ES中不同的type存储在同一个索引中的相同字段会映射到一起,例如:学生表中的name和班级表中的name,索引中会指向同一处,而且数据类型不能不同。
在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于数据库的“记录”
索引结构:
注意:类型type 在elasticsearch 6.0 已废弃。 7.X 版本直接去除了 type 的概念。
相当于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建
ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。