做网站的职位叫什么问题,工作箴言,视频网站高管有做传统媒体出身的吗?优酷副总裁转型成功的概率有多少?,win2012r2 建设网站目录
Elasticsearch逻辑设计和物理设计 逻辑设计物理设计Elasticsearch原理 倒排索引文档的分析过程保存文档搜索文档写数据的底层原理 数据刷新#xff08;fresh#xff09;事务日志的写入ES在大数据量下的性能优化 文件系统缓存优化数据预热文档#xff08;Document…目录
Elasticsearch逻辑设计和物理设计 逻辑设计物理设计Elasticsearch原理 倒排索引文档的分析过程保存文档搜索文档写数据的底层原理 数据刷新fresh事务日志的写入ES在大数据量下的性能优化 文件系统缓存优化数据预热文档Document模型设计分页性能优化Elasticsearch和DB的差异参考 Elasticsearch逻辑设计和物理设计
逻辑设计
索引Index类似于ES中的一张表可以通过映射Mapping定义索引的结构和设置。类型Type可以对ES的索引进一步做划分。ES 7中已经移除类型建议一个索引一个类型即可映射Mapping索引结构的定义包括索引的字段字段类型索引的设置等。文档Document索引中的一条记录。
物理设计
Elasticsearch本身是分布式搜索引擎。它的高可用、高性能就是通过分片实现的。
主分片一个索引可以划分成多个主分片通过将主分片分布到不同的ES节点从而实现高性能。副本分片副本分片和主分片保持数据同步和主分片不能分布在同一个节点从而实现主分片的读能力的横向扩展同时保证主分片不可用时实现故障转移。
Elasticsearch原理
倒排索引
每个文档都有唯一的文档ID一个文档经过分析器变成一组词条。
倒排索引记录词条以及词条出现的文档ID的数据结构同时倒排索引还会记录词条在文档中出现的频率。 文档的分析过程 示例引用自《Elasticsearch实战》。 在文档加入倒排索引之前需要经过分析器执行分析转换成一组词条Term。
以下是文档“share your experience with Nosql big data technologies”的分析过程。 过滤字符字符过滤器转换个别字符。如将转换成and切分文本分词器将文本切分成多个词条过滤分词一组分词过滤器按序转换每个分词。如小写分词过滤器将所有的分词转换成小写。创建索引为词条创建倒排索引
保存文档 保存文档是写入主分片然后同步到副本分片搜索文档是根据轮询算法从主分片或副本分片读取。 通过计算文档ID的哈希值决定文档的目标分片。如果文档的目标分片不在当前节点将文档转发到目标分片的节点。将文档加入倒排索引将数据同步到所有的副本分片即在副本分片创建倒排索引所有的副本分片创建倒排索引成功节点响应结果给客户端
说明
协调节点接收客户端请求/响应客户端的节点负责数据的请求转发数据的汇总。 搜索文档 协调节点使用round-robin随机循环算法将请求转发到包含完整数据集合的分片集合包括主分片和副本分片。 协调节点收集各节点的返回结果将结果返回客户端 2.1 查询阶段Query Phase每个分片将自己的搜索结果的文档ID返回给协调节点协调节点进行数据的合并、排序、分页得到最终结果。 2.2 拉取阶段Fetch Phase协调节点根据文档ID取各个节点上拉取文档数据最终返回给客户端。
写数据的底层原理 Elasticsearch会将数据先写入内存的缓冲区这时数据并不能用于查询。
刷新数据缓冲区过大或者默认每隔1秒将缓冲区中的数据写入段文件segment file然后清空缓冲区。数据在缓冲区时是不可见的变成段文件后就可以用于查询。段文件不可变所以每隔一秒ES就会生成一个新的段文件。事务日志的写入为了防止数据丢失ES会实时将数据写入事务日志tranlog文件事务日志文件是在磁盘里的。数据冲刷事务日志过大或者默认每隔30分钟会触发数据冲刷会将一个提交点commit point中的所有段文件在操作系统缓冲区中的数据和缓冲区所有的数据写入磁盘然后删除事务日志。
数据刷新fresh
数据刷新负责将缓冲区的数据写入段文件。段文件实际上就Lucene索引。出于性能考虑数据并不是直接写入磁盘的而是默认每隔1秒数据从缓冲区写入系统缓存OS Cache变成段文件。之后就可以通过搜索接口查询到对应的数据了。因为数据都是在内存中的所以一旦宕机数据会丢失。ES通过事务日志保存了数据所以能够保证数据的恢复。
ES是接近实时的Near Real-time
因为数据是每1秒刷新的系统缓存之后才可以访问所以是接近实时的。
事务日志的写入
为了防止数据丢失数据在写入缓冲区的同时写入事务日志文件。事务日志同样是先写入系统缓存OS Cache然后刷新到磁盘。
index.translog.durability参数- 刷盘策略
index.translog.durability取值
request每次请求都执行fsync刷盘ES要等待日志文件刷盘后才返回成功响应。能够保证数据基本不丢失但是性能低下不推荐使用。async每隔5秒fsync一次translog数据到磁盘默认值。兼顾数据的持久化和性能。
数据丢失
因为事务日志的默认刷盘方式是每隔5秒fsync一次所以如果ES宕机最多可能丢失5秒的数据。
ES在大数据量下的性能优化
文件系统缓存优化
ES中的索引数据会持久化到磁盘中查询的时候索引数据从磁盘加载到系统缓存中。 这里的filesystem cache就是上文的OS cache都是指系统缓存。 ES搜索性能非常依赖于系统缓存因为系统缓存是在内存中的。如果查询走系统缓存可以达到几毫秒到几百毫秒不等的查询效率但是查询走磁盘的话搜索性能就要达到秒级。
最佳的情况下机器的内存要达到容纳总数据量的一半。
ES HBase
为了减少ES的数据量可以仅在ES索引中保存用于检索的几个字段将完整的记录保存在HBase中。查询时先通过ES获取doc id然后根据doc id到HBase获取完整的数据。
数据预热
开启定时任务定时加载一些频繁被访问的热点数据。如电商系统中如iphone后台开个任务每隔1分钟访问一次相关数据刷新到系统缓存中。
文档Document模型设计
ES尽量不要使用复杂的操作如join关联/nested/parent-child对性能影响很大。
可以在Java应用里完成关联将关联好的数据写入ES中。
分页性能优化
如果要取第100页的10条数据那么ES的分页流程如下
将每个分片上的前1000条数据都查到协调节点上如果有5个分片那就是5000条数据。接着协调节点对这5000条数据做合并、排序返回第100页的10条数据。
所以ES的分页越深查询越慢。
有两种优化方案
不允许深度分页系统直接不允许深度的分页。通过scroll API类似于游标或者Java中的迭代器访问效率可以达到毫秒级。不过只能一页页的访问不能随机跳到任意一页访问。
Elasticsearch和DB的差异
Elasticsearch不支持事务表连接。ES是个自带分布式属性的高可用、可扩展、高性能传统关系型数据库存在单机的性能瓶颈ES单个字段的数据类型丰富除了核心的数据类型还支持多字段对象类型、数组类型等。
参考 部分图片引用自advanced-Java 《Elasticsearch实战》Elasticsearch如何做到亿级数据查询毫秒级返回的Elasticsearch如何做到亿级数据查询毫秒级返回的 - 掘金互联网 Java 工程师进阶知识完全扫盲 - Doocs 技术社区互联网 Java 工程师进阶知识完全扫盲 - Doocs 技术社区