引言
ELasticsearch作为一个分布式搜索引擎,能够出色地支持集群模式、动态水平扩容、故障转移等分布式系统特性,这是其作为全文搜索引擎首选的重要原因,今天我们就来看看集群的配置和扩容过程,让你Elasticsearch集群的工作原理彻底理解。
一、集群配置
Elasticsearch集群的配置是确保其稳定运行的基础。下面我们将介绍不同类型的Elasticsearch集群配置,并包含代码介绍以及使用。
1.1 空集群
空集群是指没有存储任何数据的集群。在实际应用中,我们通常会通过添加节点来构建空集群。
# 初始化集群
bin/elasticsearch -Des.cluster.name=my-empty-cluster
当我们启动了一个Elasticsearch节点,默认就是创建了一个Elasticsearch集群,只是这个集群只有一个节点。此时如果没有创建索引,则集群处于一种"空"的状态。
此时通过_cluster API查看集群状态,可以看到status为green,节点数量number_of_nodes为1,数据节点数量number_of_data_nodes也为1,因为没有创建索引,所以分片数目为0。
-
而status字段指示着当前集群在总体上是否工作正常
-
以下是他的三种含义
-
green 所有的主分片和副本分片都正常运行
-
yellow 所有的主分片都正常运行,但不是所有的副本分片都正常运行。
-
red 有主分片没能正常运行。
而我们上面创建的空集群当前不存在主分片也不存在副本分片没正常运行的,通过_cluster API查看集群状态时所显示的状态为green。
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
1.2 单节点集群
单节点集群是最简单的集群形式,它由单个Elasticsearch节点组成。这种集群适用于开发和测试环境,但不建议用于生产环境。
# 启动单节点集群
bin/elasticsearch -Des.cluster.name=my-single-node-cluster
为当前集群添加索引,指定主分片数量为3,副本分片数量为1
$ curl -X PUT "localhost:9200/cumstomer?pretty" -H 'Content-Type: application/json' -d'
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
'
此时再次查看集群的状态可以看到此时活动的主分片数量为3,未分片的分片数量也为3,未分配的分片主要是三个主分片对应的副本分片,由于主分片与副本分片不能存在于同个节点,所以副本分片无法分配,此时集群的状态为yellow。
{
"cluster_name" : "elasticsearch",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 3,
"active_shards" : 3,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 3,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 50.0
}
1.3 两节点集群
两节点集群是由两个Elasticsearch节点组成的。这种集群可以提供基本的冗余和故障转移能力,适用于小型生产环境。
# 启动第一个节点
bin/elasticsearch -Des.cluster.name=my-two-node-cluster
# 启动第二个节点,确保与第一个节点的网络可以互相通信
二、水平扩容
水平扩容是Elasticsearch集群的一个重要特性,它允许我们通过添加更多节点来增加集群的性能和容量。
2.1 主分片的扩容
主分片是Elasticsearch中数据的主要副本。扩容主分片可以通过增加新节点来实现,从而提高集群的存储和处理能力。
# 创建索引时指定主分片数量
curl -X PUT "localhost:9200/my-index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3
}
}'
2.2 副本分片的扩容
副本分片是主分片的备份,用于提供数据冗余和故障转移。通过扩容副本分片,我们可以增加集群的可用性和可靠性。
# 创建索引时指定副本分片数量
curl -X PUT "localhost:9200/my-index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_replicas": 2
}
}'
三、故障转移
故障转移是Elasticsearch集群在面对节点故障时的关键特性。它确保了即使在节点失效的情况下,集群也能继续正常运行。
# 重启节点,使其加入已存在的集群
bin/elasticsearch -Des.cluster.name=my-cluster -Des.node.name=new-node
四、分布式索引和搜索
Elasticsearch集群的一个核心特性是分布式索引和搜索。通过分布式索引,我们可以将数据均匀地分布到集群中的所有节点上。而分布式搜索则允许我们跨多个节点执行搜索操作,从而获得更高的查询性能。
# 创建文档并索引
curl -X POST "localhost:9200/my-index/_doc" -H 'Content-Type: application/json' -d'
{
"field1": "value1",
"field2": "value2"
}'
# 执行搜索操作
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}'
以上就是这篇文章的全部内容,希望这篇文章能帮助您对Elasticsearch集群的工作原理有一个全面的认识。