ElasticSearch中Cluster,Node,Shard,Indices,replicas的基本概念与关系

本文详细解析Elasticsearch的集群、节点、索引、分片及副本概念,阐述其分布式搜索与存储机制,以及主分片与副本分片如何保障数据安全与提升查询效率。

【Cluster】
集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识
------------------------------------------------
【node】
节点,一个ES实例就是一个node,一个机器可以有多个实例,所以并不能说一台机器就是一个node,大多数情况下每个node运行在一个独立的环境或虚拟机上。
------------------------------------------------
【index】
索引,即一系列documents的集合
------------------------------------------------
【shard】

1.分片,ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装

2.分片有助于横向扩展,N个分片会被尽可能平均地(rebalance)分配在不同的节点上(例如你有2个节点,4个主分片(不考虑备份),那么每个节点会分到2个分片,后来你增加了2个节点,那么你这4个节点上都会有1个分片,这个过程叫relocation,ES感知后自动完成)

3.分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request.另外

4.每个分片都是一个Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 个docs。

------------------------------------------------
【replica】

1.复制,可以理解为备份分片,相应地有primary shard(主分片)

2.主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(即5primary+5replica=10个分片)

3.如果你只有一个节点,那么5个replica都无法分配(unassigned),此时cluster status会变成Yellow。replica的作用主要包括:

ES集群的三种状态:

1)Green: 所有主分片和备份分片都准备就绪,分配成功, 即使有一台机器挂了(假设一台机器实例),数据都不会丢失,但是会变成yellow状态.

2)Yellow: 所有主分片准备就绪,但至少一个主分片(假设是A)对应的备份分片没有就绪,此时集群处于告警状态,意味着高可用和容灾能力下降.如果刚好A所在的机器挂了,并且你只设置了一个备份(已处于未继续状态), 那么A的数据就会丢失(查询不完整),此时集群处于Red状态.

3)Red:至少有一个主分片没有就绪(直接原因是找不到对应的备份分片成为新的主分片),此时查询的结果会出现数据丢失(不完整).

1.容灾:primary分片丢失,replica分片就会被顶上去成为新的主分片,同时根据这个新的主分片创建新的replica,集群数据安然无恙


2.提高查询性能:replica和primary分片的数据是相同的,所以对于一个query既可以查主分片也可以查备分片,在合适的范围内多个replica性能会更优(但要考虑资源占用也会提升[cpu/disk/heap]),另外index request只能发生在主分片上,replica不能执行index request。

3.对于一个索引,除非重建索引否则不能调整分片的数目(主分片数, number_of_shards),但可以随时调整replica数(number_of_replicas)。


### Elasticsearch基本概念 #### 节点实例 节点是指一个 Elasticsearch 实例,其本质上是一个 Java 进程。每台机器可以运行多个 Elasticsearch 实例,但在生产环境中通常建议每台机器仅运行一个实例以优化性能和资源管理[^1]。 #### 集群组成 Elasticsearch 是一种分布式搜索引擎,由多个节点共同组成一个集群。一个集群至少包含一个节点,而每个节点都可以拥有多个索引[^4]。 #### 数据存储单元:索引、分片副本 - **索引**:类似于传统数据库中的表,用于存储文档集合。 - **分片 (Shard)**:为了提高可扩展性和性能,索引被划分为若干个主分片(Primary Shard),这些分片分布在不同的节点上,默认情况下每个索引会被分成 5 个主分片。 - **副本 (Replica)**:每个主分片都有对应的副本分片(Replica Shard),用于提供冗余备份以及增强读取操作的能力。默认情况下,每个主分片都会有一个副本。 #### 数据定位机制 当向 Elasticsearch 插入一条数据时,系统会基于指定的关键字(Key)计算该条记录应归属于哪一个分片。此关键字通常是自动生成的 ID 或者可以根据具体需求设置成其他字段值,例如在某些业务场景下可能选用 `CompanyID` 作为 Key 来实现更精确的数据分布控制[^5]。通过下面这个公式完成分片的选择过程: ```plaintext shard_num = hash(_routing) % num_primary_shards ``` #### 功能特性 Elasticsearch 将全文搜索、结构化查询及数据分析等功能融合为一体,并能高效处理海量级数据集,在接近实时的时间范围内支持复杂的搜索请求和统计分析任务[^2]。它非常适合应用于大规模的日志监控、网站内容检索以及其他需要快速响应的大规模数据访问场合;而对于那些强调严格一致性且涉及较多关联运算的应用,则更适合采用 MySQL 等关系型数据库解决方案[^3]。 ### 示例代码展示如何创建简单的索引 以下是利用 Python 对接 Elasticsearch 并创建新索引的一个例子: ```python from elasticsearch import Elasticsearch es_client = Elasticsearch(["http://localhost:9200"]) index_name = "test_index" if not es_client.indices.exists(index=index_name): settings = { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "title": {"type": "text"}, "content": {"type": "text"} } } } response = es_client.indices.create(index=index_name, body=settings) print(f"Index created successfully {response}") else: print("Index already exists.") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值