ElasticSearch总结
ElasticSearch总结
ES的数据结构:index -> type -> document -> field。
每一个索引会被分为多个shard,每个shard保存部分数据,分别放在不同节点上。
shard有主shard允许读写,从shard允许读,从shard会与主shard同步数据。
ES集群会选举出一个主节点,负责维护索引元数据和管理主shard和从shard。
ES写数据请求:客户端选择一个节点作为自己的协调节点,协调节点根据请求文档进行路由。
把请求转发给主shard所在的节点,当从shard也同步完成了,协调节点才会给客户端响应。
ES读数据请求:客户端选择一个节点作为自己的协调节点,协调节点根据请求文档进行路由。
在主shard和全部从shard节点上轮询一个节点进行请求转发,然后把结果返回给客户端。
ES写数据原理
- 将数据写入buffer,在buffer时是不可查询的
- buffer快慢或者定时1秒,将buffer数据写入系统缓存里,此时数据可查询。
ES会定时5秒把系统缓存的数据写到translog文件里,以便重启后恢复。 - 当translog文件够大或者定时30分钟,ES会把buffer和translog文件里的数据写到硬盘上。
ES更/删数据原理
删数据会在一个.del
文件里标明这个文档已经被删除。而更新则是先删再插入一条新的文档。
倒排索引
对文件提取一些词,标记这些词在哪些文档里出现过,当查询关键字的时候就能快速返回包含关键字的文档。
doc id | doc |
---|---|
1 | google 推特 |
2 | 推特 facebook |
3 | facebook google |
word id | word | doc id |
---|---|---|
1 | 1,3 | |
2 | 推特 | 1,2 |
3 | 2,3 |
大数据量ES
- 虽然ES把数据写到了硬盘,但是操作系统会对硬盘的数据进行系统缓存到内存里。所以导致第一次查很慢,之后就很快了。
为了尽量能走系统缓存,应该尽量留多一点可用内存给操作系统而不是服务本身。最好可用内存为数据量的一半或以上 - 进行冷热数据分离
- ES的数据只保留查询字段,减少数据体积,非查询字段通过文档id再去其他地方查
- 数据预热
- ES的分页查询是每次都是从头查到中间的(像链表那样),不允许深页查,跳页查,可以一次性返回前N页自己分页
ElasticSearch总结
https://cellargalaxy.github.io/posts/中间件/8.ElasticSearch总结/