Elasticsearch基本概念扫盲

本文介绍了Elasticsearch的基本概念,包括集群、节点、索引、分片、副本等,并详细解释了它们的作用及相互之间的关系。此外还介绍了Elasticsearch的特性,如分布式索引、自动分片和负载均衡等。

 

2016-07-28 架构师联盟
前面几篇文章对Elasticsearch做了简单介绍(http://www.qixing318.com/article/distributed-search-engine-elasticsearch-incarnations.html)与介绍如何创建索引,以及ElasticSearch国内外优秀案例(http://www.qixing318.com/article/elasticsearch-what-are-excellent-examples-at-home-and-abroad.html)有哪些,既然开始用elasticsearch并把它使用到生产环境当中去,那么Elasticsearch的几个基本概念就得先搞明白,以减少以后开发上带来的问题。
 
一、Elasticsearch集群的概念(cluster)
在一个分布式系统里面,可以通过多个elasticsearch运行实例组成一个集群,这个集群里面有一个节点叫做主节点(master),elasticsearch是去中心化的,所以这里的主节点是动态选举出来的,不存在单点故障。
 
在同一个子网内,只需要在每个节点上设置相同的集群名,elasticsearch就会自动的把这些集群名相同的节点组成一个集群。节点和节点之间通讯以及节点之间的数据分配和平衡全部由elasticsearch自动管理。
 
在外部看来elasticsearch就是一个整体。
 
Elasticsearch 节点(node)
 
每一个运行实例称为一个节点,每一个运行实例既可以在同一机器上,也可以在不同的机器上。
 
所谓运行实例,就是一个服务器进程,在测试环境中可以在一台服务器上运行多个服务器进程,在生产环境中建议每台服务器运行一个服务器进程。
 
Elasticsearch索引(index)
 
Elasticsearch里的索引概念是名词而不是动词,在elasticsearch里它支持多个索引。
 
优点类似于关系数据库里面每一个服务器可以支持多个数据库是一个道理,在每一索引下面又可以支持多种类型,这又类似于关系数据库里面的一个数据库可以有多张表一样。
 
但是本质上和关系数据库还是有很大的区别,我们这里暂时可以这么理解。
 
Elasticsearch 分片(shards)
 
Elasticsearch 它会把一个索引分解为多个小的索引,每一个小的索引就叫做分片。
 
分片之后就可以把各个分片分配到不同的节点中去。
 
Elasticsearch副本(replicas)
 
Elasticsearch的每一个分片都可以有0到多个副本,而每一个副本也都是分片的完整拷贝,好处是可以用它来增加速度的同时也提高了系统的容错性。
 
一旦Elasticsearch的某个节点数据损坏或则服务不可用的时候,那么这个时就可以用其他节点来代替坏掉的节点,以达到高考用的目的。
 
Elasticsearch 的recovery概念
 
Elasticsearch 的recovery代表的是数据恢复或者叫做数据重新分布。
 
elasticsearch 当有节点加入或退出时时它会根据机器的负载对索引分片进行重新分配,当挂掉的节点再次重新启动的时候也会进行数据恢复。
 
Elasticsearch river
 
Elasticsearch river 代表的是一个数据源,这也是其它存储方式(比如:数据库)同步数据到 elasticsearch 的一个方法。
 
它是以插件方式存在的一个 elasticsearch 服务,通过读取 river 中的数据并把它索引到 elasticsearch 当中去,官方的 river 有 couchDB、RabbitMQ、Twitter、Wikipedia。
 
Elasticsearch 的 gateway 概念
 
gateway 代表 elasticsearch 索引的持久化存储方式,elasticsearch 默认是先把索引存放到内存中去,当内存满了的时候再持久化到硬盘里。
 
当这个 elasticsearch 集群关闭或者再次重新启动时就会从 gateway 中读取索引数据。
 
elasticsearch 支持多种类型的 gateway,有本地文件系统(默认),分布式文件系统,Hadoop 的 HDFS 和 amazon 的 s3 云存储服务。
 
Elasticsearch的discovery.zen概念
 
discovery.zen代表 elasticsearch 的自动节点发现机制,而且 elasticsearch还是一个基于 p2p 的系统。
 
首先它它会通过以广播的方式去寻找存在的节点,然后再通过多播协议来进行节点之间的通信,于此同时也支持点对点的交互操作。
 
Elasticsearch里Transport的概念
 
Transport代表 elasticsearch 内部的节点或者集群与客户端之间的交互方式。
 
默认的内部是使用 tcp 协议来进行交互的,同时它支持 http 协议(json格式)、thrift、servlet、memcached、zeroMQ等多种的传输协议(通过插件方式集成)。
 
Elasticsearch分布式搜索引擎架构图
 
说完Elasticsearch的几个基本概念后,给大伙上一张 Elasticsearch分布式搜索引擎的总体框架图:
 
 
ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性:
 
  1. 分布式索引、搜索。
  2. 索引自动分片、负载均衡。
  3. 自动发现机器、组建集群。
  4. 支持Restful 风格接口。
  5. 配置简单等。
 
Elasticsearch还有丰富的第三方插件
下图是ElasticSearch的第三方插件管理工具,通过它可以很清晰的看到它索引分布的情况:哪块分布在那里,占用空间多少都可以看到,并且可以管理索引。
 
 
当某台机器挂掉的时候,整个系统会对故障机里的索引重新分配到其它机器上,当故障机重新加入到集群时,它又会重新把索引分配给它。
 
当然,这些规则都是可以自行根据参数进行设置的,非常灵活。
 
ElasticSearch是先把索引的内容保存到内存之中,当内存不够时再把索引持久化到硬盘中,同时它还有一个队列,是在系统空闲时自动把索引写到硬盘中。
 
Elasticsearch 后端存储方式可以有一下四种:
 
  1. 像普通的 Lucene 索引,存储在本地文件系统中。
  2. 存储在分布式文件系统中,如 freeds。
  3. 存储在 Hadoop 的 hdfs中。
  4. 存储在亚马逊的 S3 云平台中。
 
它支持插件机制,有丰富的插件:比如和 mongoDB、couchDB 同步的river 插件,分词插件,Hadoop 插件,脚本支持插件等。
posted on 2018-08-11 20:53 micwin 阅读( ...) 评论( ...)   编辑 收藏

转载于:https://www.cnblogs.com/chinanetwind/articles/9461058.html

### 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.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值