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
上:
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:
# 创建一个包含两个主分片和一个副本分片的索引
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