什么是ElasticSearch
ElasticSearch 设计的理念就是分布式搜索引擎,底层其实还是基于 lucene 的。核心思想就是在多台机器上启动多个 es 进程实例,组成了一个 es 集群。
ElasticSearch构成
索引index
ElasticSearch 中存储数据的基本单位是索引index,要在 ElasticSearch 中存储一些数据,你就应该在 ElasticSearch 中创建一个索引,所有的数据就都写到这个索引里面去,一个索引差不多就是相当于是 mysql 里的一张表。
type
一个 索引 里可以有多个 type,每个 type 的字段都是差不多的,但是有一些略微的差别。
打个比方有一个订单的index,其中有些订单是实物商品的订单,有些订单是虚拟商品的订单。就两种订单大部分字段是一样的,但是少部分字段可能有略微的一些差别。会在订单 index 里,建两个 type,一个是实物商品订单 type,一个是虚拟商品订单 type。
你可以认为 index 是一个类别的表,具体的每个 type 代表了 mysql 中的一个表。每个 type 有一个 mapping,如果你认为一个 type 是具体的一个表,index 就代表多个 type 同属于的一个类型,而 mapping 就是这个 type 的表结构定义。
document
往 index 里的一个 type 里面写的一条数据,叫做一条 document,一条 document 就代表了 mysql 中某个表里的一行,每个 document 有多个 field,每个 field 就代表了这个 document 中的一个字段的值。
ElasticSearch高可用
索引可以拆分成多个 shard
,每个 shard 存储部分数据。
拆分多个 shard 可以支持横向扩展,比如你数据量是 3T,3 个 shard,若现在数据量增加到 4T,重新建一个有 4 个 shard 的索引,将数据导进去就可以了。
同时可以提高性能,数据分布在多个 shard,即多台服务器上,所有的操作,都会在多台机器上并行分布式执行,提高了吞吐量和性能。
shard 的数据实际是有多个备份,就是说每个 shard 都有一个 primary shard
,负责写入数据,但是还有几个 replica shard
。primary shard
写入数据之后,会将数据同步到其他几个 replica shard
上去。每个 shard 的数据都有多个备份保证高可用,如果某个机器宕机了,还有别的数据副本在别的机器上呢。
es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。要是 master 节点宕机了,那么会重新选举一个节点为 master 节点。
如果是非 master节点宕机了,那么会由 master 节点,让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。接着你要是修复了那个宕机机器,重启了之后,master 节点会控制将缺失的 replica shard 分配过去,同步后续修改的数据之类的,让集群恢复正常。