1.es的分布式架构原理能说明一下么(es是如何实现分布式的)?
es设计的理念就是分布式搜索引擎,底层其实还是基于lucene的。
其核心思想就是在多台机器上启动多个es进程实例,组成一个es集群。接着你搞一个索引,这个索引可以拆分成多个shard,每个shard存储部分数据。
2.es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?
2.1 读写数据的工作流程:
2.2 写数据的底层原理:
四个核心操作:
操作触发条件 | 操作过程 | |
---|---|---|
refresh | 1. 每隔1s进行一次refresh操作 2. buffer已满,则进行一次refresh操作 | 1. buffer将数据写入segment file 2. 清空buffer |
commit | 1. 每隔30分钟执行一次translog 2. translog日志已满 | 1. 会主动进行一次refresh操作,把buffer中的数据写入到segment file 2. 生成一个 commit point 文件标识此次操作一件把buffer数据执行到了哪一个segment文件 3. 执行flush操作 |
flush | commit操作中 | 1. 把file system上的文件全部强制fsync(持久化)到磁盘 2. 清空translog文件 3. 生成一个新的translog文件 |
merge | 后台检查 | 1. 将多个segment文件合并为一个文件,并把.del文件删除 2. commit log 更新标识目前的segment 3. 打开segmentfile 到file cache 以供快速搜索 4. 删除旧的segment file |
3.分布式搜索引擎在几十亿数据量级的场景下如何优化查询性能?
3.1 性能优化杀手锏--filesystem
- es每次走fileSystem cache查询速度是最快的,所以最佳情况,机器内存至少可以容纳你总数据量的一半。
- 采用elasticSearch + Hbase/mysql的架构方式。es中只存放少量关键数据建立索引,通过es查询到doc id 再去Hbase/mysql中查询完整的数据信息。
3.2 数据预热
数据预热是指,每隔一段时间,将热数据手动在后台查询一遍,将热数据刷新到fileSystem cache上
3.3 冷热分离
你最好是将冷数据写入一个索引中,然后热数据写入另一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在filesystem os cache里面,别让冷数据给冲刷掉。
3.4. document设计
在使用es时 避免使用复杂的查询语句(Join 、聚合),就是在建立索引时,就根据查询语句建立好对应的元数据。
3.5 分页性能优化
4.es生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
申明:内容来自网络,仅供学习使用
参考:https://www.bilibili.com/video/BV1FE411y79Y