Elasticsearch
Elasticsearch是一个分布式搜索和分析引擎,具有高扩展性和高可用性。它由Elastic公司提供,是Elastic Stack(ELK Stack)的核心技术之一,ELK Stack包括Elasticsearch、Kibana和Logstash等组件。本文将详细介绍Elasticsearch的安装使用、分片机制以及其它相关功能。
一、Elasticsearch的安装
Elasticsearch的安装可以通过多种方式完成,包括从官方网站下载安装包、使用wget命令下载、通过Docker启动等。以下是具体的安装步骤:
-
下载安装包
- 从Elasticsearch的官方网站(https://www.elastic.co/cn/products/elasticsearch)下载相应版本的安装包。
- 或者,在Linux系统中,使用wget命令下载。例如,下载7.x.x版本的安装包:
请将wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.x.x-linux-x86_64.tar.gz
7.x.x
替换为具体的版本号。
-
解压安装包
将下载的安装包解压到指定目录。例如:
tar -xvf elasticsearch-7.x.x-linux-x86_64.tar.gz
-
创建数据目录
进入解压后的Elasticsearch目录,并创建
data
文件夹用于存储数据。 -
配置参数
- 进入
config
文件夹,编辑elasticsearch.yml
配置文件,设置网络访问权限等参数。例如,将network.host
修改为0.0.0.0
,以允许所有服务器访问。 - 修改内存配置,编辑
config/jvm.options
文件,根据服务器内存情况调整JVM参数。 - 修改系统配置,编辑
/etc/sysctl.conf
文件,增加一行vm.max_map_count=262144
,然后执行sysctl -p
使配置生效。
- 进入
-
创建专用账号
Elasticsearch 5.0之后不能使用root账号启动,因此需要创建专用账号并设置密码。赋予专用账号对Elasticsearch目录的读写权限。
-
启动服务
- 进入Elasticsearch的
bin
目录,执行./elasticsearch
命令启动服务。 - 或者,可以使用Docker命令启动Elasticsearch服务。例如:
请将docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network host \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.x.x
7.x.x
替换为具体的版本号。
- 进入Elasticsearch的
-
访问服务
在浏览器中访问
http://<服务器IP>:9200
,查看Elasticsearch服务是否启动成功。
二、Elasticsearch的使用
Elasticsearch提供了丰富的API,用于创建索引、查看索引、删除索引、创建文档、查看文档、修改文档、删除文档、创建映射、查看映射以及分词器和聚合查询等操作。
-
创建索引
使用PUT请求向Elasticsearch发送创建索引的请求。例如:
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
-
查看索引
使用GET请求查看所有索引或单个索引的信息。例如:
GET /_cat/indices?v
GET /my_index
-
删除索引
使用DELETE请求删除指定索引。例如:
DELETE /my_index
-
创建文档
使用POST请求向指定索引中添加文档。例如:
POST /my_index/_doc/1
{
"name": "John Doe",
"age": 30
}
-
查看文档
使用GET请求查看指定索引中的文档。例如:
GET /my_index/_doc/1
-
修改文档
可以使用POST请求或PUT请求修改文档。PUT请求会替换整个文档,而POST请求可以部分更新文档。例如:
PUT /my_index/_doc/1
{
"name": "John Smith",
"age": 31
}
POST /my_index/_update/1
{
"doc": {
"age": 32
}
}
-
删除文档
使用DELETE请求删除指定索引中的文档。注意,删除文档是逻辑删除,文档不会立即从磁盘上移除。例如:
DELETE /my_index/_doc/1
-
创建映射
定义索引中文档的字段及其数据类型等属性。使用PUT请求向指定索引发送创建映射的请求。例如:
bash复制代码
PUT /my_index
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
-
查看映射
使用GET请求查看指定索引的映射信息。例如:
GET /my_index/_mapping
-
分词器
Elasticsearch支持多种分词器,可以对文本进行分词处理,以便进行更精确的搜索。例如,可以使用IK分词器对中文文本进行分词。
-
聚合查询
Elasticsearch支持复杂的聚合查询,可以对数据进行统计分析、分组等操作。例如:
POST /my_index/_search
{
"size": 0,
"aggs": {
"age_groups": {
"terms": {
"field": "age"
}
}
}
}
-
全文搜索
Elasticsearch擅长处理海量数据的全文搜索,支持多种查询语法和过滤器,可以实现高效的搜索功能。例如:
GET /my_index/_search
{
"query": {
"match": {
"name": "John"
}
}
}
三、Elasticsearch的分片机制
Elasticsearch通过分片(Shard)和副本(Replica)的概念实现了高扩展性和高可用性。
-
分片的定义
分片是Elasticsearch中存储数据的基本单位。一个索引可以由多个分片组成,每个分片都是一个独立的Lucene索引。通过分片,Elasticsearch可以将数据分布到多个节点上,从而实现数据的分布式存储和并行处理。
-
分片的重要性
分片机制使Elasticsearch具有以下优势:
- 水平扩展:通过增加分片数量,可以水平扩展索引的存储容量和处理能力。
- 并行处理:分片可以分布在不同的节点上,允许多个节点并行处理查询和索引请求,提高系统的性能和吞吐量。
- 数据分布:分片机制使数据可以分布在集群的多个节点上,减少单点故障的风险,提高数据的可用性和可靠性。
-
分片的类型
Elasticsearch中的分片分为两种类型:
- 主分片(Primary Shard):主分片是原始的数据分片,所有的写操作(如索引和删除)都首先作用于主分片。
- 副本分片(Replica Shard):副本分片是主分片的复制品,用于提高数据的可用性和查询性能。副本分片接收来自主分片的数据更新,并在主分片不可用时提供冗余。
-
分片的分配
Elasticsearch会自动管理分片和副本的分配,确保它们分布在集群的不同节点上,以最大限度地提高系统的容错能力和性能。
- 分片创建:Elasticsearch根据索引的分片设置,创建指定数量的主分片。
- 分片分配:Elasticsearch将主分片分配到集群中的不同节点上,确保分片均匀分布。
- 副本创建:Elasticsearch根据索引的副本设置,为每个主分片创建副本分片。
- 副本分配:Elasticsearch将副本分片分配到与主分片不同的节点上,确保数据冗余。
-
数据写入过程
在Elasticsearch中,数据的写入过程包括以下步骤:
- 写请求发送到主分片:所有的写操作(如索引和删除)首先发送到主分片。
- 主分片处理写请求:主分片处理写请求,将数据写入到分片中。
- 写请求同步到副本分片:主分片将写操作同步到副本分片。一旦主分片处理完写请求,它会将这个更改同步到它所有的副本分片上。这是为了确保数据的冗余和一致性。
- 副本分片应用更改:副本分片接收来自主分片的更改,并将其应用到自己的数据结构中。
- 写操作确认:一旦所有的副本分片都应用了更改,并且主分片确认了这个同步过程,写操作就被认为是成功的。
-
数据读取过程
在Elasticsearch中,数据的读取过程(即查询过程)可以是从主分片读取,也可以是从副本分片读取,这取决于Elasticsearch的路由策略和负载均衡设置。
- 查询发送到协调节点:查询请求首先发送到集群中的一个协调节点(通常是接收查询请求的节点)。
- 协调节点确定分片:协调节点根据查询的路由键(如文档的ID)确定哪些分片包含所需的数据。
- 协调节点分发查询:协调节点将查询请求分发到包含数据的分片上,这些分片可以是主分片,也可以是副本分片。
- 分片处理查询:每个分片在自己的数据上执行查询,并将结果返回给协调节点。
- 协调节点合并结果:协调节点接收来自各个分片的查询结果,将它们合并成一个完整的查询结果,然后返回给客户端。
-
分片的重新平衡
随着集群的扩展和收缩,Elasticsearch会自动触发分片的重新平衡过程,以确保数据在集群中的均匀分布。
- 集群状态监控:Elasticsearch持续监控集群的状态,包括节点的健康状况、分片的分布等。
- 触发重新平衡:当集群状态不满足预设的阈值时(如某个节点的分片过多或过少),Elasticsearch会触发重新平衡过程。
- 重新分配分片:Elasticsearch会根据当前的集群状态和目标状态,决定哪些分片需要重新分配,并将它们移动到更合适的节点上。
- 更新集群状态:一旦分片重新分配完成,Elasticsearch会更新集群状态,确保所有的节点和分片都处于一致的状态。
-
分片的故障恢复
当集群中的某个节点出现故障时,Elasticsearch会自动触发故障恢复过程,以确保数据的可靠性和可用性。
- 检测节点故障:Elasticsearch通过集群内部的通信机制,持续检测每个节点的健康状况。
- 标记故障分片:一旦检测到某个节点出现故障,Elasticsearch会将该节点上的所有分片标记为故障状态。
- 选举新的主分片:对于每个故障的主分片,Elasticsearch会在其副本分片中选举一个新的主分片。
- 重新分配副本分片:为了确保数据的冗余,Elasticsearch会将新的主分片的副本重新分配到其他健康的节点上。
- 更新集群状态:一旦故障恢复过程完成,Elasticsearch会更新集群状态,确保所有的节点和分片都处于一致的状态。
-
通过分片机制,Elasticsearch实现了数据的分布式存储和并行处理,提供了高扩展性和高可用性。同时,Elasticsearch还通过副本分片、重新平衡和故障恢复等机制,确保了数据的可靠性和一致性。这些特性使得Elasticsearch成为处理海量数据的强大工具,广泛应用于日志分析、全文搜索、实时监控等领域。