Elasticsearch的写入文档过程是客户端向Elasticsearch服务发送写入请求,经过多个组件协同工作。
具体步骤如下:
- 客户端向Elasticsearch发送写入请求。请求中需要包含以下信息:
- 索引名称和类型:指明要写入到哪个索引、哪个类型;
- 文档ID:指明要写入的文档唯一标识符;
- 数据:要写入的文档内容,通常是JSON格式。
- 请求首先会被发送到Elasticsearch的协调节点,协调节点负责控制索引中的分片,它的工作包括:
- 确定要写入文档的主分片和副本分片的位置;
- 向主节点发送写入请求;
- 副本分片复制主分片的写操作。
- 写入请求到达主节点后,主节点会采取以下步骤:
- 生成全局唯一的递增版本号(_version);
- 在内存中创建文档,并为其分配一个唯一的文档ID(如果没有指定);
- 将文档写入主分片。
- 主分片写入成功后,主节点会向客户端发送写入成功的响应。同时,主节点还会将写入操作同步到分配给它的所有副本分片上。
- 副本分片接收到同步请求后,会将对应的文档复制到它自己本地的分片中。这样,副本分片就与主分片保持了一致性。
分片写入数据具体步骤如下:
-
当分片所在的节点接收到来自协调节点的请求后,会将请求写入到 Memory Buffer,然后定时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 Momery Buffer 到 Filesystem Cache 的过程就叫做 refresh;
-
当然在某些情况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢失,ES 是通过 translog 的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个过程叫做 flush;
-
在 flush 过程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删除并开始一个新的 translog。
-
flush 触发的时机是定时触发(默认 30 分钟)或者 translog 变得太大(默认为 512M)时;