整体介绍
ElasticSearch,官网上对它的定义为:
Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases.
说它是一个分布式的,具有Restful编程风格的,可解决不断出现的用例的一个分析搜索引擎。搜索这点大家认识都很深刻,它的分析能力,其实也很强。目前我们这边做过命中量为1.2亿的聚合(简单的聚合统计)运算,时间只需要5s左右。很给力!
它具有以下四个特征:
- 速度特别快 200亿的数据量,一个查询命中量有210w,只取1w,仅需93ms。
- 可扩展性很好 理论上任何机器都可以,大到高性能服务器,小到普通台式电脑。还是建议统一的配置较好,如果集群中既有ssd,又有普通硬盘,普通硬盘的查询和导入会拉慢整体的性能。
- 弹性很好 如果你的索引都是多备份,即使挂了台节点,系统依然可以正常运行。
- 灵活性很好 支持结构化和非结构化的数据。All data types are welcome.
概念介绍
1、准实时(Near Realtime)
默认情况下,插入的数据1s后可查询,所示称其为准实时系统。
2、集群(Cluster)
由一个或多个节点组成,能保存数据,且所有节点提供索引和搜索功能。
3、节点(Node)
集群的单个server,可存储数据,并提供集群的索引和搜索功能。
- Master 节点:管理集群,向其他节点同步集群状态。
- Data 节点:存储数据的节点。
- Client节点:为外部提供检索的节点。
ES集群架构
4、索引(Index)
所有具有相似特征的文档集合。类似于数据库的database。
5、类型(Type)
Type主要用来逻辑上分割索引。类似于数据库中的table。数据库中的table是物理分割的,但ES的type是逻辑分割的,不同type的相同field还是会放在一起。因此,ES6.0中已取消多type。
6、文档(Document)
可被索引的最小单位。类似于数据库中的一条记录。
7、分片(shard)
索引的大小可能超出单个节点的限制,将索引分为多块存储,每块即为一个分片。
8、副本( replicas )
分片的备份数。默认情况下每个索引有一个备份。
9、集群状态
- Red:某些分片的主副分片都丢失,影响数据完整性。
- Yellow:某些副本分片丢失,不影响数据的完整性。
- Green:健康状态,没有分片丢失。
ES集群状态改变
模块介绍
网上找的相关内容感觉都不全,我按照源码的结构整理了一下,大致分为以下几个模块:
1、ScriptModule
加载用户自定义的脚本插件,提供脚本服务(ScriptService)。
脚本服务包括:
- 加载脚本的配置信息,比如说缓存大小,脚本大小等等
- 编译脚本
- 生成脚本模板
- 监听集群脚本变化信息。若有变化,跟随变化更改。
- 脚本转化。将一个普通脚本通过添加参数转化为一个可执行的脚本。
2、AnalysisModule
分词相关的模块。
- 加载词典
- 加载插件和常用的charFilters
- 加载插件和常用的tokenFilters
- 加载插件和常用的tokenizers
- 加载插件和常用的analyzers
3、SettingsModule
加载对应的系统配置。
- 加载Index Setting
- 加载Cluter Setting
- 加载Node Setting
4、ClusterModule
- 将请求中的正则表达式索引名字转化为集群中具体的索引名字
- 创建shard分配器(ShardsAllocator)分配shard
- 提供集群服务(clusterService)
集群服务(ClusterService)
- 监听集群状态改变,并添加listener ClusterChangedEvent, Discovery.AckListener
- 结合DiscoveryNodes和NodeConnectionsService做一系列的监听(集群状态同步监听、集群状态确认监听,节点离开加入等)
- 通过ClusterServiceTaskBatcher执行集群任务
- 通过OperationRouting找到对应shard
5、IndicesModule
配置每个节点上索引共享的类和服务。
- 加载插件和内嵌的所有mapper类型,比如说Text,Keyword,Number等等
- 加载插件和内嵌的所有metamapper类型,比如说Version,TTL,Source等等
6、SearchModule
加载插件和内嵌的查询组件,包括(打分、聚合、排序等等)
7、ActionModule
- 注册RestHandler,也就是将Rest*Action接收的查询格式传入RestController中
- 绑定RestAction和TransportAction的对应关系
8、GatewayModule
Gateway模块用于存储es集群的元数据信息。这部分信息主要包括所有的索引连同索引设置和显式的Mapping信息。集群元数据的每一次改变(比如增加删除索引等),这些信息都要通过Gateway模块进行持久化。当集群第一次启动的时候,这些信息就会从Gateway模块中读出并应用。
- Recovery After Nodes/Time
- Local Gateway从每个节点的本地存储中恢复集群状态和索引,不需要节点之间的共享存储
9、NetworkModule
注册和绑定所有网络相关的类。
- 初始化常用的http、transport配置信息。
- 注册内嵌的所有AllocationCommand。
- 提供Transport和HttpTransport的注册方法。
10、RepositoriesModule
Repositories模块主要是做索引的快照和恢复。Snapshot/Restore
11、DiscoveryModule
Discovery模块主要用来做节点发现。
后续
后面的ES文章主要会在ClusterModule和SearchModule上面下功夫,ScriptModule、AnalysisModuleGatewayModule和RepositoriesModule模块也会聊一聊,其他的模块会在介绍前面的模块时顺带点一下,不会花大片的篇幅讲解。