在 Elasticsearch 中,数据存储在分片(Shard)中,并且每个分片都可以有多个副本。这意味着写入和读取操作涉及到许多网络通信和数据复制等操作,因此需要一些特殊的机制来管理读写请求。
以下是 Elasticsearch 中的一些常见的读写机制:
写入机制
- 数据先被写入主分片(Primary Shard)。主分片负责处理所有文档的添加、更新和删除操作。
- 如果有副本分片,则主分片会将数据复制到其它副本上。这样可以保证数据的可靠性和冗余性。
- 当客户端发送写请求时,Elasticsearch 会使用 write consistency level 选项来控制写入操作的行为。write consistency level 有以下几种级别:
- one:只需将数据写入一个节点即可返回成功响应。
- quorum:至少需要将数据写入大多数节点才能返回成功响应。
- all:需要将数据写入所有节点才能返回成功响应。
- 在向客户端返回成功响应之前,Elasticsearch 会执行 refresh 操作以确保新添加或修改过的文档可以立即被搜索。
读取机制
- 客户端发送 read 请求时,Elasticsearch 会根据 request consistency level 选项来确定从哪些节点获取数据。request consistency level 有以下几种级别:
- one:只需从一个节点获取数据即可返回成功响应。
- quorum:需要从大多数节点获取数据才能返回成功响应。
- all:需要从所有节点获取数据才能返回成功响应。
- 如果请求的分片或副本尚未完成写入,则读取操作可能会失败。为了避免这种情况,可以使用 refresh 操作来强制刷新索引以确保文档可用于搜索。
以上是 Elasticsearch 中常见的读写机制,可以通过一些选项来调整和控制它们的行为。在 Go 中使用 Elasticsearch 官方提供的 Go 客户端库时,可以通过在请求中设置相关选项来管理读写请求。