从零基础的内容开始介绍Elasticsearch,主要包含以下内容:
Elasticsearch简称ES,是世界上非常受欢迎的开源的分布式搜索引擎。它使用Java语言,基于Apache Lucene开发,从2010年发布第一个版本至今已有十余年的历史。Elastic的中文含义是“有弹性的、可伸缩的”,顾名思义,你可以很方便地使用Elasticsearch提供的可扩展的企业级搜索服务。Elasticsearch的官方网站对它的解释是:Elasticsearch是一个分布式、RESTful的搜索和数据分析引擎。没错,它为我们提供的很重要的两大功能就是大数据搜索和分析服务。
如果你是软件开发人员,那么对关系数据库的使用应该不陌生。传统的关系数据库可以使用SQL(Structured Query Language,结构化查询语言)对数据进行查询和统计分析,但是在“大数据时代”,关系数据库在使用时存在明显的短板,导致它的应用存在一些缺点:
较之于关系数据库,Elasticsearch则存在几个明显的优点:
Elasticsearch有以下几个典型的业务场景,可供开发者参考:
探讨适合接入Elasticsearch的几种典型方式,帮助大家明确Elasticsearch的正确接入方法。
Elasticsearch很适合读多写少的数据分析型应用程序,如果你参与过OLAP数据分析相关的项目,由于数据仓库本身就具有读多写少的特性,对事务管理的要求也不高,在这种情况下,考虑到Elasticsearch本身具备数据存储的能力,可以作为数据源,使应用程序的绝大多数读写操作都在Elasticsearch中进行,如下图所示:
如果你已经有一个软件系统,它使用了MySQL或者HBase数据库,但是随着数据量的不断加大,你可能会感觉MySQL的查询速度越来越难以接受,也可能由于业务逻辑越来越复杂,而感觉HBase的检索方式不够丰富。这时候你可以考虑把那些查询速度慢或者业务逻辑复杂的数据接入Elasticsearch,使用时你需要把相关表的历史存量数据一次性导入Elasticsearch,当增量数据写入数据库时,也往Elasticsearch中写一份,这样就能够保证两边的数据是同步的,如下图所示:
注意:当关系数据库或NoSQL数据库能够满足实际需要的查询请求时,则没有必要接入Elasticsearch。实际上,关系数据库和NoSQL数据库的主键查询速度本身就很快,能够满足部分场景的需要,可以用它们分担一些查询请求,减小Elasticsearch的压力。另外,写入Elasticsearch的字段数目并不强制要求与数据库的一致。只有实际需要检索、分析和前端展示的字段才必须写入Elasticsearch。在Elasticsearch中写入字段数目过多的文档对性能而言是一种拖累,并且会浪费资源。
提到Elasticsearch的接入方式,怎么能不讲官方的Elastic Stack呢?除了使用应用程序写入Elasticsearch,你还可以使用官方提供的数据采集工具Logstash或者第三方的ETL工具把数据写入Elasticsearch。这些工具除了能用来采集数据库的数据,还可以用来采集线上的日志数据、系统的运维监控指标数据,功能十分丰富。Elastic Stack的组件Kibana提供了一个友好的图形界面,可以用来管理和可视化分析Elasticsearch的数据,整个技术栈的数据流如下图所示:
Logstash是早期的数据采集、转换工具,你只需要编写配置文件就可以很方便地把各种数据写入Elasticsearch。但是由于Logstash运行时比较耗资源,于是官方又推出了一系列命名包含beat的轻量级数据采集器,统称为Beats,相当于把Logstash的数据采集功能分包给Beats工具完成。既可以把Beats采集的数据汇聚到Logstash后再写入Elasticsearch,也可以直接采集数据然后写入Elasticsearch。
目前为止,Beats家族的成员主要有以下几种,种类还在不断增多:
Elasticsearch提供了很多专有名词,在学习Elasticsearch的原理和使用方法以前,有必要先弄懂这些专有名词。
本节讲述在Windows系统上安装单节点的Elasticsearch 7.9.1的方法。先到Elastic官方网站下载Elasticsearch 7.9.1的安装包(ZIP格式的压缩包)。Elasticsearch 7.9.1的安装包中已经自带一个JDK,如果你的计算机没有安装JDK,就会使用这个内嵌的JDK。如果你想使用自己计算机中的JDK,请安装好1.8以上的版本并配置好环境变量。
把下载的安装包解压到Elasticsearch的安装目录下,你会看到下图所示的文件目录:
部分目录(文件夹)说明如下:
进入config目录,打开elasticsearch.yml文件,给集群和节点配置名称:
cluster.name: my-es
node.name: node-1
打开bin目录,双击运行elasticsearch.bat文件,你会看到一个控制台,其会不断地输出Elasticsearch启动时的信息。稍等一会儿,打开浏览器,访问http://localhost:9200/,如果看到下图所示的界面,则表示Elasticsearch启动成功:
Elasticsearch提供了非常方便的REST API,你可以直接使用Postman或者Curl工具调用接口进行数据的写入和搜索。为了调试方便,Kibana提供了一个图形化的开发工具,你可以直接在前端界面设置发送到Elasticsearch的HTTP请求并查看响应结果。
下面介绍在本地节点安装Kibana 7.9.1,先在Elastic官方网站下载Kibana 7.9.1的安装包(ZIP格式的压缩包)。
Kibana的安装十分简单,解压安装包到本地以后,不需要修改任何配置,在Elasticsearch正常运行的情况下,进入bin目录,双击批处理文件kibana.bat就可以成功运行。启动时,Kibana会自动连接本地运行的Elasticsearch。打开浏览器,访问http://localhost:5601/,看到下图所示的页面则说明Kibana启动成功:
在Elasticsearch的config文件夹下,一共有3个重要的配置文件,其中elasticsearch.yml用于配置节点的参数,jvm.options用来配置Elasticsearch运行时占用的堆内存大小,log4j2.properties用来配置Elasticsearch运行时的日志参数。那些可以通过调用REST接口,在节点运行时动态修改的配置叫作动态配置;配置在elasticsearch.yml文件中,只能在集群重启后才能生效的配置叫作静态配置。
当你需要修改集群节点的配置信息时,通常有以下3种方法:
如果一个配置项没有采用以上3种方法进行配置,则会采用集群节点默认的配置。如果同一个配置项在多个地方都配置过,而且配置得不一样,则第一种临时配置的优先级最高,第二种持久生效的配置次之,写在elasticsearch.yml文件中的配置优先级最低。通常比较好的做法是,对于整个集群范围内生效的动态配置直接使用REST接口进行控制,对于每个节点各自不同的配置(例如IP地址)直接在节点的elasticsearch.yml中配置,这样做可以避免遗漏某个节点的配置而引起错误。
你可以调用下面的REST接口修改动态配置并让它持久生效:
PUT /_cluster/settings
{
"persistent" : {
"search.max_buckets" : "50000"
}
}
配置参数search.max_buckets用于指明在做聚集统计时,单个请求能够返回的桶的最大数目,这里已经把它持久地设置成50000。接下来把这个配置参数的值改为30000并设置为临时生效:
PUT /_cluster/settings
{
"transient" : {
"search.max_buckets" : "30000"
}
}
再使用GET端点查看刚才的配置结果:
GET /_cluster/settings
Kibana会返回刚才的两 种配置的信息:
{
"persistent" : {
"search" : {
"max_buckets" : "50000"
}
},
"transient" : {
"search" : {
"max_buckets" : "30000"
}
}
}
这时如果你重启Elasticsearch,再查询一次配置结果,就会发现刚才的临时配置不见了,只剩下持久配置,这表明持久配置在节点重启后依然有效。
另外,如果你想清空某一配置的信息,只要把它配置为null就行:
PUT /_cluster/settings
{
"persistent": {
"search.max_buckets": null
}
}
本小节介绍elasticsearch.yml的重要配置,通常你可以把集群节点的静态配置写在这个文件里,只有重启Elasticsearch后这些配置的修改才能生效。
打开elasticsearch.yml,你可以看到里面已经有一些关键的配置,最上面的是集群名称和节点名称的配置,它们在第四节介绍安装Elasticsearch的时候已经配置过了。注意,在同一个集群中,多个节点的集群名称要配置成一样的,节点名称要配置成不一样的,以区分同一个集群中的不同节点。
这两个配置项用于配置数据目录和日志目录,在生产环境中,由于文件较大,应尽量配置存储容量大的目录,可以配置多个目录。例如,在Windows系统中可以进行如下配置:
path:
data: "C:\\esdata1 "
logs:
- "C:\\logs1"
- "D:\\logs2"
如果是Linux系统,则路径不需要加引号,代码如下:
path:
data:
- /esdata1
- /esdata2
logs:
- /var/log/eslog1
- /var/log/eslog2
这是用于操作系统内存锁的配置项,开启内存锁可以防止操作系统中的缓存数据被交换到外存而导致查询性能大幅下降,在生产环境中,这个配置项一定要设置为true:
bootstrap.memory_lock: true
为了验证内存锁是否正常开启,启动Elasticsearch后,调用以下接口:
GET _nodes?filter_path=**.mlockall
返回true值则表示内存锁开启成功:
{
"nodes" : {
"EIjMhNrDSoy-Bbmo3W8JGA" : {
"process" : {
"mlockall" : true
}
}
}
}
注意:在CentOS中,直接设置bootstrap.memory_lock为true可能会因为缺少权限并不能立即开启内存锁,还需要一些额外的配置。
这两个配置项用于把Elasticsearch的服务绑定到固定的IP地址和端口号,默认的IP地址是127.0.0.1,端口号是9200,可以按照实际需要进行修改:
network.host: 192.168.9.105
http.port: 9201
这两个配置项在单节点环境下保持默认设置即可,当需要搭建集群时,这两个配置项对于节点的发现和主节点的选举至关重要。discovery.seed_hosts用于配置一组IP地址或主机名,这组地址的列表是集群中的主候选节点的列表,当一个节点启动时会尝试与该列表中的各个主候选节点建立连接,如果连接成功并找到主节点就把该节点加入集群。例如:
discovery.seed_hosts:
- 192.168.9.10
- 192.168.9.11
- host3.com
cluster.initial_master_nodes用于明确地指定一组节点名称的列表,这个列表也是主候选节点的列表,Elasticsearch集群在第一次启动时会读取该列表初始化投票配置,该配置将用于主节点的选举。在这个列表中,配置的每个节点的名称要与该节点的node.name配置的名称保持一致。例如:
cluster.initial_master_nodes: ["node-1", "node-2"]
在生产环境中,有必要根据服务器的硬件配置修改Elasticsearch运行时的JVM堆内存大小,以保证集群节点拥有足够的堆内存。如果设置得太小,可能查询时内存不够而导致服务宕机;如果设置得太大,又会超过JVM用于压缩对象指针的阈值而导致内存浪费。在配置堆内存大小的时候,需要满足以下两个条件:
heap size [989.8mb], compressed ordinary object pointers [true]
默认的堆内存大小是1GB,如果你想把它设置为4GB,修改jvm.options文件为:
-Xms4g
-Xmx4g
其中Xms代表最小的堆内存大小,Xmx代表最大的堆内存大小,这两个值必须设置成一样的。
本帖介绍的是Elasticsearch的入门内容,主要介绍了Elasticsearch的功能和业务场景等,并介绍了如何在本地安装Elasticsearch、修改配置并使用Kibana对它进行调试。本章的主要内容总结如下: