ES在写入时它是怎么完成一次写入操作的?
架构层面
在架构层面,由于ES分为了master、client、data、ingest四种角色,每次写入和读取的HTTP请求都会先落到client角色的节点上,然后再负载到各个data节点上,完成写入和读取的操作后又将响应给应用程序。其中需要注意的是data节点在进行查询时,是由多个分片进行查询后,在内存中拼接而成的,所系查询时也需要很大的内存,
持久化操作层面
这层面的话就只是在写入操作上进行了藐视,首先是数据请求到达了data节点进行存储,存储时刷盘存在了两种方式,buffer刷入磁盘和translog进行存储
1条回答 默认 最新
关注
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
ES在完成一次写入操作时,首先客户端向ES发送一条写入请求,请求会先落在client节点上,client节点会根据映射关系将请求发送给对应的data节点,data节点接收到请求后会先将数据缓存到内存中的buffer,当buffer满了或者定时刷新到磁盘时,ES会将buffer中的数据刷盘存储,同时会使用translog存储一份副本以保证数据的完整性。最后,ES会向客户端返回写入成功的响应。 举个例子,假设有一个包含多个节点的ES集群,其中有一个client节点和多个data节点,客户端向ES发送一条写入请求,请求中包含需要写入的数据和数据的映射关系。client节点根据映射关系将请求发送给对应的data节点A和B,data节点A和B接收到请求后先将数据缓存到各自节点的buffer中,当buffer满了或者定时刷新到磁盘时,data节点A将buffer中的数据刷盘存储,同时使用translog存储一份副本,data节点B也做同样的操作。最后,data节点A和B向client节点返回写入成功的响应,client节点再将响应返回给应用程序。 代码示例(Python):from elasticsearch import Elasticsearch es = Elasticsearch(["http://localhost:9200"]) data = { "name": "John Doe", "email": "johndoe@example.com", "age": 30 } mapping = { "properties": { "name": {"type": "text"}, "email": {"type": "keyword"}, "age": {"type": "integer"} } } # 创建索引并设置映射关系 es.indices.create(index="my_index", body={"mappings": mapping}) # 写入数据 es.index(index="my_index", id=1, body=data) # 查询数据 result = es.get(index="my_index", id=1) print(result["_source"])
以上代码示例中,首先创建了一个名为my_index的索引,并设置了映射关系。然后写入了一条包含{name, email, age}三个字段的数据,id为1。最后查询id为1的数据并打印到控制台。在实际运行中,ES会根据映射关系将写入请求发送给对应的data节点,节点将数据缓存到buffer中并最终存储到磁盘中。
解决 无用评论 打赏 举报