1、Lucene和ElasticSearch
- Lucene:功能强大到令人头大,非常复杂,学习成本高。API复杂,实现简单的功能需要写大量的java代码,甚至需要深入理解其原理
- ElasticSearch:基于Lucene开发,隐藏其复杂性,从而提供简单易用的Restful API接口(还有其他的语言,如c++、python等)。开箱即用,完全开源
2、ElasticSearch的核心概念
- Near Realtime(NRT):近实时。意思就是“快”。两层含义:从写入到被检索大概只需要 1 秒;基于es执行检索与分析可以达到秒级,甚至是毫秒
- Cluster :集群。包含多个节点,集群名称默认是“elasticsearch”
- Node :节点。集群中的一个节点,节点的名称默认随机分配,默认节点回去加入一个名称为“elasticSearch”的集群
- Document :文档。最小的数据单元,一个document可以是一条客户数据,一条订单数据。通常是json数据表示。一个document里面有多个field,每个field就是一个数据字段
{
"product_id":"1",
"product_name":"王老吉",
"product_desc":"好喝不上火",
"category":"2",
"category":"饮料"
}
- Index :索引。包含一堆有相似结构的文档数据,如一个商品索引,一个订单索引,一个index包含很多document,一个index就代表了一类类似的或者相同的document。
- type:类型。每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field
与MySQL数据类比
Document ---------- 行
Type ----------------- 表
Index ---------------- 数据库
- shard:【primary shard 简称shard 。建立索引时一次设置,不能修改,默认5个】单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储
- replica:【replica shard 简称 replica 。 随时可以修改,默认1个】replica可以在shard故障时提供备用服务,保证数据不丢失
默认每个索引10个shard,因为有5个primary shard,1个primary shard有1个默认的replica shard,即有5个replica shard 。最小的高可用配置,是2台服务器
增加理解:
(1)index包含多个shard
(2)每个shard都是一个最小工作单元,承载部分数据,每个shard都是一个lucene实例,完整的建立索引和处理请求的能力
(3)增减节点时,shard会自动在nodes中负载均衡
(4)primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard
(5)replica shard是primary shard的副本,负责容错,以及承担读请求负载
(6)primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改
(7)primary shard的默认数量是5,replica默认是1(1个primary shard 配 1个replica),默认有10个shard,5个primary shard,5个replica shard
(8)primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和replica副本都丢失,起不到容错的作用),但是可以和其他primary shard的replica shard放在同一个节点上
图解单node环境下创建index是什么样子的?
(1)单node环境下,创建一个index,有3个primary shard,3个replica shard
PUT /test_index
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
(2)集群status是yellow
(3)这个时候,只会将3个primary shard分配到仅有的一个node上去,另外3个replica shard是无法分配的
(4)集群可以正常工作,但是一旦出现节点宕机,数据全部丢失,而且集群不可用,无法承接任何请求