使用 GCP/GAE 搜索和缓存 API

Nik*_*ntz 0 bitnami elasticsearch google-compute-engine google-cloud-platform google-app-engine-python

如果我在 GCE 中使用来自 Bitnami 的 ElasticSearch 图像,我是否需要一个单独的Memcached 虚拟机,或者最好通过其他方式(在客户端本地或通过 Web 缓存)甚至内置于 ElasticSearch 中使用 Memcached 进行缓存?我是否应该在类似于此示例的 appengine 灵活环境中的 docker 容器中使用 Elasticsearch 和 Memcached 来扩展运行时?

背景是我想升级最初是python2.7 google appengine webapp的项目,但是python3版本的google appengine for python已经弃用了memcached API和ndb search API,所以我正在考虑是否使用实例在带有 ElasticSearch 和/或 Memcached 的 GCE 中,我可以在 python3.8 appengine webapp 和运行 ElasticSearch 的某个实例之间划分服务。我试过了,这是一次很好的体验。

我还准备考虑除 ElasticSearch 之外的其他替代方案(Web UI 是使用和自定义 JS 创建的)。迁移从用户模型远,我们要利用进行用户认证,并保持了Python现在,但我们正在考虑从NDB模型移开,因为我们存储的主要数据为用户配置文件(现在可以存储在 Firebase 中)和短期数据(保存在 appengine 数据存储中)。如果这个项目是今天从头开始创建的,我可能会使用 Firebase 来处理所有事情,并通过 API 从前端层直接连接到它,但我明白如果我使用 Firebase

Par*_*hta 5

我建议您在添加额外的缓存层之前先优化您的 elasticsearch。添加额外的缓存层会随着维护请求的增加而增加成本,因此最好花费成本和精力来优化 elasticsearch。

在优化 elasticsearch 时,您需要考虑查询的复杂程度以及您需要多大的页面大小。Elasticsearch 非常强大,可以处理大量请求,并且通过 Google Marketplace 使用托管的 Elasticsearch 集群,您可以轻松增加弹性和可扩展性。我建议您检查一下价格是否符合您的要求。如果需要,您现在可以通过 GCP 结算进行合并结算。请参阅:https : //console.cloud.google.com/marketplace/details/google/elasticsearch

我建议您将数据加载到 elasticsearch 中,然后对您的 elasticsearch 实例进行负载测试,看看您获得了什么样的吞吐量和响应时间。您可以使用开发工具中的 Kibana 分析查询性能

使用 Kibana 进行查询性能分析

Elasticsearch 查询缓存

默认情况下启用缓存,但您可以通过查询字符串对其进行管理。如果设置,它将覆盖索引级别设置:

GET /my_index/_search?request_cache=true
{
  "size": 0,
  "aggs": {
    "popular_colors": {
      "terms": {
        "field": "colors"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

见:https : //www.elastic.co/guide/en/elasticsearch/reference/current/shard-request-cache.html

请求压缩响应 特别是当您的响应大小很大时,您应该请求压缩响应,这将有助于提高吞吐量。默认不压缩。您可以通过将以下标头添加到 elasticsearch 查询请求标头来完成此操作。

Accept-Encoding: deflate, gzip

有效管理分片和副本:

根据您在 elasticsearch 中存储的数据类型以及查询数据的方式,您可能需要进一步优化。如果您的查询性能不足,则可以进行分析和优化。这是一个很好的起点:https : //www.elastic.co/blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries

添加副本相当简单,但更改分片需要重建集群。所以最好在上线之前,在创建索引的时候把它弄好,也就是e

PUT /twitter
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是更改索引副本的方法

PUT /twitter/_settings
    {
        "index" : {
            "number_of_replicas" : 2
        }
    }
Run Code Online (Sandbox Code Playgroud)