亚瑟王666 2019-04-01 11:32 采纳率: 0%
浏览 962

ES数据同步-refresh-查询

  1. ES写入后,refresh前,各个分片的数据一致吗? 就是说,数据写入主分片,是先同步到副分片再refresh,还是先refresh再同步?
  2. 假设是先同步再refresh,如果设置了refresh_interval = 30s,各个分片会同时刷新(同一秒)吗? 就是说,会出现这种情况吗:一个是0s 30s 60s 刷新,一个是5s 35s 65s刷新。如果会,那么查询分别走主副分片,结果数量也会先大后小了——这个的用户体验不好吧
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 16:56
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在ES中,当数据被写入到主分片时,数据会在所有副本上同步更新,然后触发refresh操作。这是为了确保所有的数据都是最新的。

    关于您的第二个问题,如果设置refresh_interval为30s,那么在30秒内,每个分片都会执行一次refresh操作。这将导致在同一秒内,一些分片可能会刷新得更早,而其他分片则可能稍晚些。然而,由于refresh的操作不会影响到实际的数据存储顺序,所以最终的结果并不会对用户的体验造成太大的影响。

    对于用户来说,他们的请求会被发送给最接近他们地理位置的分片处理。因此,即使某些分片比其他分片刷新得更快,只要这些分片中的数据仍然是最新的,用户的体验应该不会有太大差异。

    以下是一个简单的示例代码:

    const { Client } = require('@elastic/elasticsearch');
    
    async function main() {
        const client = new Client({
            node: 'http://localhost:9200',
        });
    
        await client.indices.refresh({ index: 'my-index' });
    }
    
    main();
    

    在这个例子中,我们使用了一个模拟的Elasticsearch客户端来执行一个简单的indices.refresh操作,并没有涉及到任何复杂的刷新机制。但是,你可以看到,无论何时,索引都将在所有副本上刷新,以确保数据的一致性。

    评论

报告相同问题?