# elasticsearchZZ **Repository Path**: interview_44/elasticsearch-zz ## Basic Information - **Project Name**: elasticsearchZZ - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-26 - **Last Updated**: 2023-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## elasticsearchZZ #### 介绍 elasticsearch总结 -[1、ES分布式架构原理](#1ES分布式架构原理) -[2、内部工作流程](#2内部工作流程) -[3、ES性能优化](#3ES性能优化) #### 1、ES分布式架构原理 ES存储数据的单位是索引 例如:订单索引order_index(例如表) 索引-indices:database,5主5从,写主分片,读主从分片。 分片数量不能改,副本数量可以改。 每个索引默认都有5个分片, type:table mapping:表结构,字段定义 document:数据一行 filed:字段的值 ![](./picture/1、工作原理.png) 写数据,由es客户端写入primary,读的话可以读入replica与primary。 ![](./picture/6-数据录入.drawio.png) ### 2、内部工作流程 ES,写的工作流程 ![](./picture/2、ex写操作.png) 准实时的。 1、客户端写数据过来,首先去到协调节点,协调节点会查询primaty-shard路由到该primaty。 2、数据先到buff缓存里面,再写到os cache,主内存,数据写到os cache主存内,才能索引出来,1秒钟后主内存的数据会写入segment file,磁盘。 3、写入translog文件会不断变大,大到一定阈值就执行commit,每隔30分钟flush操作。 commit操作,写commitpoint -> 将os cache数据fsync强行刷到硬盘上 -> 清空translog文件。也是es的flush操作,flush操作手动触发。 4、会从主primaty同步到replica。 5、如果是删除操作,会写入.del文件。在merge磁盘文件segment file的时候删除.del文件的数据。客户端一旦在.del文件中发现改数据,就不会被索引到。 ### 3、ES性能优化 ![](./picture/3、查询执行步骤.png) 1、拆字段,不要所有字段都保存到ES。 2、预热数据,每个一段时间查询一次热数据,刷新数据到fileSyetem Cache,如上图,如果fileSystem cache无数据,就要到segment file查找。 3、冷热分离,冷数据放到mysql数据库里面,热数据放入index里面。 4、document设计,表关联在document设计用好,把关联字段放到document里。 5、分页性能很差,不支持深度分页,或者用scroll—api ### 4、ES部署架构 ![](./picture/4-部署.drawio.png) 3台服务器,每台8核32G,总数据量在50G。 目前有4个索引。3个shard。 master.node:元数据管理,配置是否能成为主节点。 data.node:配置是否成为数据节点。 ![](./picture/5-data.node结构.drawio.png) coordinating.node:搜索结果合并。当mater.node:false和data.node为false,那么久强迫成为专用协调节点。 ingest.node:数据存储策略及转换策略节点。 ### 5、脑裂如何解决 选取最大ofset作为leader,其余放弃。 ### 6、如何防止数据丢失 在es主分片写入是,引入两种缓存。堆缓存,堆外缓存。 增加日志,translog 5秒钟同步一次数据到segment 主从切换时如何防止数据不丢失,写刷从节点时至少有1个从节点返回成功,主节点才确认更新。 ### 7、data.node 内存溢出的快速方案 ![](./picture/7-OS缓存结构.drawio.png) jvm的最大内存与最少内存要保持一致,32G为最大。 OS优化方案 禁止服务器交换内存:sudo swapoff -a(比较激进) 或者vm.swapingness=10 如果OOM,直接重启,配置自动重启,因为分布式集群,有副本。 1、-XX:+ExitOnOutOfMemoryError 快速失败。 2、服务器快速启动。 ### 8、故障转移机制 挂掉 -> 重启 的过程