普通人刘大

普通人刘大 查看完整档案

北京编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

普通人刘大 回答了问题 · 2020-08-28

MYSQL支持中文和日文全文索引的解决方案有哪些呢?

楼主整理的好全面。如果想自己DIY解决问题的花,楼主已经讲的很清晰了。

我来提供另一个思路。

可以接入第三方搜索SaaS,比如国内的「卡拉搜索

一行代码即可快速部署站内搜索,各种分词、排序、站长策略等各种常见和极端小众的搜索问题已经被非常好的解决。

卡拉搜索接入指南:https://kalasearch.cn/docs

推荐一下。

关注 4 回答 2

普通人刘大 回答了问题 · 2020-08-24

解决网站的站内搜索如何实现?

如何快速搭建站内搜索这有一篇搭建细节
https://kalasearch.cn/blog/how-to-set-up-site-search/

关注 2 回答 8

普通人刘大 回答了问题 · 2020-08-24

解决网站的站内搜索如何实现?

ElasticSearch肯定是MySQL之后第一个能想到的解决方案

ES是一把牛刀,如果是超大型站,花大量时间搭一个称心的搜索当然挺好。

要是只是中小型站,为了set一把牛刀花大量时间有点不值得。

其实完全可以用第三方站内搜索SaaS,5分钟即可快速接入。

国内做的比较好的,可以看看「卡拉搜索」一行代码就可以快速接入站内搜索。

推荐一下

关注 2 回答 4

普通人刘大 回答了问题 · 2020-08-24

MySQL中文全文搜索用迅搜还是Sphinx?

Elastic Search是一把牛刀,如果是超大型站,花大量时间搭一个称心的搜索当然挺好。

要是只是中小型站,其实完全可以用第三方搜索SaaS,5分钟即可快速接入。

国内做的比较好的,可以看看卡拉搜索 kalasearch.com

一行代码就可以快速接入站内搜索。卡拉搜索的Demo,可以试试看。

关注 14 回答 9

普通人刘大 回答了问题 · 2020-08-08

解决docker安装后出现Cannot connect to the Docker daemon.

权限问题。先上sudo试试。

推荐各docker入门。比较适合新入手的小白

Docker 入门指南:如何在 Ubuntu 上安装和使用 Docker

https://kalasearch.cn/community/tutorials/how-to-install-and-use-docker-on-ubuntu/

关注 10 回答 7

普通人刘大 回答了问题 · 2020-08-08

docker宿主机随机端口映射了docker容器,如何让docker容器知道宿主机的IP与映射端口呢?

docker的映射的问题,其实主要是配置的问题。

具体可以看看这篇。讲的比较清晰
https://kalasearch.cn/community/tutorials/how-to-share-data-between-the-docker-container-and-the-host/

关注 3 回答 2

普通人刘大 回答了问题 · 2020-08-08

解决docker环境下的jenkins容器,进入后执行docker命令提示权限不够

关注 5 回答 4

普通人刘大 发布了文章 · 2020-06-30

第21篇-使用Django进行ElasticSearch的简单方法

我的Elasticsearch系列文章,逐渐更新中,欢迎关注
0A.关于Elasticsearch及实例应用
00.Solr与ElasticSearch对比
01.ElasticSearch能做什么?
02.Elastic Stack功能介绍
03.如何安装与设置Elasticsearch API
04.如果通过elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多个实例和head plugin使用介绍
06.当Elasticsearch进行文档索引时,它是如何工作的?
07.Elasticsearch中的映射方式—简洁版教程
08.Elasticsearch中的分析和分析器应用方式
09.Elasticsearch中构建自定义分析器
10.Kibana科普-作为Elasticsearhc开发工具
11.Elasticsearch查询方法
12.Elasticsearch全文查询
13.Elasticsearch查询-术语级查询
14.Python中的Elasticsearch入门
15.使用Django进行ElasticSearch的简单方法
16.关于Elasticsearch的6件不太明显的事情
17.使用Python的初学者Elasticsearch教程
18.用ElasticSearch索引MongoDB,一个简单的自动完成索引项目
19.Kibana对Elasticsearch的实用介绍
20.不和谐如何索引数十亿条消息
21.使用Django进行ElasticSearch的简单方法

另外Elasticsearch入门,我强烈推荐ElasticSearch新手搭建手册和这篇优秀的REST API设计指南 给你,这两个指南都是非常想尽的入门手册。

前一段时间,我在Django项目上工作,想实现快速的自由文本搜索。我决定使用NoSQL数据库,而不是使用常规数据库来执行此搜索功能(例如MySQL或PostgreSQL)。那就是我发现ElasticSearch的时候。

ElasticSearch为您的数据索引文档,而不是像常规关系数据库那样使用数据表。这可以加快搜索速度,并提供其他常规数据库无法获得的其他好处。我还保留了一个常规的关系数据库,用于存储用户详细信息,登录名和其他不需要ElasticSearch索引的数据。

在搜索了如何使用Django正确实现ElasticSearch的很长时间之后,我并没有真正找到令人满意的答案。一些指南或教程令人费解,似乎正在采取不必要的步骤来将数据索引到ElasticSearch中。有关如何执行搜索的信息很多,但有关如何完成索引的信息却不多。我觉得那里肯定有一个更简单的解决方案,所以我决定自己尝试一下。

我想使它尽可能简单,因为简单的解决方案在我看来往往是最好的解决方案。KISS(保持简单愚蠢),少即是多,所有这些东西都引起了我的共鸣,特别是当其他解决方案非常复杂时。我决定在此视频中使用HonzaKrál的示例来为我的代码提供基础。我建议您观看它,尽管此时它有点过时了。

由于我使用的是用Python编写的Django,因此与ElasticSearch进行交互非常容易。有两个客户端库可通过Python与ElasticSearch进行交互。有elasticsearch-py,这是官方的低级客户端。还有elasticsearch-dsl,它是在前者的基础上构建的,但是它提供了更高层次的抽象,但功能却少了一点。

我们将很快讨论一些示例,但首先我需要阐明我们要完成的工作:
● 在我们的本地计算机上设置ElasticSearch并确保其正常运行
● 设置一个新的Django项目
● 批量索引数据库中已经存在的数据
● 用户保存到数据库的每个新实例的索引
● 基本搜索示例

好吧,这似乎很简单。让我们开始在我们的机器上安装ElasticSearch。另外,所有代码都将在我的GitHub上可用,因此您可以轻松地遵循示例。

安装ElasticSearch
由于ElasticSearch在Java上运行,因此必须确保您具有更新的JVM版本。检查java -version终端中的版本。然后运行以下命令来创建新目录,下载,解压缩并启动ElasticSearch:

mkdir elasticsearch-examplewget 
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gztar
-xzf elasticsearch-5.1.1.tar.gz./elasticsearch-5.1.1/bin/elasticsearch

当ElasticSearch启动时,应该在终端窗口上打印很多输出。要检查其启动和运行是否正确,请打开一个新的终端窗口并运行以下curl命令:

curl -XGET http:// localhost:9200

响应应该是这样的:

{
  "name" : "6xIrzqq",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "eUH9REKyQOy4RKPzkuRI1g",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-06T12:36:15.409Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"

太好了,您现在已经在本地计算机上运行了ElasticSearch!现在该设置您的Django项目了。
设置Django项目
首先,您要使用创建一个虚拟环境,virtualenv venv然后使用进行输入,source venv/bin/activate以保留所有内容。然后安装一些软件包:

pip install django 
pip install elasticsearch-dsl

要启动一个新的Django项目,请运行:

django-admin startproject elasticsearchproject 
cd 
elasticsearchproject python manage.py startapp elasticsearchapp

创建新的Django项目后,您需要创建一个将要使用的模型。在本指南中,我选择了一个很好的老式博客文章示例。在其中models.py放置以下代码:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

Create your models here.

Blogpost to be indexed into ElasticSearch

class BlogPost(models.Model):
   author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blogpost')
   posted_date = models.DateField(default=timezone.now)
   title = models.CharField(max_length=200)
   text = models.TextField(max_length=1000)

到目前为止,还挺简单的。不要忘记添加elasticsearchapp到INSTALLED_APPS中settings.py和注册新的博文模型admin.py

是这样的:

from django.contrib import admin
from .models import BlogPost

Register your models here.

Need to register my BlogPost so it shows up in the admin

admin.site.register(BlogPost)

您还必须python manage.py makemigrations,python manage.py migrate并
python manage.py createsuperuser创建数据库和管理员帐户。现在,
python manage.py runserver转到http://localhost:8000/admin/并登录。现在,您应该可以在此处看到您的Blog帖子模型。继续并在管理员中创建您的第一篇博客文章。

恭喜,您现在有了一个可正常运行的Django项目!终于是时候玩有趣的东西了–连接ElasticSearch。

将ElasticSearch与Django连接
您首先需要search.py在elasticsearchapp目录中创建一个新文件。这是ElasticSearch代码的所在地。您要做的第一件事是创建从Django应用程序到ElasticSearch的连接。您可以在search.py

文件中执行此操作:

from elasticsearch_dsl.connections import connections
connections.create_connection()

现在,您已经与ElasticSearch设置建立了全局连接,您需要定义要索引到其中的内容。编写这段代码:

from elasticsearch_dsl.connections import connections
from elasticsearch_dsl import DocType, Text, Date
connections.create_connection()
class BlogPostIndex(DocType):
    author = Text()
    posted_date = Date()
    title = Text()
    text = Text()
    class Meta:
        index = 'blogpost-index'

它看起来与您的模型非常相似,对吧?该DocType作品的包装,让你写一个指数就像一个模型各字段,以便他们得到正确的格式,当他们得到索引。
在Meta内部,您告诉ElasticSearch您想要索引的名称。这将是ElasticSearch的参考点,以便当在数据库中初始化索引并保存每个创建的新对象实例时,它知道要处理的索引。
现在,您需要实际创建BlogPostIndex在ElasticSearch中新创建的映射。您可以执行此操作,还可以创建一种同时进行批量索引的方法-多么方便?
数据批量索引
该bulk命令位于该库的顶部,因此elasticsearch.helpers安装时包含该命令elasticsearch_dsl。在中执行以下操作search.py

from elasticsearch.helpers import bulk
from elasticsearch import Elasticsearch
from . import models
......
def bulk_indexing():
    BlogPostIndex.init() es = Elasticsearch()
    bulk(client=es, actions=(b.indexing() for b in models.BlogPost.objects.all().iterator()))

“这里发生了什么?” 你可能在想。实际上,它并不那么复杂。
因为只要在我们的模型中进行某些更改,您就只想进行批量索引编制,因此可以将其映射到ElasticSearch中的模型。然后,您使用并将其实例传递给它将创建与ElasticSearch的连接。然后,您将生成器传递到常规数据库中
所有BlogPost对象并对其进行迭代,并.indexing()在每个对象上调用方法。为什么要使用发电机?因为如果要在生成器上迭代的对象很多,则不必先将它们加载到内存中。
上面的代码只有一个问题。您.indexing()的模型上还没有方法。让我们修复一下:

...
from .search import BlogPostIndex
......
# Add indexing method to BlogPost
def indexing(self):
   obj = BlogPostIndex(
      meta={'id': self.id},
      author=self.author.username,
      posted_date=self.posted_date,
      title=self.title,
      text=self.text
   )
   obj.save()
   return obj.to_dict(include_meta=True)

您将索引方法添加到BlogPost模型。它返回a BlogPostIndex并保存到ElasticSearch。
现在让我们尝试一下,看看是否可以对以前创建的博客文章进行批量索引。通过运行python manage.py shell你进入Django的壳并导入search.py用from elasticsearchapp.search import *,然后运行bulk_indexing()在你的数据库索引的所有博客文章。要查看它是否有效,请运行以下curl命令:

curl -XGET'localhost:9200 / blogpost-index / blog_post_index / 1?pretty'

总结
这是一篇篇幅很长的文章,但我希望它写得足够​​简单,即使是初学者也能理解。
我解释了如何将Django模型连接到ElasticSearch进行索引和搜索,但是ElasticSearch可以做很多事情。我建议在他们的网站上阅读并探索还有其他可能性,例如空间操作和带有智能突出显示的全文本搜索。它是一个很棒的工具,我一定会在以后的项目中使用它!

查看原文

赞 0 收藏 0 评论 0

普通人刘大 发布了文章 · 2020-06-27

第20篇-不和谐如何索引数十亿条消息

我的Elasticsearch系列文章,逐渐更新中,欢迎关注
0A.关于Elasticsearch及实例应用
00.Solr与ElasticSearch对比
01.ElasticSearch能做什么?
02.Elastic Stack功能介绍
03.如何安装与设置Elasticsearch API
04.如果通过elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多个实例和head plugin使用介绍
06.当Elasticsearch进行文档索引时,它是如何工作的?
07.Elasticsearch中的映射方式—简洁版教程
08.Elasticsearch中的分析和分析器应用方式
09.Elasticsearch中构建自定义分析器
10.Kibana科普-作为Elasticsearhc开发工具
11.Elasticsearch查询方法
12.Elasticsearch全文查询
13.Elasticsearch查询-术语级查询
14.Python中的Elasticsearch入门
15.使用Django进行ElasticSearch的简单方法
16.关于Elasticsearch的6件不太明显的事情
17.使用Python的初学者Elasticsearch教程
18.用ElasticSearch索引MongoDB,一个简单的自动完成索引项目
19.Kibana对Elasticsearch的实用介绍
20.不和谐如何索引数十亿条消息
21.使用Django进行ElasticSearch的简单方法

另外Elasticsearch入门,我强烈推荐ElasticSearch新手搭建手册和这篇优秀的REST API设计指南 给你,这两个指南都是非常想尽的入门手册。

每月有数百万用户在Discord上发送数十亿条消息。一种搜索历史记录的方法迅速成为我们构建的最受欢迎的功能之一。让我们搜索吧!
要求
● 经济高效: Discord的核心用户体验是我们的文本和语音聊天。搜索是一项辅助功能,而反映这一功能所需的基础架构价格。理想情况下,这意味着搜索的费用不应超过消息的实际存储量。
● 快速直观:我们构建的所有功能都必须快速直观,包括搜索。我们产品的搜索体验也需要看起来和使用起来很棒。
● 自我修复:我们还没有一支专门的devop小组(因此),因此搜索需要能够以最少的操作员干预或完全没有操作员的干预来容忍失败。
● 线性可扩展:就像我们存储消息的方式一样,增加搜索基础结构的容量应涉及添加更多节点。
● 懒惰地索引:并非所有人都使用搜索-我们不应该对消息建立索引,除非有人尝试至少搜索一次。此外,如果索引失败,我们需要能够动态地重新索引服务器。

在查看这些要求时,我们向自己提出了两个关键问题:
问:我们可以将搜索外包给托管的SaaS吗?(简易模式)
A.不。我们研究过的每一项解决方案都进行了托管搜索,这会浪费我们的预算(天文数字很高)。此外,将消息从我们的数据中心中发送出去的想法与团队并不协调。作为一个注重安全的团队,我们希望控制用户消息的安全性,而不是让第三方知道他们在做什么。
问:是否存在可以使用的开源搜索解决方案?
答:是的!我们环顾四周,内部很快就开始讨论Elasticsearch vs Solr,因为两者都适合我们的用例。Elasticsearch具有优势:
● Solr上的节点发现需要ZooKeeper。我们运行etcd,并且不想拥有专门用于Solr的其他基础结构。Elasticsearch的Zen Discovery自成一体。
● Elasticsearch支持自动分片重新平衡,这将使我们能够向集群添加新节点,从而满足开箱即用的线性可扩展性要求。
● Elasticsearch具有内置的结构化查询DSL,而您必须使用第三方库以Solr编程方式创建查询字符串。
● 团队的工程师拥有更多与Elasticsearch合作的经验
Elasticsearch可以工作吗?
Elasticsearch似乎具备了我们想要的一切,并且我们的工程师在过去曾有过使用它的经验。它提供了一种跨不同节点复制数据的方法,以容忍单个节点的故障,通过添加更多节点来扩展群集,并可以吸收要索引的消息而不会费劲。到处阅读,我们听到了一些有关管理大型Elasticsearch集群的恐怖故事,实际上,除了日志记录基础架构之外,我们的后端团队都没有任何管理Elasticsearch集群的经验。
我们想避免这些繁琐的大型集群,因此我们想到了将分片和路由委托给应用程序层的想法,使我们可以将消息索引到较小的Elasticsearch集群池中。这意味着在群集中断的情况下,仅受影响的群集上包含的Discord消息将不可搜索。这还为我们提供了以下优势:如果无法恢复整个群集的数据,则可以丢弃整个群集的数据(系统可以在用户下次执行搜索时懒惰地重新索引Discord服务器)。
组成部分
当文档被大量索引时,Elasticsearch喜欢它。这意味着我们无法为实时发布的消息编制索引。取而代之的是,我们设计了一个队列,其中工作人员在单个批量操作中抓取一堆消息并将它们编入索引。我们认为,从发布消息到可搜索消息之间的微小延迟是一个完全合理的约束。毕竟,大多数用户搜索的都是历史记录而不是刚才所说的消息。

在摄取方面,我们需要一些注意事项:
● 消息队列:我们需要一个队列,我们​​可以在消息实时发布时将其放入(供工作人员使用)。
● 索引工作人员:执行实际路由和批量插入的工作人员从队列插入Elasticsearch。
我们已经在Celery之上构建了一个任务排队系统,因此我们也将其用于历史索引工作者。
● 历史索引工作人员:负责在给定服务器中遍历消息历史并将其插入到Elasticsearch索引中的工作人员。
我们还需要快速,轻松地映射Discord服务器的消息将驻留在哪个Elasticsearch集群上并建立索引。我们将此“群集+索引”对称为碎片(不要与索引中的Elasticsearch的本地碎片混淆)。我们创建的映射分为两层:
● 持久性碎片映射:我们将其放在Cassandra上,这是持久性数据的主要数据存储,是事实的来源。
● 分片映射缓存:当我们在工作人员上接收消息时,向Cassandra查询分片是一个很慢的操作。我们将这些映射缓存在Redis中,以便我们可以执行mget操作来快速确定需要将消息路由到的位置。

首次为服务器建立索引时,我们还需要一种方法来选择用于保留Discord服务器消息的碎片。由于分片是应用程序分层的抽象,因此我们可以对如何分配它们有所了解。通过利用Redis的功能,我们使用了排序集来构建负载感知的分片分配器。
● 分片分配器:在Redis中使用排序集,我们保留了一组分片,其得分代表其负荷。得分最低的分片是接下来应该分配的分片。分数随着每次新分配而增加,并且在Elasticsearch中索引的每条消息也都有可能增加其Shard的分数。随着分片中获得更多数据,它们被分配给新Discord服务器的可能性就较小。
当然,如果没有从应用程序层发现集群及其中的主机的方法,那么整个搜索基础架构将是不完整的。
● etcd:我们在系统的其他部分中使用etcd进行服务发现,因此我们也将其用于Elasticsearch集群。由于集群中的节点可以将自己声明到etcd上,以供系统其余部分查看,因此我们不必对任何Elasticsearch拓扑进行硬编码。
最后,我们需要一种让客户能够实际搜索事物的方法。
● 搜索API:客户端可以向其发出搜索查询的API端点。它需要进行所有权限检查,以确保客户端仅搜索他们实际有权访问的消息。

索引和映射数据
在非常高的层次上,在Elasticsearch中,我们有一个“索引”的概念,其中包含许多“碎片”。在这种情况下,分片实际上是Lucene索引。Elasticsearch负责将索引内的数据分发到属于该索引的分片。如果需要,可以使用“路由键”控制数据在分片之间的分配方式。索引也可以包含“复制因子”,即索引(及其中的分片)应复制到的节点数。如果索引所在的节点发生故障,则副本可以接管(不相关但相关,这些副本也可以用于搜索查询,因此您可以通过添加更多副本来扩展索引的搜索吞吐量)。
由于我们在应用程序级别(我们的分片)中处理了所有分片逻辑,因此让Elasticsearch为我们进行分片实际上没有任何意义。但是,我们可以使用它在集群中的节点之间进行索引的复制和平衡。为了让Elasticsearch使用正确的配置自动创建索引,我们使用了索引模板,其中包含索引配置和数据映射。索引配置非常简单:
● 索引只能包含一个分片(不要为我们做任何分片)
● 索引应复制到一个节点(能够容忍索引所在的主节点的故障)
● 索引每60分钟应刷新一次(为什么要这样做,下面将进行说明)。

索引包含一个文档类型:
message

将原始消息数据存储在Elasticsearch中几乎没有意义,因为数据的格式不是易于搜索的格式。相反,我们决定采用每条消息,并将其转换为一堆字段,其中包含有关消息的元数据,我们可以对其进行索引和搜索:

您会注意到,我们没有在这些字段中包含时间戳,并且如果您从我们以前的博客文章中回忆起,我们的ID是Snowflakes,这意味着它们固有地包含时间戳(我们可以在之前,之后和之后使用它来加电)使用最小和最大ID范围进行查询)。

但是,这些字段实际上并没有“存储”在Elasticsearch中,而是仅存储在反向索引中。实际存储和返回的唯一字段是张贴消息的消息,通道和服务器ID。这意味着消息数据在Elasticsearch中不会重复。折衷是,我们必须在返回搜索结果时从Cassandra获取消息,这是完全可以的,因为我们必须从Cassandra中提取消息上下文(前后2条消息)以始终为UI供电。将实际的消息对象保留在Elasticsearch之外意味着我们不必为存储它而额外的磁盘空间。但是,这意味着我们无法使用Elasticsearch突出显示搜索结果中的匹配项。我们必须将标记生成器和语言分析器内置到我们的客户端中以进行突出显示(这确实很容易做到)。

实际编码
我们认为可能不需要微服务来搜索,而是向Elasticsearch公开了一个封装了路由和查询逻辑的库。我们唯一需要运行的附加服务是索引工作程序(它将使用此库来执行实际的索引工作)。暴露给团队其他成员的API表面积也很小,因此,如果确实需要将其转移到它自己的服务中,则可以轻松地将其包装在RPC层中。该库也可以由我们的API工作者导入,以实际执行搜索查询并通过HTTP将结果返回给用户。

对于团队的其他成员,该库暴露了用于搜索消息的最小表面积:
排队要编制索引或删除的消息:

批量索引工作人员中的实时消息(大致):

为了对服务器的历史消息建立索引,一个历史索引作业将执行一个工作单元,并返回继续运行该服务器所需的下一个作业。每个作业代表进入服务器消息历史记录和固定执行单位的光标(在这种情况下,默认值为500条消息)。作业将新游标返回到要索引的下一批消息,如果没有更多工作要做,则返回“无”。为了快速返回大型服务器的结果,我们将历史索引分为两个阶段,即“初始”阶段和“深度”阶段。“初始”阶段为服务器上最近7天的邮件编制索引,并使索引可供用户使用。之后,我们在“深层”阶段对整个历史进行索引,该阶段以较低的优先级执行。本文显示给用户的外观。这些作业在一组芹菜工作者中执行,从而可以在这些工作者执行的其他任务中安排这些工作。大致如下所示:

在生产中进行测试

在对此进行编码并在我们的开发环境上对其进行测试之后,我们决定是时候看看它在生产中的性能了。我们创建了一个包含3个节点的单个Elasticsearch集群,配置了索引工作器,并计划对1,000个最大的Discord服务器进行索引。一切似乎都正常,但是在查看集群中的指标时,我们注意到了两件事:

  1. CPU使用率高于预期。
  2. 磁盘使用率增长得太快了,无法索引大量消息。

我们很困惑,在让它运行了一段时间并用完了太多的磁盘空间之后,我们取消了索引作业,并将其命名为通宵。不太正确。
第二天早上回来时,我们注意到磁盘使用量减少了很多。Elasticsearch是否丢弃了我们的数据?我们尝试在我们索引其中一台服务器所在的一台服务器上发出搜索查询。结果返回的很好-而且速度也很快!是什么赋予了?

磁盘使用率快速增长然后逐渐减少

CPU使用率
经过研究后,我们提出了一个假设!默认情况下,Elasticsearch的索引刷新间隔设置为1秒。这就是在Elasticsearch中提供“近实时”搜索功能的原因。每隔一千个索引(跨越一千个索引),Elasticsearch会将内存缓冲区刷新到Lucene段,并打开该段使其可搜索。一整夜,Elasticsearch在空闲时将其生成的大量细小段合并为磁盘上更大(但更节省空间)的段。
测试这一点非常简单:我们将所有索引都放在了集群上,将刷新间隔设置为任意大的数字,然后我们计划对同一服务器进行索引。提取文档时,CPU使用率几乎降为零,并且磁盘使用率没有以惊人的速度增长。晕!
减少刷新间隔后的磁盘使用率

CPU使用率

但是,不幸的是,实际上,关闭刷新间隔是无效的……
刷新困境
显而易见,Elasticsearch的自动近实时索引可用性无法满足我们的需求。可能服务器无需执行单个搜索查询就可以运行数小时。我们需要建立一种方法来控制应用程序层的刷新。我们通过Redis中过期的hashmap做到了这一点。假设Discord上的服务器已在Elasticsearch上共享为共享索引,我们可以构建一个快速映射,该索引随索引一起更新,跟踪是否需要刷新索引(给定要搜索的服务器)。数据结构很简单:存储哈希图的Redis密钥
prefix + shard_key到标记guild_id

值的哈希图,表示需要刷新。回想起来,这可能是一个集合。
因此,索引生命周期变为:
从队列中提取N条消息。
找出这些消息应由其路由到何处guild_id
对相关集群执行批量插入操作。
更新Redis映射,表示该碎片和该碎片中的给定guild_id

s现在已变脏。1小时后使该密钥过期(因为此时Elasticsearch会自动刷新)。
搜索生命周期变成:
如果脏了,请刷新碎片的Elasticsearch索引,并将整个碎片标记为干净。
执行搜索查询并返回结果。
您可能已经注意到,即使我们现在已经在Elasticsearch上显式控制了刷新逻辑,我们仍然让它每小时自动刷新基础索引。如果在我们的Redis映射上发生数据丢失,则系统最多需要一个小时才能自动更正自身。
未来
自1月份部署以来,我们的Elasticsearch基础架构已扩展到2个集群中的14个节点,使用GCP上的n1-standard-8实例类型,每个实例类型具有1TB的Provisioned SSD。文件总数约为260亿。索引速率达到峰值,约为每秒30,000条消息。Elasticsearch毫不费力地处理了它-在我们推出搜索的整个过程中,CPU保持在5-15%。

到目前为止,我们已经能够轻松地向集群添加更多节点。在某个时候,我们将启动更多集群,以便新的Discord服务器被索引到它们上(这要归功于我们的加权分片分发系统)。在我们现有的集群上,随着向集群中添加更多数据节点,我们将需要限制主合格节点的数量。
我们还偶然发现了4个主要指标,用于确定何时需要增长集群:

  1. heap_free :(又名heap_committed — heap_used)当我们用完了可用的堆空间时,JVM被迫执行一个完整的世界各地的GC来快速回收空间。如果无法回收足够的空间,则该节点将崩溃并燃烧。在此之前,JVM将进入一种状态,在这种状态下,随着堆已满,并且在每个完整的GC期间释放的内存太少,JVM会不断地执行世界范围内的GC。我们将其与GC统计信息一起查看,以了解垃圾回收花费了多少时间。
  2. disk_free:显然,当我们用完磁盘空间时,我们需要添加更多节点或更多磁盘空间来处理被索引的新文档。在GCP上,这非常容易,因为我们可以增加磁盘的大小而无需重新启动实例。选择添加新节点还是调整磁盘大小取决于此处提到的其他指标的外观。例如,如果磁盘使用率很高,但其他指标处于可接受的水平,则我们将选择添加更多的磁盘空间而不是新节点。
  3. cpu_usage:如果我们在高峰时段达到CPU使用量的阈值。
  4. io_wait:如果集群上的IO操作变得太慢。

不健康的群集(堆满)
无堆(MiB)
耗用时间GC / s
健康集群
无堆(GiB)
耗用时间GC / s

结论
自我们启动搜索功能以来,距离现在已经有三个多月了,到目前为止,该系统几乎没有遇到任何问题。

Elasticsearch在大约16,000个索引和数百万个Discord服务器中显示了从0到260亿个文档的稳定一致的性能。我们将继续通过向现有集群添加更多集群或更多节点来扩展规模。在某个时候,我们可能会考虑编写代码,使我们能够在群集之间迁移索引,从而减轻群集负载,或者如果Discord服务器是特别健谈的服务器,则可以为Discord服务器提供自己的索引(尽管我们的加权分片系统做得很好确保大型Discord服务器当前通常拥有自己的碎片)。

查看原文

赞 0 收藏 0 评论 0

普通人刘大 发布了文章 · 2020-06-25

第19篇-Kibana对Elasticsearch的实用介绍

我的Elasticsearch系列文章,逐渐更新中,欢迎关注
0A.关于Elasticsearch及实例应用
00.Solr与ElasticSearch对比
01.ElasticSearch能做什么?
02.Elastic Stack功能介绍
03.如何安装与设置Elasticsearch API
04.如果通过elasticsearch的head插件建立索引_CRUD操作
05.Elasticsearch多个实例和head plugin使用介绍
06.当Elasticsearch进行文档索引时,它是如何工作的?
07.Elasticsearch中的映射方式—简洁版教程
08.Elasticsearch中的分析和分析器应用方式
09.Elasticsearch中构建自定义分析器
10.Kibana科普-作为Elasticsearhc开发工具
11.Elasticsearch查询方法
12.Elasticsearch全文查询
13.Elasticsearch查询-术语级查询
14.Python中的Elasticsearch入门
15.使用Django进行ElasticSearch的简单方法
16.关于Elasticsearch的6件不太明显的事情
17.使用Python的初学者Elasticsearch教程
18.用ElasticSearch索引MongoDB,一个简单的自动完成索引项目
19.Kibana对Elasticsearch的实用介绍
20.不和谐如何索引数十亿条消息
21.使用Django进行ElasticSearch的简单方法

另外Elasticsearch入门,我强烈推荐ElasticSearch新手搭建手册和这篇优秀的REST API设计指南 给你,这两个指南都是非常想尽的入门手册。

什么是Elasticsearch
Elasticsearch是一个高度可扩展的开源搜索引擎。它使您可以实时地保留和分析大量信息。
Elasticsearch使用JSON文档文件。使用内部结构,它可以几乎实时地解析您的数据以搜索所需的信息。
在处理大数据时非常有用。

定义和其他东西
有关Elasticsearch的一些技术(但有用)信息是:
● 它是一个实时的分布式分析引擎。
● 它是开源的,用Java开发。
● 它使用基于文档的结构而不是表和架构。
我发现的最大好处是速度和可伸缩性。它以允许查询真正快速的方式实现。关于可伸缩性,它可以在您的笔记本电脑或数以PB计的数据的数百台服务器中运行。

除了速度和可伸缩性之外,它还具有与故障相关的高弹性,并且在数据类型方面具有很高的灵活性。

同样,Elasticsearch对大数据非常有用,可以轻松地在几乎实时的搜索中分析数百万个数据。这就是Elasticsearch的魔力。

但是,您如何搜索所有这些数据?为此,您使用查询。

查询:执行和组合多种类型的搜索(例如结构化,非结构化,地理,度量等)的语言。您可以“无论如何都要”进行查询。

关于分析,Elasticsearch使您可以轻松了解数十亿条日志行。它提供了汇总,可帮助您缩小范围以探索数据中的趋势和模式。

例如,如果您有一个具有500个节点的云,则可以在短时间内分析整个基础架构,将日志导入Elasticsearch,然后根据其响应,找出导致基础架构出现问题的根本原因。

其他使用示例:
● 显示具有特定值的数据。例如:从数据库中显示所有23岁的用户。
● 选择具有特定值的数据按地理位置搜索数据
● 地理搜索按天汇总数据

客户群
Elasticsearch非常有趣,以至Mozilla,GitHub,Stack Exchange,Netflix和更多用户使用它。
动手
既然您已经对Elasticsearch有所了解,那么我们来看这个故事的实际部分。
安装

  1. 要执行Elasticsearch,您必须:
  2. 安装Java:版本应为8或更高。

安装Elasticsearch:并按照以下步骤在您的操作系统中进行安装。如果您安装了装有Homebrew的MacOS,则只需输入以下内容即可安装

brew install elasticsearch

接口
要使用Elasticsearch,您将需要一个接口。在这个故事中,我将使用Kibana(一个很棒的Web界面)来可视化和操纵Elasticsearch的数据。

可以在elastic.co中下载并按照此处介绍的步骤进行安装,或者通过以下命令使用Homebrew:
brew install kibana

您需要为Elasticsearch和Kibana下载相同的版本。
将来,当您发现自己需要开发与Elasticsearch进行交互的软件时,可以使用编程语言与之交互。一些可接受的编程语言是:
● Java
● C#
● Python
● JavaScript
● PHP
● Perl
● Ruby
基本概念
好!现在您已经安装了Elasticsearch和Kibana。在开始使用它之前,让我们看一些有关Elasticsearch的有用概念。
Elasticsearch是由


群集是一个或多个节点的集合,这些节点一起保存整个数据。它在所有节点上提供联合索引和搜索功能,并由唯一名称标识(默认情况下为'/ elasticsearch'/)

节点
节点是作为群集一部分的单个服务器,它存储数据并参与群集的索引和搜索功能。

指数
索引是具有相似特征的文档的集合,并由名称标识。此名称用于在对索引中的文档执行索引,搜索,更新和删除操作时引用索引。在单个群集中,您可以定义任意多个索引。

文件
文件是可以编制索引的基本信息单位。它以JSON表示,JSON是一种普遍存在的Internet数据交换格式。

碎片
Elasticsearch提供了将索引细分为多个碎片的功能。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在群集内的任何节点上。当放置在单个节点中的索引占用的磁盘空间超过可用磁盘空间时,这很有用。然后,将索引细分为不同的节点。此外,分片允许您在各个分片之间分配和并行化操作,从而提高性能。

复制品
Elasticsearch允许您为索引的分片制作一个或多个副本,这些副本称为副本分片或副本。如果节点发生故障,它可以提供高可用性,并且由于可以在所有副本上并行执行搜索,因此可以扩展搜索量。
执行中
好吧,现在,让我们真正地动手吧。转到安装Elasticsearch的目录,然后通过终端执行该命令
$ ./elasticsearch

如果您是使用Homebrew安装的,请尝试输入
elasticsearch

终端。它可以启动Elasticsearch,而无需转到其目录。
Elasticsearch开始现在,正在执行Elasticsearch,打开另一个终端窗口并执行Kibana,转到其目录并执行,
$ ./kibana

或者使用Homebrew,只需输入

$ kibana

Kibana开始了如果一切顺利,那么您将同时被执行。要进行验证,请打开网络浏览器,然后转到:
http://localhost:9200
http://localhost:9200

结果表明Elasticsearch正在运行如果您看到与上述相似的结果,则表明Elasticsearch已启动并正在运行。
要查看Kibana界面,请转到:
http://localhost:5601

位于http:// localhost:5601的Kibana界面
如果一切都如上所示,现在让''播放一些数据。
指令
在Kibana界面中,选择左侧菜单上的开发工具。您将看到一个左侧的控制台来键入命令,而右侧的控制台来查看结果。
让我们看看可用于操作数据的命令。

PUT命令允许您将新文档数据插入Elasticsearch。在控制台中键入以下代码,按绿色的播放按钮,然后查看结果。

PUT /my_playlist/song/6
{
 "title" : "1000 years",
 "artist" : "Christina Perri",
 "album" : "Breaking Dawn",
 "year" : 2011
}

这意味着您只是将文档数据插入到Elasticsearch中。在此示例中,我们有
/my_playlist/song/6

其中:
● my_playlist:是要插入数据的索引的名称。
● song:是要创建的文档的名称。
● 6:元素实例的ID。在这种情况下,是歌曲ID。
如果索引my_playlist尚不存在,则会创建该索引,就像文档歌曲和id 6一样。
要更新值,请对同一文档使用相同的PUT命令。例如,如果要插入新的参数,位置,则可以通过以下方式进行:

PUT /my_playlist/song/6
{
 "title" : "1000 years",
 "artist" : "Christina Perri",
 "album" : "Breaking Dawn",
 "year" : 2011,
 "location" : "London"
}

结果应为
得到
GET命令允许您检索有关数据的信息。键入以下示例:
GET / my_playlist / song / 6

这将检索您刚刚插入的数据。
删除
要删除文档,您只需要使用以下命令:
删除/ my_playlist / song / 6

搜索数据
好的,知道您知道一些命令。但是,它以非常简单的方式呈现。对此进行更深入的了解,可以执行更复杂的查询。
有不同的Search API。为简单起见,我将仅提供一些简单的示

要将数据集加载到Elasticsearch中,请打开终端,转到下载文件的目录,然后执行以下命令:

curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json

现在,您应该将帐户数据放入Elasticsearch。您可以尝试以下示例:
URI搜索的简单示例
从状态UT返回所有帐户。

GET /bank/_search?q=state:UT

从UT或CA返回所有帐户。

GET /bank/_search?q=state:UT OR CA

从状态TN和女性客户返回所有帐户。

GET /bank/_search?q=state:TN AND gender:F

退还20岁以上人士的所有帐户。

GET /bank/_search?q=age:>20

退还20至25岁之间的所有帐户。

GET /bank/_search?q=age:(>=20 AND <=25)

使用查询DSL的简单示例
URI可能不是查询Elasticsearch的最佳方法。似乎最好使用QueryDSL。

将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
● 叶子查询子句:它在特定字段中查找特定值,例如match,term或range查询。
● 复合查询子句:它包装其他叶查询或复合查询,并用于以逻辑方式组合多个查询(例如bool或dis_max查询),或更改其行为(例如constant_score查询)。
查询子句的行为不同,取决于它们是在查询上下文中还是在过滤器上下文中使用:
● 查询上下文:查询上下文中使用的查询子句回答以下问题:“此文档与该查询子句的匹配程度如何?” 。答案是_score,代表文档相对于其他文档的匹配程度。
● 过滤器上下文:过滤器上下文中的查询子句回答问题“此文档是否与此查询子句匹配?”。答案是简单的是或否。
以下是在搜索 API的查询和过滤器上下文中使用的查询子句的示例。此查询将匹配满足以下所有条件的文档:
● 该地址字段包含字街
● 在性别字段包含确切的词˚F
● 该年龄字段包含数大于或等于25

GET / _search 
{ 
  “ query”:{// 1 
    “ bool”:{// 2 
      “ must”:[ 
       {“ match”:{“ address”:“ Street”}}} // 3 
      ],
      “ filter”:[ // 4 
        {“ term”:{“ gender”:“ f”}},// 5 
        {“ range”:{“ age”:{“ gte”:25}}} // 6 
      ] 
    } 
  } 
}

子句用于查询上下文,这意味着它们用于对每个文档的匹配程度进行评分。
// 4:该
filter

参数表示过滤器上下文。
// 5和// 6:
term


range

子句在过滤器上下文中使用。它们将过滤出不匹配的文档,但不会影响匹配文档的分数。
提示:在查询上下文中使用查询子句以应对可能影响匹配文档得分(即文档匹配程度)的条件,并在过滤器上下文中使用所有其他查询子句。

现在,您对什么是Elasticsearch以及如何在其上插入,更新,删除和搜索数据有所了解。Kibana具有更多查看数据的功能,包括将其显示为不同的图形。我建议您探索所有这些。
关于Elasticsearch的更多信息。根据我在与Elasticsearch的第一次接触中对这些主题的了解,在此介绍的内容只是开始了解它的第一步。阅读此故事后,您应该探索Kibana界面,Elasticsearch文档,如何创建更复杂的查询等等。
我希望这个故事对您初次接触Elasticsearch有帮助,现在您可以轻松阅读其他教程和文档。
感谢您的阅读并祝您学习顺利:)

编辑:
我在这里感谢Elasticsearch社区论坛的David Pilato,他帮助我指出了本教程的一些改进。

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 3 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-05-28
个人主页被 607 人浏览