Elasticsearch
1: Elasticsearch 简介
ElasticSearch是一个基于[Lucene]的搜索服务器。它是一个提供了基于RESTful 的web接口,能够达到实时,稳定,可靠,快速的搜索引擎
2: Elasticsearch的架构
master
主要功能是维护元数据,管理集群各个节点的状态,数据的导入和查询都不会走master节点,所以master节点的压力相对较小,因此master节点的内存分配也可以相对少些;但是master节点是最重要的,如果master节点挂了或者发生脑裂了,你的元数据就会发生混乱,那样你集群里的全部数据可能会发生丢失,所以一定要保证master节点的稳定性
data node
是负责数据的查询和导入的,它的压力会比较大,它需要分配多点的内存,选择服务器的时候最好选择配置较高的机器(大内存,双路CPU,SSD... 土豪~);data node要是坏了,可能会丢失一小份数据。
client node
client node存在的好处是可以分担下data node的一部分压力,es的查询是两层汇聚的结果,第一层是在data node上做查询结果汇聚,然后把结果发给client node,client node接收到data node发来的结果后再做第二次的汇聚,然后把最终的查询结果返回给用户;所以我们看到,client node帮忙把第二层的汇聚工作处理了。任务会先丢给client node,client node要是处理不来,顶多就是client node停止了,不会影响到data node,es集群也不会走异常恢复
3: Es入门配置
1. 集群名称,默认为elasticsearch:
cluster.name: elasticsearch
2. 节点名称,es启动时会自动创建节点名称,但你也可进行配置:
node.name: "Franz Kafka"
3. 是否作为主节点,每个节点都可以被配置成为主节点,默认值为true:
node.master: true
4. 是否存储数据,即存储索引片段,默认值为true:
node.data: true
master和data同时配置会产生一些奇异的效果:
1) 当master为false,而data为true时,会对该节点产生严重负荷;
2) 当master为true,而data为false时,该节点作为一个协调者;
3) 当master为false,data也为false时,该节点就变成了一个负载均衡器
. 5 设置一个索引的碎片数量,默认值为5:
index.number_of_shards: 5
6. 设置一个索引可被复制的数量,默认值为1:
index.number_of_replicas: 1
7. bind_host和publish_host可以一起设置:
network.host: 192.168.0.1
8. 可以定制该节点与其他节点交互的端口:
transport.tcp.port: 9300
9. 节点间交互时,可以设置是否压缩,转为为不压缩:
transport.tcp.compress: true
10. 可以为Http传输监听定制端口:
http.port: 9200
11. 禁止当前节点发现多个集群节点,默认值为true:
discovery.zen.ping.multicast.enabled: false
12. 设置新节点被启动时能够发现的主节点列表(主要用于不同网段机器连接):
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
4: Es组件介绍
## 4.1 kibana
## 4.2 es_sql
## 4.3 elasticsearch-kopf
5: Elasticsearch 术语
##5.1 Document
Elasticsearch中,文档(document)这个术语有着特殊含义,它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。索引和搜索的主要数据载体,对应写入到ES中的一个doc。
## 5.2 _index
索引(index)类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方。
## 5.3 _type
在Elasticsearch中,我们使用相同类型(type)的文档表示相同的“事物”,因为他们的数据结构也是相同的。所有类型下的文档被存储在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被索引
##5.4 shard
每个Index(对应Database)包含多个Shard,默认是5个,分散在不同的Node上,但不会存在两个相同的Shard存在一个Node上。(当我们节点数和Shard数相等时,ElasticSearch集群的性能可以达到最优)
当插入document的时候,Elasticsearch通过对docid进行hash来确定其放在哪个shard上面,然后在shard上面进行索引存储。
shard代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改
##5.5 Replica
es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡
##5.6 field: document中的各个字段。
## 5.7 term: 词项,搜索时的一个单位,代表文本中的某个词。
6: Elasticsearch 索引
Lucene内部使用的是倒排索引的数据结构, 将词项(term)映射到文档(document)。
例如:某3个文档,假设某个字段的文本如下
ElasticSearch Server (文档1)
Matering ElasticSearch (文档2)
Apache solr 4 Cookbook (文档3)
term 次数 doc id
4 1 3
Apache 1 3
Cookbook 1 3
ElasticSearch 2 1,2
Matering 1 1
Server 1 1
solr 1 3
7: Elasticsearch查询过程
es在执行filter查询过滤的时候,会打开lucene的每个segment段文件,然后去判断里面的文档符合该filter与否,这个匹配的结果我们就可以用bitset来存储起来,下次同样的filter查询过来,我们就直接使用内存里面的bitset来进行判断就行了,而不需要再打开lucene的segment文件了,避免了io的操作,这样就可以大大提高查询处理的速度
8: Elasticsearch插入过程
略