OVHcloud Managed OpenSearch : moteur NoSQL managé pour logs et recherche

Utiliser OVHcloud Managed OpenSearch avec PrestaShop : structurer les logs, ingestion asynchrone, templates de mapping, sécurité RGPD et bonnes pratiques d’exploitation.

Deux écrans affichant des systèmes d'analyse de données avec des graphiques et des visualisations.

Table des matières :

  1. OpenSearch en 2026 : pourquoi on le classe (à tort ou à raison) parmi les NoSQL
  2. OVHcloud Managed OpenSearch : ce que le managé vous retire (et ce qu’il vous laisse)
  3. Logs e‑commerce : structurer, indexer, et éviter le chaos du mapping dynamique
  4. Ingestion vers OVHcloud Managed OpenSearch : Bulk API, backpressure et transport “propre”
  5. Recherche applicative : utiliser OpenSearch sans transformer PrestaShop en usine à gaz
  6. Sécurité, multi-tenant et RGPD : OpenSearch est un outil, pas une garantie
  7. Exploitation : ISM, snapshots, tuning des shards et monitoring du cluster

OpenSearch en 2026 : pourquoi on le classe (à tort ou à raison) parmi les NoSQL

OpenSearch n’est pas un « NoSQL » au sens MongoDB/Cassandra (modèle clé/valeur ou colonnes), mais un store orienté documents + moteur de recherche basé sur Apache Lucene. La donnée est stockée en JSON dans des index partitionnés en shards, eux‑mêmes composés de segments immuables. La “requêtabilité” (full‑text, agrégations, filtres, scoring) fait partie du stockage : c’est précisément ce qui le rend pertinent pour deux familles de workloads qui cassent vite une base relationnelle : logs/événements (volumétrie, champs hétérogènes, requêtes exploratoires) et recherche applicative (analyzers linguistiques, tolérance aux fautes, autocomplete).

Là où l’étiquette « NoSQL » devient utile en architecture, c’est qu’OpenSearch se comporte comme un système schéma‑à‑l’écriture (mappings) plutôt qu’un schéma relationnel normalisé : vous définissez des champs (keyword, text, date, integer, nested…), vous acceptez une certaine dénormalisation, et vous vous appuyez sur des mécanismes propres aux moteurs de recherche :

  • Near real‑time : un document indexé n’est pas instantanément “visible” tant qu’un refresh n’a pas eu lieu (réglé par refresh_interval).
  • Inverted index : le coût est payé à l’écriture (analyse, tokenisation), ce qui rend les lectures très rapides sur du texte et des facettes… à condition d’éviter l’explosion de champs.
  • Évolutivité horizontale par shards : on scale “par index”, pas “par table”.

OpenSearch se présente comme une suite open source de recherche et d’analytics dérivée d’Elasticsearch 7.10.2 et Kibana 7.10.2 (OpenSearch Project : https://opensearch.org/). Le point important pour un dev PrestaShop : OpenSearch n’est pas “un Elasticsearch gratuit”, c’est un écosystème avec sa propre cadence de releases, ses plugins (sécurité, observabilité, alerting, ISM…), et des différences de comportement qui apparaissent en prod (gestion des templates, sécurité fine‑grained, APIs).

Dans un stack e‑commerce, OpenSearch est typiquement un index dérivé : un système secondaire qui accélère la recherche et l’analyse, mais qui doit pouvoir être reconstruit. Cette idée (“l’index est reconstructible”) doit guider vos décisions : si une erreur de mapping vous oblige à recréer l’index, vous voulez que le pipeline de réindexation (exports, workers, bulk) soit déjà prêt — et pas improvisé un jour d’incident.

OVHcloud Managed OpenSearch : ce que le managé vous retire (et ce qu’il vous laisse)

Sur PrestaShop, l’auto‑hébergement d’un cluster OpenSearch/Elasticsearch est rarement un problème “logiciel” ; c’est un problème de JVM, de disk I/O, de shards mal dimensionnés, de snapshots, de patching et de SLO. Un service managé comme OVHcloud Managed OpenSearch vise à vous sortir de la boucle : provisioning, maintenance, opérations récurrentes. En pratique, ça réduit surtout la surface de risque “infra”, mais ça ne corrige pas vos choix d’indexation (explosion de champs, analyzers incohérents, refresh trop agressif, etc.).

Le “managé” change aussi vos arbitrages : vous déplacez du temps homme (astreintes, upgrades, tuning JVM) vers du temps “produit” (design du schéma, qualité des événements, parcours de recherche, analytics). Dans un contexte e‑commerce, c’est souvent le bon deal : le coût caché d’un cluster mal opéré se voit rarement sur une ligne budgétaire, mais très vite sur une recherche lente, des dashboards inutilisables ou des logs inexploitables au pire moment (période de soldes, campagne Ads, pic de commandes).

Le managé impacte aussi la gouvernance d’accès : vous allez manipuler des endpoints, des certificats, des rôles et des politiques. Si vous êtes déjà structuré côté OVHcloud (comptes techniques, rotation des secrets), ce point devient un gain net. Sinon, c’est un piège classique : un cluster “managé” exposé sur Internet avec un mot de passe partagé. À ce niveau, l’article interne sur les identités OVHcloud est un bon prérequis : Comptes de service OVHcloud : création et gestion IAM via espace client.

Enfin, le managé impose des contraintes que vous devez expliciter avant de migrer : limites de plugins, paramètres cluster verrouillés, fenêtres de maintenance, options réseau (public vs privé selon offres), stratégie de sauvegarde/snapshots et restauration. Traduction : si votre besoin est “je veux contrôler tous les knobs JVM et faire du tuning agressif”, un service managé vous frustrera. Si votre besoin est “je veux ingérer des logs et requêter sans passer mes nuits sur des GC logs”, le compromis est rationnel.

Petit angle “géo” pertinent (sans sur-vendre) : OVHcloud opère historiquement des datacenters en France (ex. Roubaix, Gravelines, Strasbourg) et en Europe. Pour certaines organisations, cette proximité géographique et juridique (hébergement UE/France, latence intra‑UE, contraintes clients) fait partie des critères de décision — mais ça ne remplace ni une politique d’accès stricte, ni une stratégie de rétention compatible RGPD.

Logs e‑commerce : structurer, indexer, et éviter le chaos du mapping dynamique

Le cœur PrestaShop n’est pas exemplaire côté observabilité : logs hétérogènes, contextes insuffisants, et corrélation limitée entre un 500, une requête SQL lente et un panier qui time‑out. La première étape n’est pas OVHcloud Managed OpenSearch, c’est la discipline du log structuré. La recommandation la plus pragmatique reste celle du Twelve‑Factor App :

“A twelve-factor app never concerns itself with routing or storage of its output stream.” (The Twelve‑Factor App, Logs)
12factor.net/logs

Donc : loggez en JSON (stdout ou fichier), et externalisez la collecte.

Sur une stack PrestaShop 8.x/9.x (PHP 8.2/8.3), visez au minimum ces champs stables : @timestamp, level, message, channel, env, shop_id, request_id, customer_id (id interne), cart_id, order_id, http.method, http.status_code, url.path, duration_ms, sql.duration_ms quand vous l’avez. Le request_id est le pivot qui manque le plus souvent : sans lui, vous faites de la “recherche de symptômes”, pas du diagnostic.

Pour éviter les champs “au petit bonheur”, vous pouvez aussi vous caler sur une convention existante (même partiellement) : par exemple les champs http.*, url.*, user_agent.*, trace_id/span_id si vous instrumentez. L’objectif n’est pas d’être “parfait”, mais d’être cohérent : deux développeurs différents doivent produire des événements requêtables de la même manière.

Côté OpenSearch, le mapping dynamique est un générateur d’incidents. Deux cas classiques :

  • un champ arrive parfois en string, parfois en number ("200" vs 200) ⇒ conflits de mapping et indexation rejetée ;
  • des clés JSON variables (ex. context.user_agent.raw, context.user_agent.parsed, etc.) ⇒ explosion de champs, hausse mémoire, ralentissement.

Concrètement, vous mettez une index template (ou composant de template) qui fixe les types attendus et limite les dérives. Exemple minimaliste pour des logs applicatifs (à adapter) :

PUT _index_template/logs-app-template
{
  "index_patterns": ["logs-app-*"] ,
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "refresh_interval": "5s"
    },
    "mappings": {
      "dynamic": true,
      "properties": {
        "@timestamp": {"type": "date"},
        "level": {"type": "keyword"},
        "message": {"type": "text"},
        "shop_id": {"type": "integer"},
        "request_id": {"type": "keyword"},
        "http": {
          "properties": {
            "method": {"type": "keyword"},
            "status_code": {"type": "integer"}
          }
        }
      }
    }
  }
}

Deux améliorations simples, souvent rentables en prod (sans complexifier à outrance) :

  • Geler les champs “pivot” en keyword (IDs, request_id, channel, env) pour garantir filtres et agrégations rapides.
  • Limiter l’explosion de champs via dynamic_templates : par exemple forcer tout ce qui ressemble à *_id en keyword, et empêcher des sous-objets “context” de générer 5000 champs imprévus.

Enfin, gardez une règle d’or côté logs e‑commerce : si un champ est utile en debug mais pas en analyse (payload complet, HTML, réponse API), stockez-le ailleurs (ou tronquez-le). Mettre “tout” dans OpenSearch est tentant, mais la facture (stockage + heap + segments + requêtes lentes) arrive toujours.

Ingestion vers OVHcloud Managed OpenSearch : Bulk API, backpressure et transport “propre”

Ingestion = là où les implémentations “vite fait” meurent. Envoyer des requêtes index synchrones depuis PHP dans le flux HTTP est une erreur de prod : latence ajoutée, timeout, et amplification lors d’un incident (OpenSearch lent ⇒ votre front s’écroule). La règle simple : ingestion asynchrone, via un agent (Fluent Bit/Filebeat/Vector) ou via un bus (RabbitMQ/Kafka) si vous avez déjà l’infra.

Pour des serveurs Nginx + PHP‑FPM (cf. Serveur dédié PrestaShop : config Nginx PHP-FPM MariaDB Redis), un pattern robuste est :

1) Nginx écrit des access logs JSON (ou au moins un format stable).
2) Fluent Bit lit les fichiers, parse, enrichit (hostname, env, datacenter).
3) Fluent Bit envoie en Bulk vers OpenSearch avec retry + file buffer.

La Bulk API n’est pas un détail : elle amortit le coût réseau et limite la pression sur le cluster. Un point concret utile en exploitation : en Bulk, une réponse HTTP 200 peut contenir des erreurs partielles (certains items rejetés). Votre agent/worker doit donc vérifier le champ errors et compter les status par item, sinon vous perdez des événements sans le voir.

Exemple (format Bulk) : une ligne d’action + une ligne de document, répétées :

{ "index": { "_index": "logs-app-2026.08.12" } }
{ "@timestamp": "2026-08-12T10:15:00Z", "level": "error", "request_id": "req_123", "message": "Checkout timeout", "duration_ms": 120000 }

Les paramètres à régler en priorité sont la taille de lot (ex. 2–10 MB par batch, à benchmarker), la politique de retry, et un buffer disque pour absorber les coupures. Si vous ne mettez pas de backpressure, un pic de 5xx côté web peut générer un pic de logs qui finit par DoS votre cluster.

Mini-scénario réaliste (et fréquent) : un module de paiement commence à time‑out, vos pages checkout produisent 10× plus d’erreurs, et l’agent de collecte tente d’expédier plus vite… alors que le cluster ralentit (merges, heap). Sans limitation, vous créez une boucle : incident applicatif ⇒ avalanche de logs ⇒ incident observabilité ⇒ plus de diagnostic. Une “bonne” ingestion n’est pas celle qui envoie le plus vite, c’est celle qui se stabilise sous contrainte.

Si vous partez sur OpenTelemetry (logs/traces/metrics unifiés), gardez en tête le scope : l’objectif est de générer, collecter et exporter des données de télémétrie pour analyser performance et comportement (OpenTelemetry − docs). En e‑commerce, l’intérêt réel est la corrélation trace ↔ log ↔ métrique (un checkout lent, la requête MySQL lente, et le 504 au load balancer). Si vous avez déjà Prometheus/Netdata, vous pouvez avancer par étapes (logs d’abord, traces ensuite), sans tout “ré‑instrumenter” d’un coup.

Recherche applicative : utiliser OpenSearch sans transformer PrestaShop en usine à gaz

OpenSearch pour la recherche interne n’est pas systématiquement le bon choix (Meilisearch/Algolia peuvent être plus simples), mais il devient pertinent dès que vous cumulez : multi‑langue, synonymes, scoring métier, facettes, et besoin d’expliquer les résultats. Pour cadrer le sujet côté PrestaShop, les articles suivants posent bien les contraintes e‑commerce (tolérance aux fautes, tri commercial, analytics) : Recherche interne PrestaShop : live search, tolérance fautes et tri commercial et Recherche interne PrestaShop : analytics RGPD et optimisation du moteur.

Le point dur n’est pas l’API, c’est l’analyse (analyzers) : standard, asciifolding, stopwords, stemming, edge n‑grams pour l’autocomplete, et surtout la distinction text (full‑text) vs keyword (filtrage/agrégations). Typiquement : name en text + sous‑champ name.keyword, brand en keyword, categories en keyword, price en scaled_float, attributes en nested si vous voulez des facettes propres. Sans nested, vous obtenez des agrégations incohérentes dès que vous avez des couples (attribut, valeur).

Un détail souvent sous-estimé en e‑commerce francophone : le multi‑langue n’est pas un simple champ. Deux approches propres :

  • index unique avec champs par langue (ex. name.fr, name.en) + requêtes qui ciblent la langue courante ;
  • index par langue si vos règles d’analyse et vos synonymes divergent fortement.

La première approche est généralement plus simple pour PrestaShop multi‑boutiques (et limite le nombre d’index), mais la seconde peut être plus propre si vous avez des dictionnaires et scoring très spécifiques.

L’intégration PrestaShop doit rester maîtrisée : vous indexez via hooks (création/modif produit, stock, prix), vous poussez dans une queue, et vous avez un worker qui fait le bulk. Ne faites pas l’indexation en front, et ne déclenchez pas une réindexation globale sur un simple toggle. Pour comprendre les points d’entrée côté core, l’article Hooks PrestaShop : comprendre les hooks dynamiques et les regex est utile.

Un pattern “propre” (qui évite l’usine à gaz) est de séparer clairement :

  • source of truth (MySQL/MariaDB) : prix, stock, règles panier, déclinaisons… ;
  • document indexé (OpenSearch) : ce qui sert à retrouver et classer les produits (texte, facettes, signaux de popularité, disponibilité simplifiée).

Exemple de requête “search + filtres” (simplifiée) :

POST products/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "baskets cuir noir",
            "fields": ["name^3", "description", "brand^2"],
            "type": "best_fields",
            "fuzziness": "AUTO"
          }
        }
      ],
      "filter": [
        {"term": {"shop_id": 1}},
        {"term": {"in_stock": true}},
        {"range": {"price": {"gte": 50, "lte": 200}}}
      ]
    }
  },
  "aggs": {
    "brands": {"terms": {"field": "brand.keyword", "size": 20}}
  }
}

Astuce “commerce” utile quand vous commencez à tuner la pertinence : gardez le full‑text pour la candidate generation (retrouver), puis utilisez un second étage pour re-ranker (classer) : boost sur la dispo, la marge, la nouveauté, le taux de conversion (si vous l’avez), ou une règle “push” temporaire (campagne). Le moteur peut le faire, mais l’objectif reste d’éviter un système opaque : chaque boost doit être traçable et réversible.

Sécurité, multi-tenant et RGPD : OpenSearch est un outil, pas une garantie

Mettre vos logs dans un moteur de recherche impose une hygiène de sécurité plus élevée que “un fichier sur disque”. D’abord parce que c’est centralisé, ensuite parce que les dashboards deviennent un point d’accès aux données sensibles. Le minimum : TLS, comptes séparés, droits par rôle, et séparation d’index (par env, par boutique, par périmètre). Si votre cluster expose des APIs en public, traitez-le comme une API critique : rotation de secrets, limitation IP, et audit.

Un bon rappel (très opérationnel) sur ce qu’il faut éviter de journaliser, comment gérer les niveaux de logs et la sensibilité, se trouve dans l’OWASP Logging Cheat Sheet : OWASP Logging Cheat Sheet. C’est particulièrement utile pour cadrer les erreurs fréquentes en e‑commerce : tokens, identifiants, payloads de paiement, headers complets, etc.

Le multi‑tenant se gère rarement “au feeling”. Une approche simple et efficace :

  • préfixe d’index par env + shop_id (ex. logs-app-prod-shop1-*) ;
  • rôles limités à des patterns d’index ;
  • dashboards avec permissions minimales.

Vous évitez ainsi le piège “un compte read‑only qui lit tout” (et finit dumpé par un prestataire). Les principes de durcissement évoqués dans PrestaShop : sécuriser APIs et modules avec SBOM, WAF et CI/CD s’appliquent très bien ici, même si OpenSearch n’est pas “dans” PrestaShop.

RGPD : ne loggez pas de PII inutile. Les logs applicatifs ont tendance à capturer des emails, adresses, tokens, payloads de paiement, etc. Si vous avez besoin de corrélation, loggez des identifiants internes (IDs) et gardez la PII dans votre base principale. Ajoutez des pipelines d’ingest pour masquer/normaliser certains champs (ex. hashing d’email) et utilisez la rétention (ISM) pour supprimer automatiquement. À défaut, vous créez un “data lake de production” non maîtrisé — et ça finit toujours en incident.

Un point très concret à valider dès le départ : qui peut accéder aux dashboards (support N1, dev, prestataire, agence), et depuis où (VPN, bastion, IP fixes). Un OpenSearch “managé” est plus simple à opérer, mais il est aussi plus simple à exposer “par facilité” — et c’est là que les mauvaises habitudes prennent.

Exploitation : ISM, snapshots, tuning des shards et monitoring du cluster

Le tuning OpenSearch se résume souvent à 4 leviers qui valent plus que 50 micro‑optimisations : (1) taille des shards, (2) nombre de replicas, (3) refresh_interval, (4) politique de rétention/rollover. En logs, un shard trop petit explose le nombre de shards (overhead mémoire), un shard trop gros ralentit les recoveries. Dans la plupart des contextes e‑commerce, viser des shards de l’ordre de 10 à 50 Go est une base réaliste, mais ça se valide par benchmark (débit d’ingestion, latence de requête, temps de recovery).

Pour rendre ce “10–50 Go” actionnable, voici une grille de départ (à adapter à votre volumétrie et à vos nœuds) :

Usage Objectif principal Taille shard cible (départ) refresh_interval (départ) Remarques
Logs applicatifs ingestion stable + diagnostic 10–30 Go 5–15 s privilégier rollover (âge/taille) + rétention courte
Logs d’accès (Nginx) volumétrie + agrégations 20–50 Go 10–30 s champs stables, attention cardinalité (URL, UA)
Index produits latence de recherche 5–20 Go 1–5 s analyzers + facettes, mises à jour par bulk
Analytics (événements) agrégations 10–40 Go 5–30 s simplifier les champs, éviter text inutile

L’Index State Management (ISM) est l’outil opérationnel qui évite de “gérer à la main” la rétention. Vous définissez des états (hot → warm → delete), un rollover sur taille/âge, puis suppression. L’enjeu côté e‑commerce est rarement “garder 3 ans de logs” : c’est plutôt de garder assez pour diagnostiquer, sans transformer OpenSearch en archive géante coûteuse et lente.

Les snapshots (sauvegardes) doivent être testés en restauration, pas seulement “activés”. Le piège typique : découvrir lors d’un incident que vous avez des snapshots… mais pas de procédure (ni de droits) pour restaurer sur un cluster neuf. Même si vous ne restaurez jamais en prod, faites au moins un exercice “table‑top” : où sont stockés les snapshots, qui a les droits, combien de temps pour restaurer 1 jour de logs, et quel RPO/RTO réaliste.

Le monitoring doit couvrir le cluster et les agents de collecte. Sur le cluster : heap JVM, latence GC, queue d’indexing, taux de refresh/merge, I/O disque, search_throttled, et erreurs 429/503. Côté collecte : backlog de fichiers, retry, drops, taille buffer. Si vous avez déjà une stack métriques, exploitez-la : Prometheus : configuration des alertes, métriques et requêtes PromQL et Netdata : activer et configurer les collectors pour monitoring temps réel donnent une base solide pour remonter des signaux exploitables (pas juste des dashboards “jolis”).

Checklist de prod (orientée dev/ops)

  • Définir un schéma de logs JSON stable + request_id (sinon, pas de corrélation).
  • Poser des index templates (types + champs critiques en keyword/text).
  • Ingestion asynchrone (agent + Bulk), avec backpressure et buffer disque.
  • ISM : rollover + rétention, testée (âge/volume réalistes).
  • Sécurité : rôles par patterns d’index, secrets dédiés, rotation, accès réseau maîtrisé.
  • Alerting : ingestion en erreur, 429/503, heap > seuil, disque > seuil, backlog collecteur.

Si votre objectif initial est “juste” de remplacer un vieux Elasticsearch installé pour une app tierce, vérifiez aussi les dépendances. Un exemple courant dans l’écosystème e‑commerce est l’outillage support qui “demande Elasticsearch” (et où OpenSearch peut être une alternative partielle) : LiveAgent : prérequis techniques PHP 8, MariaDB, Elasticsearch, mod_rewrite. Ne supposez pas la compatibilité API à 100 % : testez vos clients, vos requêtes et vos plugins avant de basculer en prod.


À lire aussi