我只是学了一下编程 2021-06-27 17:23 采纳率: 15.4%
浏览 10

ES在写入时它是怎么完成一次写入操作的? 架构层面 在架构层面,由于ES分为了master、c

ES在写入时它是怎么完成一次写入操作的? 架构层面 在架构层面,由于ES分为了master、client、data、ingest四种角色,每次写入和读取的HTTP请求都会先落到client角色的节点上,然后再负载到各个data节点上,完成写入和读取的操作后又将响应给应用程序。其中需要注意的是data节点在进行查询时,是由多个分片进行查询后,在内存中拼接而成的,所系查询时也需要很大的内存, 持久化操作层面 这层面的话就只是在写入操作上进行了藐视,首先是数据请求到达了data节点进行存储,存储时刷盘存在了两种方式,buffer刷入磁盘和translog进行存储
  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-03-06 15:57
    关注
    让阿豪来帮你解答,本回答参考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中并最终存储到磁盘中。

    评论

报告相同问题?