一、Elasticsearch 写入原理
1、每个index,是由多个shard组成(默认是5个),每个shard有一个主节点和多个副本节点(分散在不同的物理节点上)。
2、 写入数据的时候,先根据routing参数(以那个字段的值作为路由key,可以在Request里面设置,
如果没有就会按照mapping里面设置的来,mapping里面没有设置,就会按_id的值做参数)计算出对应的shard,
在es集群中找到shard的primary节点。
3、数据发送到节点后,先将数据写入到内存buffer,这个时候是搜索不到数据的。
4、每隔1s,buffer里面的数据会生成segment file数据,并refresh到os cache中(系统级别的缓存),buffer缓存被清空,
这个时候可以搜索到数据了,因为生成了segment file,虽然没有写入磁盘,但是已经在系统缓存中了。os cache会定时
去做fsync,也就是写入数据到磁盘。
5、每隔5s,os cache会写入数据到translog日志文件,这个文件到达一定的大小后/或者到达一定时间后,会触发commit操作。
commit第一步,是将buffer里面的数据refresh到os cache里面,清空buffer。
第二步,是将os cache里面的数据fsync到磁盘里面去。
第三步,是清空translog日志文件文件,重启一个translog日志文件。
6、写入原理图:
二、es 写入涉及到的概念
segment file:
倒排索引,buffer里面的数据,每隔1