Discord使用ElasticSearch建立数十亿条消息的索引 -Sukhad


Discord 有数百万用户每天发送数十亿条消息。现在,这些用户也想搜索这些消息。我们如何索引这些以使它们可以通过消息中的不同关键字进行搜索?
让我们来了解一下:

1. 简单的答案是 Discrd 使用 ElasticSearch,Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 基于 Apache Lucene 构建。

2、elasticsearch如何存储数据?它以 JSON 文档的形式存储它,该文档是多个键值对的组合。

3、 这种弹性搜索如何启用索引?弹性搜索在内部创建一个倒排索引。什么是倒排索引?倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现在的所有文档。

4、在索引过程中,Elasticsearch 存储文档并建立倒排索引,使文档数据可近实时搜索。索引使用索引 API 启动,您可以通过它在特定索引中添加或更新 JSON 文档。

5.、现在让我们看看 discord 如何使用 Elastic Search。当文档被批量索引时,Elasticsearch 喜欢它。这意味着 Discord 无法索引实时发布的消息。人们通常不会搜索刚刚发布的消息,而是想搜索旧消息。

6、 现在,让我们看看批量索引需要什么?

  • 用于临时存储传入消息的分布式队列。
  • 一组索引器工作人员将一批消息索引到弹性搜索中。

7. 对于队列,discord 使用 Celery。它是一个开源的分布式队列。现在,Elastic Search弹性搜索不会在单个服务器上运行。它将以集群的形式运行。现在,问题来了,在哪里放置消息?在哪个集群上?

8、 这是在分片分配器的帮助下决定的,分片分配器决定将消息放在哪个分片上。但是,等一下。什么是分片?分片是弹性搜索集群和索引的组合。因此,这两者形成了一个分片,被不和谐用作一个单元。弹性搜索本身有一些分片。但这是不同的,所以不要混淆。

9、现在,最后一部分是服务发现——发现弹性搜索集群和该集群中的主机。这一点,他们在 etcd 另一个开源工具的帮助下完成了。