搜索引擎面试题
题目和解答来自于中华石杉和本身整理总结而得,但愿可以有所帮助。 搜索引擎主要考察ElasticSearch 以及对应底层的Lucene技术。 主要面试题集中于:node
- es分布式架构原理
- es的插入与查询
- es在数据量很大的状况下如何提升性能
- es在生产集群的部署架构是什么,每一个索引有多大的数据量,每一个索引有多少分片
1. es分布式架构原理
首先须要明白es是如何存储数据的,es把对应的数据转换为index。基于倒排索引的方式,每一个index上存储了多个type类型,每一个type对应一个document。而一个index会被分红多个shard(默认是5个)。 在分布式部署时,每一个shard会被复制,即一个shard有primary和replica 每一个es进程存储的是不一样shard的primary和replica。es集群多个节点,会自动选举一个节点为master节点,这个master节点其实就是干一些管理的工做的,好比维护索引元数据拉,负责切换primary shard和replica shard身份拉,之类的。 面试
2. es的数据写入与读取
2.1 es数据的写入
2.1.1 es数据的写入过程
注意,客户端是能够在任意节点进行写入数据的,与Kakfa不一样。 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点) 2)coordinating node,对document进行路由获得对应应该存储到哪一个shard,将请求转发给对应的node(有primary shard) 3)实际的node上的primary shard处理请求,而后将数据同步到replica node 4)coordinating node,若是发现primary node和全部replica node都搞定以后,就返回响应结果给客户端 架构
2.1.2 es数据的写入原理
es数据写入原理主要能够分为4个操做:负载均衡
- refresh
- commit
- flush
- merge
操做触发条件 | 操做过程 | |
---|---|---|
refresh | 1. 每隔1s进行一次refresh操做<br/>2. buffer已满,则进行一次refresh操做 | 1. buffer将数据写入segment file<br>2. 清空buffer |
commit | 1. 每隔30分钟执行一次translog<br/>2. translog日志已满 | 1. 会主动进行一次refresh操做,把buffer中的数据写入到segment file<br>2. 生成一个 commit point 文件标识这次操做一件把buffer数据执行到了哪个segment文件<br/>3. 执行flush操做 |
flush | commit操做中 | 1. 把file system上的文件所有强制fsync(持久化)到磁盘<br/>2. 清空translog文件<br/>3. 生成一个新的translog文件 |
merge | 后台检查 | 1. 将多个segment文件合并为一个文件,并把.del文件删除<br/>2. commit log 更新标识目前的segment<br/>3. 打开segmentfile 到file cache 以供快速搜索<br/>4. 删除旧的segment file |
2.2 es数据的读取
2.2.1 读取数据
使用RestFul API向对应的node发送查询请求,根据did来判断在哪一个shard上,返回的是primary和replica的node节点集合 这样会负载均衡地把查询发送到对应节点,以后对应节点接收到请求,将document数据返回协调节点,协调节点把document返回给客户端 分布式
2.2.2 全文检索
(1) 客户端使用RestFul API向对应的node发送查询请求
(2)协调节点将请求转发到全部节点(primary或者replica)全部节点将对应的数据查询以后返回对应的doc id 返回给协调节点
(3)协调节点将doc进行排序聚合
(4) 协调节点再根据doc id 把查询请求发送到对应shard的node,返回document性能
3 es在数据量很大的状况下如何提升性能
3.1 filesystem
es每次走fileSystem cache查询速度是最快的 因此将每一个查询的数据50% 容量 = fileSystem cache 容量。搜索引擎
3.2 数据预热
数据预热是指,每隔一段时间,将热数据 手动在后台查询一遍,将热数据刷新到fileSystem cache上设计
3.3 冷热分离
相似于MySQL的分表分库 将热数据单独创建一个索引 分配3台机器只保持热机器的索引 另外的机器保持冷数据的索引,但有一个问题,就是事先必须知道哪些是热数据 哪些是冷数据日志
3.4. document设计
在使用es时 避免使用复杂的查询语句(Join 、聚合),就是在创建索引时, 就根据查询语句创建好对应的元数据。blog
3.5 实际设计
采用elasticSearch + Hbase的架构方式。es中只存放少许关键数据创建索引,经过es查询到doc id 再去Hbase中查询完整的数据信息。
4 es在生产集群的部署架构是什么,每一个索引有多大的数据量,每一个索引有多少分片
生产环境部署状况 (1)es生产集群咱们部署了5台机器,每台机器是6核64G的,集群总内存是320G
(2)咱们es集群的日增量数据大概是2000万条,天天日增量数据大概是500MB, 每个月增量数据大概是6亿,15G。目前系统已经运行了几个月,如今es集群里数据总量大概是100G左右。
(3)目前线上有5个索引(这个结合大家本身业务来,看看本身有哪些数据能够放es的), 每一个索引的数据量大概是20G,因此这个数据量以内,咱们每一个索引分配的是8个shard,比默认的5个shard多了3个shard。
更多原创内容欢迎关注: 公众号:木对林三的成长 v❤:lh18708107810