Elasticsearch 简介、常用插件、集群搭建、优化、原理

  • 搭建集群

    • 索引查看
  • 数据可视化

      • kibana
  • 优化

    • 集群规划
    • Master Node
  • Data Node

  • Coordinating Only Node

  • Routing

  • 索引拆分

  • 冷热分离

  • 原理

    • 倒排索引

简介


Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

  • 实时分析的分布式搜索引擎。

  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

官网教程https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index.html

ELASTIC 搜索开发实战-中文https://elastic-search-in-action.medcl.com/

安装部署建议RPM包安装,参见:https://blog.csdn.net/abu935009066/article/details/119024223中的Elasticsearch安装

Elasticsearch 是自动分布的,它在设计时就考虑到可以隐藏分布操作的复杂性。

Elasticsearch 的分布式部分很简单。你甚至不需要关于分布式系统的任何内容,比如分片、集群、发现等成堆的分布式概念。

Elasticsearch 很努力地在避免复杂的分布式系统,很多操作都是自动完成的:

  • 可以将你的文档分区到不同容器或者分片中,这些文档可能被存在一个节点或者多个节点。

  • 跨节点平衡集群中节点间的索引与搜索负载。

  • 自动复制你的数据以提供冗余副本,防止硬件错误导致数据丢失。

  • 自动在节点之间路由,以帮助你找到你想要的数据。

  • 无缝扩展或者恢复你的集群。

Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式.

基本概念

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式。

| elasticsearch | mysql |

| — | — |

| 索引 index | 数据库 |

| 类型 mapping | 表 |

| 文档 docments | 数据行 |

| 字段 fields | 列 |

存储字段类型

  • text 文本类型,存入时会先分词

  • keyword 文本类型 ,存入时不会分词,可直接根据字符串内容建立反向索引

核心数据类型(Core datatypes)
  • 字符型(String datatype):string类型在ElasticSearch 旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代。

  • 数字型(Numeric datatypes):long:64位存储 , integer:32位存储 , short:16位存储 , byte:8位存储 , double:64位双精度存储 , float:32位单精度存储

  • 日期型(Date datatype):date

  • 布尔型(Boolean datatype):boolean

  • 二进制型(Binary datatype):binary

复杂数据类型(Complex datatypes)
  • 数组类型(

Array datatype

):数组类型不需要专门指定数组元素的type,例如:

  • 字符型数组: [ “one”, “two” ]

  • 整型数组:[ 1, 2 ]

  • 数组型数组:[ 1, [ 2, 3 ]] 等价于[ 1, 2, 3 ]

  • 对象数组:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]

  • 对象类型(Object datatype): object 用于单个JSON对象;

  • 嵌套类型(Nested datatype): nested 用于JSON数组;

地理位置类型(Geo datatypes)
  • 地理坐标类型(Geo-point datatype): geo_point 用于经纬度坐标;

  • 地理形状类型(Geo-Shape datatype): geo_shape 用于类似于多边形的复杂形状;

专业类型(Specialised datatypes)
  • IPv4 类型(IPv4 datatype): ip 用于IPv4 地址;

  • Completion 类型(Completion datatype): completion 提供自动补全建议;

  • Token count 类型(Token count datatype): token_count 用于统计做了标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少。

  • mapper-murmur3 类型:通过插件,可以通过 murmur3 来计算index的 hash 值;

  • 附加类型(Attachment datatype):采用mapper-attachments 插件,可支持 attachments 索引,例如Microsoft Office 格式,Open Document 格式,ePub, HTML 等。

Elasticsearch 也是 Master-slave 架构,也实现了数据的分片和备份。

插件


elasticsearch-head

Elasticsearch 集群的 Web 前端,elasticsearch-head被称为是弹性搜索集群的web前端,head插件主要是用来和elastic Cluster交互的Web前端

Github地址:https://github.com/mobz/elasticsearch-head

有多种方式安装,我选择从 Chrome 网上应用店安装ElasticSearch Head

下载地址:https://download.csdn.net/download/abu935009066/20602271

elasticsearch-HQ

监控和管理 ElasticSearch 实例和集群的 Web 应用程序

Github地址:https://github.com/ElasticHQ/elasticsearch-HQ

X-Pack

X-Pack 是一个 Elastic Stack 扩展,提供安全、警报、监控、报告、机器学习和许多其他功能。默认情况下,当您安装

Elasticsearch 时,会安装 X-Pack。

7.x 除了安全权健插件,其他都收费,其他版本都收费

IK分词插件

中文分词

Github地址:https://github.com/medcl/elasticsearch-analysis-ik

Pinyin插件

pinyin插件能够将文档和查询条件在汉字和拼音间转换

Github地址:https://github.com/medcl/elasticsearch-analysis-pinyin

icu

Elasticsearch的 ICU 分析器插件 使用 国际化组件 Unicode (ICU) 函数库(详情查看 site.project.org)提供丰富的处理 Unicode 工具。 这些包含对处理亚洲语言特别有用的 icu_分词器 ,还有大量对除英语外其他语言进行正确匹配和排序所必须的分词过滤器。

./elasticsearch-plugin install analysis-icu

IK与Pinyin组合使用

es分析器实际上是三个功能的封装,字符过滤器->分词器->token过滤器,按顺序执行 创建自定义分析器,格式如下

PUT localhost:9200/mytest

{

“setting”: {

“analysis”: {

“char_filter”: { 自定义的字符过滤器 },

“tokenizer”: { 自定义的分词器 },

“filter”: { 自定义的token过滤器 },

“analyzer”: { 自定义的分析器,可以将上面的char_filter、tokenizer、filter用不同的组合拼起来,形成不同的分析器 }

}

}

}

示例

http://localhost:9200/article_ik_pinyin

{

“settings”: {

“number_of_shards”:“6”,

“number_of_replicas”:“1”,

“index”:{

“analysis”: {

“analyzer”: {

“ik_pinyin_analyzer”: {

“type”:“custom”,

“tokenizer”:“ik_max_word”,

“filter”:“pinyin_filter”

}

},

“filter”:{

“pinyin_filter”:{

“type”:“pinyin”,

“keep_first_letter”:false

}

}

}

}

},

“mappings”: {

“article_ik_pinyin”: {

“properties”: {

“id”: {

“type”:“text”

},

“title”: {

“analyzer”:“ik_pinyin_analyzer”,

“type”:“text”

}

}

}

}

}

elasticsearch-sql

地址:https://github.com/NLPchina/elasticsearch-sql/

搭建集群


内核参数设置

设置内核参数

vim /etc/sysctl.conf

添加如下内容:

fs.file-max=65536

vm.max_map_count=262144

之后可以使用sysctl –a查看 –p刷新

设置资源参数

[root@hadoop3 opt]# vi /etc/security/limits.conf

添加一下内容:

  •            soft    nofile          65536
    
  •            hard    nofile          131072
    
  •            soft    nproc           2048
    
  •            hard    nproc           4096
    

修改进程数

[root@hadoop3 opt]# vi /etc/security/limits.d/20-nproc.conf

  •      soft    nproc     4096
    

节点分为四个类型:

  • 主节点:即 Master 节点。主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。

  • 数据节点:即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对 CPU、内存、IO 要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。

  • 负载均衡节点:也称作 Client 节点,也称作客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。

  • 预处理节点:也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。

常规配置

cluster.name: laker # 集群名称,同名称为集群节点

node.name: node-1 # 节点名称,默认会随机取名称 仅仅是描述名称,用于在日志中区分

node.master: true # 是否为master节点

node.data: true # 是否为数据节点

network.host: 0.0.0.0

在elasticsearch.yml增加配置:

#设置为true来锁住内存。因为内存交换到磁盘对服务器性能来说是致命的,当jvm开始swapping时es的效率会降低,所以要保证它不swap

bootstrap.memory_lock: true

transport.tcp.compress: true

设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点

#Elasticsearch将绑定到可用的环回地址,并将扫描端口9300到9305以尝试连接到运行在同一台服务器上的其他节点。

#这提供了自动集群体验,而无需进行任何配置。数组设置或逗号分隔的设置。每个值的形式应该是host:port或host

#(如果没有设置,port默认设置会transport.profiles.default.port 回落到transport.tcp.port)。

#请注意,IPv6主机必须放在括号内。默认为127.0.0.1, [::1]

discovery.zen.ping.unicast.hosts: [“192.168.8.101:9300”, “192.168.8.103:9300”, “192.168.8.104:9300”]

#如果没有这种设置,遭受网络故障的集群就有可能将集群分成两个独立的集群 - 分裂的大脑 - 这将导致数据丢失

#为了避免脑裂,集群节点数最少为 半数+1

discovery.zen.minimum_master_nodes: 2

添加优化配置,只在master节点配置即可

discovery.zen.ping_timeout: 200s

discovery.zen.fd.ping_timeout: 200s

discovery.zen.fd.ping_interval: 30s

discovery.zen.fd.ping_retries: 5

脑裂问题

假设使用两个节点, 启动后, 集群会选举一个master, 一切ok. 但是如果存在网络问题或者某个节点无响应(负载过高), 就会认为对方dead了, 然后两个节点自动选举为master, 在后续建索引的时候造成数据不一致.

两个节点防脑裂的配置, minimum_master_nodes决定了选主需要的最少节点数, N/2+1, 两个节点即2

discovery.zen.minimum_master_nodes: 2

索引查看

http://ip:9200/_cat/indices?v

数据可视化


kibana

es官方提供的可视化套件,集成了es开发工具、报表、仪表盘、数据挖掘等功能https://www.elastic.co/guide/en/kibana/current/targz.html

kibana6.7+才支持汉化

优化


  • 集群规划

  • 存储策略

  • 索引拆分

  • 压缩

  • 冷热分区等

什么是时序索引?其主要特点体现在如下两个方面:

  • **存,**以时间为轴,数据只有增加,没有变更,并且必须包含 timestamp(日期时间,名称随意)字段。

其作用和意义要大于数据的 id 字段,常见的数据比如我们通常要记录的操作日志、用户行为日志、或股市行情数据、服务器 CPU、内存、网络的使用率等。

  • **取,**一定是以时间范围为第一过滤条件,然后是其他查询条件,比如近一天、一周、本月等等,然后在这个范围内进行二次过滤。

比如性别或地域等,查询结果中比较关注的是每条数据和 timestamp 字段具体发生的时间点,而非 id。

集群规划

Elasticsearch(下称 ES)集群中有两个主要角色:Master Node 和 Data Node

Master Node

Master Node,整个集群的管理者,负有对 index 的管理、shards 的分配,以及整个集群拓扑信息的管理等功能。

Master Node 可以通过 Data Node 兼任,但是,如果对群集规模和稳定要求很高的话,就要职责分离,Master Node 推荐独立,它的状态关乎整个集群的存活。

Master 的配置:

node.master: true

node.data: false

node.ingest: false

这样 Master 不参与 I、O,从数据的搜索和索引操作中解脱出来,专门负责集群的管理工作,因此 Master Node 的节点配置可以相对低一些。

防止 ES 集群 split brain(脑裂),合理配置 discovery.zen.minimum_master_nodes 参数,官方推荐 master-eligible nodes / 2 + 1向下取整的个数。

这个参数决定选举 Master 的 Node 个数,太小容易发生“脑裂”,可能会出现多个 Master,太大 Master 将无法选举。

Data Node

Data Node 是数据的承载者,对索引的数据存储、查询、聚合等操作提供支持。

这些操作严重消耗系统的 CPU、内存、IO 等资源,因此,应该把最好的资源分配给 Data Node,因为它们是真正干累活的角色,同样 Data Node 也不兼任 Master 的功能。

Data 的配置:

node.master: false

node.data: true

node.ingest: false

Coordinating Only Node

ES 本身是一个分布式的计算集群,每个 Node 都可以响应用户的请求,包括 Master Node、Data Node,它们都有完整的 Cluster State 信息。

在某个 Node 收到用户请求的时候,会将请求转发到集群中所有索引相关的 Node 上,之后将每个 Node 的计算结果合并后返回给请求方。

查询节点如果在并发和数据量比较大的情况下,由于数据的聚合可能会让内存和网络出现瓶颈。

在职责分离指导思想的前提下,这些操作我们也应该从这些角色中剥离出来,官方称它是 Coordinating Nodes,只负责路由用户的请求,包括读、写等操作,对内存、网络和 CPU 要求比较高。

Coordinating Only Nodes 可以笼统的理解为是一个负载均衡器,或者反向代理,只负责读,本身不写数据,它的配置是:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值