分布式特性es支持集中式模式,是分布式系统,有两个优点:增加系统容量,磁盘内存使es集群支持PB级业务,提高系统可用性,即使有些节点停止服务后整个集群可以正常使用。es集群由多个es实例组成。不同的簇由簇名组成。每个es实例本质上都是一个jvm进程,其名称由node.name定义。集群启动一个节点bin/elasticsearch-Ecluster.name=my_cluster-Enode.name=node1clusterstates集群的相关数据称为集群状态,主要记录如下信息:节点信息,节点名称,连接地址,索引信息,索引名称配置等。主节点可以修改集群状态的节点称为主节点。一个集群只能在每个节点上存储一个集群状态。master维护最新版本并同步到其他节点。主节点由集群中的所有节点选举产生。可以选举的节点称为Shardingformastereligiblenodenode.master=true如何将数据分到所有节点,引入sharding解决问题在创建索引时指定,后续不允许更改。默认情况下,有五个分片,主分片和副本分片之间存在差异,以实现数据高可用性。吞吐量持续增加节点是否增加了索引的数据容量?不行,只有三个分片,新增节点上的资源不能利用。继续增加副本数能否提高索引的数据吞吐量?不是,新增的副本还是分布在已有的节点上,资源并没有增加。健康状态可以通过apiGET_cluster/health查看集群的健康状态,包括三种:绿色健康表示所有主从分片都正常,黄色表示所有主分片都正常,但部分副本分片不正常normallyassignedredallshardsarenotassignedfailovernode1所在的concentrator宕机,集群将如何处理?node2发现主分片p0没有分配,将R0提升为主分片。此时,由于所有主分片都正常,所以集群状态为黄色。Node2为p0和p1生成新的副本,集群状态为green。分布式存储使用映射算法将文档平均划分分布在所有shards上,充分利用资源es使用shard=hash(routing)%number_of_primary_shardshard算法可以保证数据在shards中均匀分布routing默认为documentid文档创建过程client向node3发起文档创建请求node3通过Routing计算出文档应该存放在shard1上。查询集群状态后,确认主分片在node2中的p1,将创建请求转发给node2上的p1接收并创建文档,同时向副本分片r1r1发送相同的请求接收并执行创建文档后request,通知p1创建成功。p1收到复制分片结果后,通知node3创建成功。node3将结果返回给客户端文档读取进程。client向node3发起读取文档1的请求。查询集群状态后,获取shard1的主从分片列表,然后轮询获取分片,比如R1,将请求转发给node1R1接收并执行读文档,返回结果给node3node3返回结果给客户。body、node2、node3重新组成集群选举master,更新集群状态node1在组成集群后也会更新集群状态。同一个大集群有两个master,有两个集群状态。网络恢复后,无法确定哪个是正确的主控。解决集群状态并增加选举条件,因为主资格节点的数量大于或等于Quorum。只有quorum=master-eligiblenodes/2+1时才能进行master选举。Discovery.zen.minimum_master_nodes是避免裂脑碎片的法定人数。倒排索引不能改变。倒排索引一旦生成,就无法更改。无需考虑文件并发写入的问题,避免锁机制带来的性能问题。可以充分利用缓存,加载一次。多次读取有利于压缩存储文件,节省磁盘和内存存储空间。写入新文档时,必须重建倒排索引文件,然后替换旧文件,才能检索到新文档。文档搜索实时性差。Lucene构建了一个单独的倒排索引,称为segment,一起称为index,与es中的index不同,es中的一个shard对应一个lucene的indexLucene会有一个专门的文件记录所有的segment信息,叫做commitpoint。实时文档搜索-refreshsegment写入缓存打开查询。此过程称为刷新。在刷新之前,文档将被存储在一个缓冲区中。刷新时,缓冲区中的所有文档将被清除并生成段。默认情况下,刷新将每秒执行一次,所以文档的实时性提高到1秒,这也是es被称为近实时的原因。如果缓存中的段还没有写入磁盘,translog就崩溃了怎么办?es引入了translog机制。写入buffer时,操作同时写入translog。translog文件会实时写入磁盘fsync。在6.X中,默认情况下每个请求都会写入磁盘。每五秒可以修改一次。风险是五秒内的数据将丢失。祥光配置为index.translog.*es,启动文件会检查translog,并从中恢复数据。flushflush负责将内存中的segment写入磁盘,将translog写入磁盘,并清空indexbuffer。其中的文档生成一个新的段。相当于刷新操作,更新提交点,写入磁盘。这些段被写入磁盘以删除旧的translog。删除和更新文件Lucene专门维护了一个.del文件来记录所有被删除的文件。当.del记录的文档id被记录时,Lucene内部的文档id会在分支查询结果前被过滤掉.del中的文档更新文档相当于先删除,新建一个文档段合并容易增加段一次查询速度变慢essegmentmerge在后台定期通过force_mergeapi减少segment数量可以手动merge操作
