ElasticSearch - 概述以及搭建
文章目录
ElasticSearch - 概述以及搭建
1.ElasticSearch概述
关于ElasticSearch大家可以通过官方文档了解一些相关的信息,这里贴出两个个人觉得不错的相关资料供大家参考。
Mastering Elasticsearch
ElasticSearch权威指南
Elasticsearch学习,请先看这一篇!
1.1 ElasticSearch是什么?
ElasticSearch是一个基于Lucene的开源搜索引擎。Lucene可以被认为是目前功能最全、性能最好的搜索引擎库。但是Lucene只是一个库。我们想要去使用它就必须将其集成到我们的Java应用中,而且Lucene十分复杂,我们需要深入了解检索的相关知识来理解它是如何工作的才能够更好的使用。Elasticsearch是使用Java开发并且以Lucene作为核心来实现所有索引和检索的功能,它提供了一个分布式多用户能力的全文搜索引擎,它的主要目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而使全文搜索变得更加简单。
它设计用于云计算中,能够达到实时搜索,稳定、可靠、快速、安装方便。构建在全文检索开源软件Lucene之上的ElasticSearch,不仅能对海量规模的数据完成分布式索引和检索,还能提供数据聚合分析。根据国际权威的数据库产品评测机构统计,ElasticSearch,目前已经超过Solr等,成为排名第一的搜索引擎类应用。
而且Elasticsearch不仅仅是Lucene和全文搜索,以下也可以称之为其特征:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
所有的这些功能被集成到一个服务里面,我们的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
当我们稍微了解Elasticsearch开发团队最初的核心理念和架构设计可以发现它还具备以下几个特征:
- 开箱即用:安装好ElasticSearch后,所有参数的默认值都自动进行了比较合理的设置,基本不需要额外的调整。包括内置的发现机制(比如Field类型的自动匹配)和自动化参数配置。
- 天生集群:ElasticSearch默认工作在集群模式下。节点都将视为集群的一部分,而且在启动的过程中自动连接到集群中。
- 自动容错:ElasticSearch通过P2P网络进行通信,这种工作方式消除了单点故障。节点自动连接到集群中的其它机器,自动进行数据交换及以节点之间相互监控。索引分片
- 扩展性强:无论是处理能力和数据容量上都可以通过一种简单的方式实现扩展,即增添新的节点。
- 近实时搜索和版本控制:由于ElasticSearch天生支持分布式,所以延迟和不同节点上数据的短暂性不一致无可避免。ElasticSearch通过版本控制(versioning)的机制尽量减少问题的出现。
1.2 ElasticSearch基本概念
我们在使用ElasticSearch之前需要先对其有一个大致的了解,这里我们就先来了解一下。
- Index
类似于mysql数据库中的database,在ElasticSearch中被视为单独的一个索引(index),在Lucene中可能不止一个。这是因为在分布式体系中,ElasticSearch会用到分片(shards)和备份(replicas)机制将一个索引(index)存储多份。- Type
类似于mysql数据库中的table表,es中可以在Index中建立type,通过mapping进行映射- Document
由于es存储的数据是文档型,一条数据对应一篇文档即相当于mysql数据库中的一行数据,一个文档中可以有多个字段即mysql数据库一行可以有多列。- Filed
es中一个文档中对应的多列与mysql数据库中每一列对应- Mapping
有的文档(Document)在存储之前都必须经过分析(analyze)流程。用户可以配置输入文本分解成Token的方式;哪些Token应该被过滤掉;或者其它的的处理流程,比如去除HTML标签。此外,ElasticSearch提供的各种特性,比如排序的相关信息。保存上述的配置信息,这就是参数映射(Mapping)在ElasticSearch中扮演的角色。尽管ElasticSearch可以根据域的值自动识别域的类型(field type),在生产应用中,都是需要自己配置这些信息以避免一些奇的问题发生。要保证应用的可控性。- Indexed
即建立索引。mysql中一般会对经常使用的列增加相应的索引用于提高查询速度,而在es中默认都会加上索引,除非特殊制定不建立索引只是进行存储用于展示。- Query DSL
类似于mysql数据库中的sql语句,只不过在es中是使用的json格式查询语句- GET/PUT/POST/DELETE
类似于mysql中的 select/update/delete
1.3 RESTfull API
这是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务端交互类应用,基于该风格设计的应用可以更简洁、更有层次、更易于实现缓存等机制。目前主流的三种Web服务交互方案中,REST相比于SOAP以及XML-RPC更加简洁明了。
Representational State Transfer是指表达性状态传递,它使用典型的HTTP方法,例如GET/POST/DELETE/PUT来实现资源获取/添加/修改/删除等操作。即通过HTTP动词来实现资源的状态传递:
GET 用于获取资源
POST 用于创建(更新)资源
PUT 用于更新资源
DELETE 用于删除资源
1.4 Curl命令
在真正安装使用ElasticSearch我们先稍微了解一下Curl命令,这个命令相信大部分同学都早就已经使用甚至很熟练,这里只做简单带过一下基本使用
curl是以命令的方式执行HTTP协议的请求 GET/POST/PUT/DELETE
- 例如访问一个网页
curl www.baidu.com
curl -o example.html www.baidu.com- 显示响应头部信息
curl -i www.example.com- 显示一次HTTP请求的通信过程
curl -v www.example.com- 执行GET/POST/PUT/DELETE请求
curl -X GET www.example.com
2.ElasticSearch搭建
我们这里主要介绍一下Linux环境下如何安装ElasticSearch
2.1 JDK环境安装配置
由于ElasticSearch采用Java语言编写,这里我们首先需要在服务器上安装好JDK并且配置好环境变量,在这里不做介绍。
2.2 ElasticSearch下载安装
我们可以通过官网-Download ElasticSearch下载对应版本以及环境的安装包并将其解压至
/usr/local/elasticsearch
目录下。然后通过./bin/elasticsearch启动。
这里出现一个问题是由于空闲内存不足导致,我们可以修改config/jvm.options
参数调整内存分配-Xms200m -Xmx200m
调整了jvm内存分配之后重新启动
这里我们可以通过./bin/elasticsearch -Des.insecure.allow.root=true
或者在bin/elasticsearch
中添加ES_JAVA_OPTS="-Des.insecure.allow.root=true"
启动之后依然出现问题,这是由于系统出于安全考虑设置的条件,由于ElasticSearch可以接收用户输入脚本并执行,为了系统安全建议创建一个单独的用户来运行ElasticSearch。
这里我们来新建一个es操作专用用户组和用户并且授权
# 创建用户组以及用户 groupadd esgroup useradd esuser -g esgroup -p espassword # 更改elasticsearch文件夹以及内部文件的所属用户及组 chown -R esuser.esgroup elasticsearch # 切换用户 su esuser
再次启动如果显示已杀死的情况,则需要调整JVM大小,修改bin/elasticsearch 中ES_JAVA_OPTS="-Xms200m -Xmx200m"即可,当然在启动过程中还会出现一种情况则是需要我们清理一下磁盘空间即可。
启动成功后我们通过curl 127.0.0.1:9200
看到以下信息则表示elasticsearch已经基本搭建启动完成了。
这里我们可以在启动时带上-d
参数,则可以后台启动:./bin/elasticsearch -d
2.3 ElasticSearch配置远程访问
我们想要在服务器之外的地方访问我们服务器搭建的elasticsearch需要对
config/elasitcsearch.yml
进行配置修改network.host: xxx.xx.xxx.xx(这里修改为自己服务器的ip) http.port: 9200
修改配置之后启动,此时启动失败,可能会出现以下几个错误,我们逐个解决。
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
这个问题在/etc/security/limits.conf
配置文件中加入或修改几行配置即可esuser soft nofile 65536 esuser hard nofile 65536 esuser soft nproc 4096 esuser hard nproc 4096
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
这个问题在/etc/sysctl.conf
配置文件中加入下面这行参数之后执行sysctl -p即可vm.max_map_count=655360
上面问题解决后,可能有的同学还会出现
max number of threads [3790] for user [esuser] is too low,increase to at least [4096]
,这里需要我们修改/etc/security/limits.d/20-nproc.conf
配置文件中* soft nproc 4096 -> esuser soft nproc 4096
完成以上几步之后重新启动elasticsearch,发现启动成功,这时我们远程去访问成功。这里如果还是没有成功的同学可能是因为防火墙端口问题,放行端口或者关闭防火墙即可。