Translog
Elasticsearch在写入的时候,还要写入Translog。可以把这个看作是MySQL里和redo log差不多的东西,如果宕机了可以通过Translog来恢复数据。
MySQL写入的时候,修改了内存里的值,然后记录了日志,也就是binlog、redo log和undo log
Elasticsearch写入的时候,也是写入了Buffer里,然后记录了Translog
两者的区别是:Translog是固定间隔刷新到磁盘上的,默认是5秒。
Translog是只追加的,也就是顺序写的,所以效率很高。只有刷新到磁盘的时候,才会非常慢。
但是,就算有Translog,还是有数据丢失的可能,最差情况下,会丢失5秒的数据。
Elasticsearch索引与分片
一个Elasticsearch的索引并不仅仅指倒排索引,还包括了对应的文档。这个和关系型数据库下的语义是不同的。
Elasticsearch的一个索引有多个分片,每个分片又有主从结构,类似于数据库的分库分表。可以这样理解:
一个索引是一个逻辑表
分片就是分库分表
每个分片都有主从结构,在分库分表里面,一般也是用主从集群来存储数据
Elasticsearch会尽量把分片分散在不同的节点上,这一点和kafka尽量把分区分散在不同broker上是一样的,为了保证在节点崩溃的时候将影响最小化。
主分片崩溃后,是怎么选出新的主分片呢?
主节点选择一个分片作为主分片,类似于Redis Sentinel里的机制,如果主节点宕机了,Sentinel会从节点里选出一个作为主节点
面试准备
公司有没有使用Elasticsearch,用来解决什么问题?
Elasticsearch性能怎么样?读写流量多大?存储数据量多大?
创建的索引有多大?有多少个分片?如何确定分片数量的?
有没有采用一些措施来保证Elasticsearch的可用性?有没有用过Elasticsearch的网关?
Elasticsearch有没有出过问题?如何解决的?
项目介绍的时候也可以强调一下项目可用性的一个关键点就是Elasticsearch,从而打开话题。面试的时候可以收集一些使用Elasticsearch的基本案例,这样面试讲到一些理论的时候,也可以用这些案例来佐证。
和Elasticsearch相关的面试题目有很多,比如:
有没有用过Elasticsearch?用来解决什么问题
用Elasticsearch的过程中,有没有遇到过什么问题?最后是如何解决的?
为什么Elasticsearch是近实时的?
Elasticsearch的flush指的是什么?refresh又是什么?
Elasticsearch的写入过程是什么样的?