Elasticsearch 基本概念- Shard

2023-05-08 11:03:37 浏览数 (1)

Shard 的基本概念

Shard 是 Elasticsearch 中存储数据的最小单位。每个索引都被分成多个 Shard,每个 Shard 都是一个 Lucene 索引,用于存储和索引数据。当我们往索引中添加数据时,Elasticsearch 会自动将数据分配到不同的 Shard 上。

Shard 可以分为两种类型:Primary Shard 和 Replica Shard。Primary Shard 是数据的主要分片,负责处理所有的索引请求,每个索引至少有一个 Primary Shard。而 Replica Shard 是 Primary Shard 的备份,用于提供高可用性和容错性。在一个 Elasticsearch 集群中,多个节点可以存储同一个 Shard 的副本,当 Primary Shard 发生故障时,Elasticsearch 会自动将其中一个 Replica Shard 升级为 Primary Shard,以保证数据的可用性。

Shard 的操作

在 Elasticsearch 中,我们可以对 Shard 进行一些基本的操作,包括创建、删除、移动和合并。

创建 Shard

当我们创建一个新的索引时,Elasticsearch 会自动为该索引创建一定数量的 Primary Shard,并将这些 Primary Shard 分配到不同的节点上。我们可以在创建索引时指定 Primary Shard 的数量,例如:

代码语言:javascript复制
PUT /my_index
{
  "settings": {
    "number_of_shards": 5
  }
}

这个请求将创建一个名为 my_index 的索引,并将其分成 5 个 Primary Shard。

删除 Shard

我们可以通过删除索引的方式删除 Shard,例如:

代码语言:javascript复制
DELETE /my_index

这个请求将删除名为 my_index 的索引及其所有的 Shard。

移动 Shard

当我们需要将一个 Shard 从一个节点移动到另一个节点时,可以使用 shard allocation API。例如,我们可以将 Shard 0 移动到节点 node2 上:

代码语言:javascript复制
POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "my_index",
        "shard": 0,
        "from_node": "node1",
        "to_node": "node2"
      }
    }
  ]
}

合并 Shard

当我们需要减少 Shard 的数量或合并小的 Shard 以优化查询性能时,可以使用 shard allocation API 手动执行 Shard 合并操作。例如,我们可以将名为 my_index 的索引中的所有 Primary Shard 合并成一个 Shard:

代码语言:javascript复制
# 创建一个包含两个主分片和一个副本分片的索引
PUT /my_index
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  }
}

# 获取索引的分片信息
GET /my_index/_shard_stores

# 获取特定分片的信息
GET /my_index/_shard_stores?status=green&pretty&index.uuid={shard_uuid}&index={index_name}&shard={shard_number}

# 查看特定分片中的文档
GET /my_index/_search?preference={shard_prefernece}

# 查看特定文档所在的分片
GET /my_index/_search_shards?routing={document_id}

# 修改副本分片数量
PUT /my_index/_settings
{
  "index" : {
    "number_of_replicas" : 2
  }
}

# 查看分片状态
GET /_cluster/health?level=shards

0 人点赞