{"id":69568,"date":"2020-02-20T15:24:23","date_gmt":"2020-02-20T12:24:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/google-cloud-spanner-horoshij-plohoj-zloj"},"modified":"2020-03-03T16:14:50","modified_gmt":"2020-03-03T13:14:50","slug":"google-cloud-spanner-horoshij-plohoj-zloj","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","title":{"rendered":"Google Cloud Spanner : le bon, le mauvais, le moche","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Bonjour, amis de Habr. Comme d'habitude, nous continuons \u00e0 partager des contenus int\u00e9ressants en vue du lancement de nouveaux cours. Aujourd'hui, sp\u00e9cialement pour vous, nous avons traduit un article sur Google Cloud Spanner, co\u00efncidant avec le lancement du cours <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">\u00abAWS pour les d\u00e9veloppeurs\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/b27b8a09543d10b078480c317553ca46.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Publi\u00e9 \u00e0 l'origine sur <noindex><a rel=\"nofollow\" href=\"https:\/\/www.lightspeedhq.com\/blog\/\">le blog Lightspeed HQ<\/a><\/noindex>.<\/i><\/p>\n<p>En tant qu'entreprise qui propose de nombreuses solutions POS cloud pour les commer\u00e7ants, les restaurateurs et les vendeurs en ligne dans le monde entier, Lightspeed utilise plusieurs types de plateformes de bases de donn\u00e9es pour de nombreux cas d'utilisation transactionnels, analytiques et de recherche. Chacune de ces plateformes de bases de donn\u00e9es a ses forces et ses faiblesses. Ainsi, lorsque Google a pr\u00e9sent\u00e9 Cloud Spanner sur le march\u00e9 \u2014 avec des fonctionnalit\u00e9s prometteuses, sans pr\u00e9c\u00e9dent dans le monde des bases de donn\u00e9es relationnelles, telles que la scalabilit\u00e9 horizontale quasi illimit\u00e9e et un accord de niveau de service (SLA) de 99,999 % \u2014 nous n'avons pas pu r\u00e9sister \u00e0 la tentation de l'essayer !<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPour fournir un aper\u00e7u complet de notre exp\u00e9rience avec Cloud Spanner, ainsi que des crit\u00e8res d'\u00e9valuation que nous avons utilis\u00e9s, nous aborderons les sujets suivants :<\/p>\n<ol>\n<li>Nos crit\u00e8res d'\u00e9valuation<\/li>\n<li>Cloud Spanner en quelques mots<\/li>\n<li>Notre \u00e9valuation<\/li>\n<li>Nos conclusions<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/29ed599362fb189283faa9215c18297a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>1. Nos crit\u00e8res d'\u00e9valuation<\/h2>\n<p>\nAvant d'approfondir les fonctionnalit\u00e9s de Cloud Spanner, ses similitudes et diff\u00e9rences avec d'autres solutions sur le march\u00e9, discutons d'abord des principaux cas d'utilisation que nous avions en t\u00eate en consid\u00e9rant o\u00f9 d\u00e9ployer Cloud Spanner dans notre infrastructure :<\/p>\n<ul>\n<li>Comme un remplacement (pr\u00e9valent) de la solution de base de donn\u00e9es SQL traditionnelle<\/li>\n<li>En tant que solution OLTP avec prise en charge de l'OLAP<\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Remarque :<\/b> Pour simplifier et faciliter la comparaison, cet article compare Cloud Spanner avec les options MySQL des familles de solutions GCP Cloud SQL et Amazon AWS RDS.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h4>Utilisation de Cloud Spanner comme remplacement de la solution de base de donn\u00e9es SQL traditionnelle<\/h4>\n<p>\nDans un environnement <i>de bases de donn\u00e9es <\/i>traditionnelles, lorsque le temps de r\u00e9ponse des requ\u00eates \u00e0 la base de donn\u00e9es approche ou d\u00e9passe les seuils pr\u00e9d\u00e9finis des applications (principalement en raison de l'augmentation du nombre d'utilisateurs et\/ou de requ\u00eates), plusieurs m\u00e9thodes existent pour r\u00e9duire le temps de r\u00e9ponse \u00e0 des niveaux acceptables. Cependant, la plupart de ces solutions n\u00e9cessitent une intervention manuelle.<\/p>\n<p>Par exemple, la premi\u00e8re \u00e9tape \u00e0 suivre consiste \u00e0 examiner les diff\u00e9rents param\u00e8tres de la base de donn\u00e9es li\u00e9s \u00e0 la performance et \u00e0 les configurer de mani\u00e8re \u00e0 ce qu'ils correspondent le mieux aux mod\u00e8les d'utilisation des applications. Si cela s'av\u00e8re insuffisant, il est possible de choisir un dimensionnement vertical ou horizontal de la base de donn\u00e9es.<\/p>\n<p>Le dimensionnement vertical d'une application implique la mise \u00e0 niveau de l'instance du serveur, g\u00e9n\u00e9ralement en ajoutant plus de processeurs\/noyaux, plus de m\u00e9moire RAM, un stockage plus rapide, etc. L'ajout de ressources mat\u00e9rielles suppl\u00e9mentaires entra\u00eene une augmentation des performances de la base de donn\u00e9es, mesur\u00e9e principalement en transactions par seconde et en latence des transactions pour les syst\u00e8mes OLTP. Les syst\u00e8mes de bases de donn\u00e9es relationnelles (qui utilisent une approche multithread\u00e9e), tels que MySQL, se dimensionnent bien verticalement.<\/p>\n<p>Cette approche pr\u00e9sente plusieurs inconv\u00e9nients, le plus \u00e9vident \u00e9tant la taille maximale du serveur disponible sur le march\u00e9. Une fois que la limite de la plus grande instance de serveur est atteinte, il ne reste qu'une seule option : le dimensionnement horizontal.<\/p>\n<p>Le dimensionnement horizontal est une approche o\u00f9 l'on ajoute davantage de serveurs au cluster, afin d'augmenter id\u00e9alement les performances de mani\u00e8re lin\u00e9aire avec l'ajout de serveurs. La plupart des <i>de bases de donn\u00e9es <\/i>syst\u00e8mes de bases de donn\u00e9es se dimensionnent mal horizontalement ou ne se dimensionnent pas du tout. Par exemple, MySQL peut se dimensionner horizontalement pour les op\u00e9rations de lecture en ajoutant des lecteurs esclaves, mais ne peut pas se dimensionner horizontalement pour les op\u00e9rations d'\u00e9criture.<\/p>\n<p>D'un autre c\u00f4t\u00e9, en raison de sa nature, Cloud Spanner peut facilement se dimensionner horizontalement avec un minimum d'intervention.<\/p>\n<p>Base de donn\u00e9es compl\u00e8te<i> DBaaS<\/i> doit \u00eatre \u00e9valu\u00e9e sous diff\u00e9rents angles. Comme base, nous avons choisi la base de donn\u00e9es cloud la plus populaire \u2013 pour Google, GCP Cloud SQL et pour Amazon, AWS RDS. Dans notre \u00e9valuation, nous nous sommes concentr\u00e9s sur les cat\u00e9gories suivantes :<\/p>\n<ul>\n<li>Comparaison de fonctionnalit\u00e9s : \u00e9tendue SQL, DDL, DML ; biblioth\u00e8ques de connexion\/connecteurs, support des transactions, etc.<\/li>\n<li>Support de d\u00e9veloppement : facilit\u00e9 de d\u00e9veloppement et de test.<\/li>\n<li>Support de l'administration : gestion des instances - par exemple, mont\u00e9e\/descente en charge et mise \u00e0 niveau des instances ; SLA, sauvegarde et restauration ; s\u00e9curit\u00e9\/contr\u00f4le d'acc\u00e8s.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Utilisation de Cloud Spanner comme solution OLTP avec support OLAP<\/h4>\n<p>\nBien que Google ne d\u00e9clare pas explicitement que Cloud Spanner est destin\u00e9 au traitement analytique, il partage certains attributs avec d'autres moteurs comme Apache Impala &amp; Kudu et YugaByte, con\u00e7us pour des charges de travail OLAP.<\/p>\n<p>M\u00eame s'il n'y avait qu'une faible probabilit\u00e9 que Cloud Spanner inclue un moteur HTAP (traitement hybride transactionnel\/analytique) \u00e9volutif horizontalement coh\u00e9rent avec un ensemble de fonctionnalit\u00e9s OLAP (plus ou moins) utilisable, nous pensons que cela m\u00e9riterait notre attention.<\/p>\n<p>Cela dit, nous avons examin\u00e9 les cat\u00e9gories suivantes :<\/p>\n<ul>\n<li>Chargement des donn\u00e9es, index et support du partitionnement<\/li>\n<li>Performance des requ\u00eates et DML<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Cloud Spanner en bref<\/h2>\n<p>\nGoogle Spanner est un syst\u00e8me de gestion de bases de donn\u00e9es relationnelles (SGBDR) en cluster, utilis\u00e9 par Google pour plusieurs de ses propres services. Google l'a rendu disponible au public pour les utilisateurs de Google Cloud Platform d\u00e9but 2017.<\/p>\n<p>Voici quelques-uns des attributs de Cloud Spanner :<\/p>\n<ul>\n<li>Cluster SGBDR hautement coh\u00e9rent et \u00e9volutif : utilise la synchronisation mat\u00e9rielle du temps pour garantir la coh\u00e9rence des donn\u00e9es.<\/li>\n<li>Support des transactions inter-table : les transactions peuvent couvrir plusieurs tables - pas n\u00e9cessairement limit\u00e9es \u00e0 une seule table (contrairement \u00e0 Apache HBase ou Apache Kudu).<\/li>\n<li>Tables bas\u00e9es sur la cl\u00e9 primaire : toutes les tables doivent avoir une cl\u00e9 primaire d\u00e9clar\u00e9e (KP), qui peut \u00eatre compos\u00e9e de plusieurs colonnes de la table. Les donn\u00e9es des tables sont stock\u00e9es dans l'ordre de la KP, ce qui les rend tr\u00e8s efficaces et rapides \u00e0 rechercher par KP. Comme d'autres syst\u00e8mes bas\u00e9s sur la KP, l'impl\u00e9mentation doit \u00eatre mod\u00e9lis\u00e9e en tenant compte des cas d'utilisation pr\u00e9alablement r\u00e9fl\u00e9chis pour atteindre <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/schema-and-data-model\">la meilleure performance<\/a><\/noindex>.<\/li>\n<li>Tables altern\u00e9es : les tables peuvent avoir des d\u00e9pendances physiques entre elles. Les lignes de la table enfant peuvent correspondre aux lignes de la table parent. Cette approche acc\u00e9l\u00e8re la recherche de relations qui peuvent \u00eatre d\u00e9finies lors de la mod\u00e9lisation des donn\u00e9es, par exemple lors de l'h\u00e9bergement commun des clients et de leurs factures.<\/li>\n<li>Indexes : Cloud Spanner prend en charge les index secondaires. Un index se compose de colonnes index\u00e9es et de toutes les colonnes de la cl\u00e9 primaire. Si souhait\u00e9, l'index peut \u00e9galement contenir d'autres colonnes non index\u00e9es. Un index peut \u00eatre entrelac\u00e9 avec la table parent pour acc\u00e9l\u00e9rer les requ\u00eates. Plusieurs restrictions s'appliquent aux index, telles que le nombre maximum de colonnes suppl\u00e9mentaires pouvant \u00eatre stock\u00e9es dans l'index. De plus, les requ\u00eates \u00e0 travers les index peuvent \u00eatre moins directes que dans d'autres SGBD.<\/li>\n<\/ul>\n<p>\n<i>\u00ab Cloud Spanner choisit automatiquement l'index seulement dans de rares cas. En particulier, Cloud Spanner ne choisit pas automatiquement un index secondaire si la requ\u00eate demande des colonnes qui ne sont pas conserv\u00e9es dans <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/docs\/secondary-indexes\">l'index <\/a><\/noindex>\u00bb.<\/i><\/p>\n<ul>\n<li>Accord de niveau de service (SLA) : d\u00e9ploiement dans une seule r\u00e9gion avec un SLA de 99,99 % ; d\u00e9ploiements multir\u00e9gionaux avec un SLA de 99,999 %. Bien que l'accord de niveau de service soit simplement un accord et non une garantie, je crois que les employ\u00e9s de Google disposent de donn\u00e9es suffisamment pr\u00e9cises pour faire une telle affirmation. (Pour r\u00e9f\u00e9rence, 99,999 % \u00e9quivaut \u00e0 26,3 secondes d'indisponibilit\u00e9 du service par mois.)<\/li>\n<li>En savoir plus : <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/\">https:\/\/cloud.google.com\/spanner\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<blockquote><p><i><b>Remarque :<\/b> Le projet Apache Tephra ajoute un support avanc\u00e9 des transactions dans Apache HBase (qui est \u00e9galement maintenant impl\u00e9ment\u00e9 dans Apache Phoenix en version b\u00eata).<\/i><\/p><\/blockquote>\n<p><\/p>\n<h2>3. Notre \u00e9valuation<\/h2>\n<p>\nAinsi, nous avons tous lu les d\u00e9clarations de Google sur les avantages de Cloud Spanner \u2014 une mont\u00e9e en charge horizontale pratiquement illimit\u00e9e tout en conservant une grande coh\u00e9rence et des SLA tr\u00e8s \u00e9lev\u00e9s. Bien que ces exigences soient en tout cas extr\u00eamement difficiles \u00e0 atteindre, notre objectif n'\u00e9tait pas de les contredire. Concentrons-nous plut\u00f4t sur d'autres \u00e9l\u00e9ments qui pr\u00e9occupent la plupart des utilisateurs de bases de donn\u00e9es : l'int\u00e9grit\u00e9 et la facilit\u00e9 d'utilisation.<\/p>\n<h4>Nous avons \u00e9valu\u00e9 Cloud Spanner comme un remplacement de Sharded MySQL.<\/h4>\n<p>\nGoogle Cloud SQL et Amazon AWS RDS, deux des bases de donn\u00e9es OLTP les plus populaires sur le march\u00e9 du cloud, offrent un large \u00e9ventail de fonctionnalit\u00e9s. Cependant, pour \u00e9voluer au-del\u00e0 de la taille d'un seul n\u0153ud, vous devez effectuer un partitionnement des applications. Cette approche ajoute une complexit\u00e9 suppl\u00e9mentaire tant pour les applications que pour l'administration. Nous avons examin\u00e9 comment Spanner s'int\u00e8gre dans le sc\u00e9nario de regroupement de plusieurs segments en une seule instance et quelles fonctionnalit\u00e9s (le cas \u00e9ch\u00e9ant) pourraient devoir \u00eatre sacrifi\u00e9es.<\/p>\n<h4>Support SQL, DML et DDL, ainsi que connecteur et biblioth\u00e8ques ?<\/h4>\n<p>\nTout d'abord, lorsque vous d\u00e9marrez avec n'importe quelle base de donn\u00e9es, vous devez cr\u00e9er un mod\u00e8le de donn\u00e9es. Si vous pensez que vous pouvez connecter JDBC Spanner \u00e0 votre outil SQL pr\u00e9f\u00e9r\u00e9, vous d\u00e9couvrirez que vous pouvez interroger vos donn\u00e9es avec, mais que vous ne pouvez pas l'utiliser pour cr\u00e9er ou modifier des tables (DDL) ou pour toute op\u00e9ration d'insertion\/mise \u00e0 jour\/suppression (DML). Le JDBC officiel de Google ne prend en charge ni l'un ni l'autre.<\/p>\n<blockquote><p><i>\u00ab Actuellement, les pilotes ne prennent pas en charge les op\u00e9rateurs DML ou DDL \u00bb.<\/i><br \/>\nDocumentation Spanner<\/p><\/blockquote>\n<p>\nAvec la console GCP, la situation n'est pas meilleure \u2014 vous ne pouvez envoyer que des requ\u00eates SELECT. Heureusement, il existe un pilote JDBC communautaire qui prend en charge DML et DDL, y compris les transactions. <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/olavloite\/spanner-jdbc\">github.com\/olavloite\/spanner-jdbc<\/a><\/noindex>. Bien que ce pilote soit extr\u00eamement utile, l'absence d'un pilote JDBC propre \u00e0 Google est surprenante. Heureusement, Google propose un large soutien pour les biblioth\u00e8ques clientes (bas\u00e9es sur gRPC) : C#, Go, Java, node.js, PHP, Python et Ruby.<\/p>\n<p>L'utilisation presque obligatoire des API personnalis\u00e9es de Cloud Spanner (en raison de l'absence de DDL et DML dans JDBC) entra\u00eene certaines limitations pour les zones de code associ\u00e9es, telles que les pools de connexions ou les frameworks de liaison de base de donn\u00e9es (par exemple, Spring MVC). En g\u00e9n\u00e9ral, avec JDBC, vous pouvez choisir librement votre pool de connexions pr\u00e9f\u00e9r\u00e9 (par exemple, HikariCP, DBCP, C3PO, etc.), qui est \u00e9prouv\u00e9 et fonctionne bien. Dans le cas des API personnalis\u00e9es Spanner, nous devons nous appuyer sur les frameworks\/pools de liaison\/sessions que nous avons cr\u00e9\u00e9s nous-m\u00eames.<\/p>\n<p>Une structure orient\u00e9e vers la cl\u00e9 primaire (PK) permet \u00e0 Cloud Spanner d'acc\u00e9der tr\u00e8s rapidement aux donn\u00e9es via la PK, mais entra\u00eene \u00e9galement certains probl\u00e8mes de requ\u00eates.<\/p>\n<ul>\n<li>Vous ne pouvez pas mettre \u00e0 jour la valeur de la cl\u00e9 primaire ; vous devez d'abord supprimer l'enregistrement avec la cl\u00e9 primaire d'origine et le r\u00e9ins\u00e9rer avec la nouvelle valeur. (Cela ressemble \u00e0 d'autres bases de donn\u00e9es orient\u00e9es sur les cl\u00e9s primaires \/ m\u00e9canismes de stockage.)<\/li>\n<li>Tout op\u00e9rateur UPDATE et DELETE doit sp\u00e9cifier la cl\u00e9 primaire dans la clause WHERE, donc il ne peut pas y avoir d'op\u00e9rateurs DELETE vides - il doit toujours y avoir une sous-requ\u00eate, par exemple : UPDATE xxx WHERE id IN (SELECT id FROM table1)<\/li>\n<li>Absence d'une option d'auto-incr\u00e9mentation ou de quelque chose de similaire qui d\u00e9finit une s\u00e9quence pour le champ de la cl\u00e9 primaire. Pour que cela fonctionne, la valeur correspondante doit \u00eatre cr\u00e9\u00e9e du c\u00f4t\u00e9 de l'application.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Index secondaires ?<\/h4>\n<p>\nGoogle Cloud Spanner prend en charge nativement les index secondaires. C'est une fonctionnalit\u00e9 tr\u00e8s appr\u00e9ci\u00e9e qui n'est pas toujours pr\u00e9sente dans d'autres technologies. Apache Kudu ne prend actuellement pas en charge les index secondaires, et Apache HBase ne prend pas en charge les index directement, mais peut les ajouter via Apache Phoenix.<\/p>\n<p>Les index dans Kudu et HBase peuvent \u00eatre mod\u00e9lis\u00e9s comme une table distincte avec une composition diff\u00e9rente des cl\u00e9s primaires, mais l'atomicit\u00e9 des op\u00e9rations effectu\u00e9es sur la table parente et les tables d'index associ\u00e9es doit \u00eatre g\u00e9r\u00e9e au niveau de l'application et n'est pas triviale dans une mise en \u0153uvre correcte.<\/p>\n<p>Comme mentionn\u00e9 dans la revue de Cloud Spanner, ses index peuvent diff\u00e9rer des index MySQL. Il convient donc de faire preuve d'une attention particuli\u00e8re lors de la construction de requ\u00eates et de l'analyse des performances afin de garantir l'utilisation de l'index appropri\u00e9 l\u00e0 o\u00f9 cela est n\u00e9cessaire.<\/p>\n<h4>Vues ?<\/h4>\n<p>\nLes vues sont des objets tr\u00e8s populaires et utiles dans une base de donn\u00e9es. Elles peuvent \u00eatre utiles pour un grand nombre de cas d'utilisation ; mes deux pr\u00e9f\u00e9r\u00e9es sont le niveau d'abstraction logique et le niveau de s\u00e9curit\u00e9. Malheureusement, Cloud Spanner ne prend pas en charge les vues. Cependant, cela ne nous limite que partiellement, car il n'y a pas de d\u00e9tail sur le niveau des colonnes pour les autorisations d'acc\u00e8s, o\u00f9 les vues pourraient \u00eatre une solution acceptable.<\/p>\n<p>Dans la documentation de Cloud Spanner, dans la section qui d\u00e9crit en d\u00e9tail les quotas et les limites (<noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/spanner\/quotas\">spanner\/quotas<\/a><\/noindex>), il y en a une en particulier qui peut poser probl\u00e8me pour certaines applications : Cloud Spanner a par d\u00e9faut une limite de 100 bases de donn\u00e9es par instance. \u00c9videmment, cela peut devenir un v\u00e9ritable obstacle pour une base de donn\u00e9es destin\u00e9e \u00e0 \u00e9voluer au-del\u00e0 de 100 bases de donn\u00e9es. Heureusement, apr\u00e8s avoir discut\u00e9 avec notre repr\u00e9sentant technique de Google, nous avons d\u00e9couvert que cette limite peut \u00eatre augment\u00e9e \u00e0 pratiquement n'importe quelle valeur via le support technique de Google.<\/p>\n<h4>Support pour le d\u00e9veloppement ?<\/h4>\n<p>\nCloud Spanner offre un support assez respectable pour les langages de programmation interagissant avec son API. Les biblioth\u00e8ques officiellement prises en charge couvrent C#, Go, Java, node.js, PHP, Python et Ruby. La documentation est assez d\u00e9taill\u00e9e, mais comme c'est le cas avec d'autres technologies de pointe, la communaut\u00e9 est relativement petite par rapport aux technologies de bases de donn\u00e9es les plus populaires, ce qui peut prolonger le temps n\u00e9cessaire pour r\u00e9soudre des cas d'utilisation ou des probl\u00e8mes moins courants.<\/p>\n<h4>Et qu'en est-il du support pour le d\u00e9veloppement local ?<\/h4>\n<p>\nNous n'avons pas trouv\u00e9 de moyen de cr\u00e9er une instance Cloud Spanner dans un environnement local. Le plus proche que nous avons obtenu est une image Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/cockroachdb\/cockroach\">CockroachDB<\/a><\/noindex>, qui est en principe similaire, mais en pratique tr\u00e8s diff\u00e9rente. Par exemple, CockroachDB peut utiliser PostgreSQL JDBC. \u00c9tant donn\u00e9 que l'environnement de d\u00e9veloppement doit \u00eatre aussi proche que possible de l'environnement de production, Cloud Spanner n'est pas id\u00e9al, car il faut compter sur une instance Spanner compl\u00e8te. Pour \u00e9conomiser des co\u00fbts, vous pouvez opter pour une instance d'une seule r\u00e9gion.<\/p>\n<h4>Support d'administration ?<\/h4>\n<p>\nCr\u00e9er une instance Cloud Spanner est tr\u00e8s simple. Il suffit de choisir entre la cr\u00e9ation d'une instance multi-r\u00e9gionale ou d'une instance d'une seule r\u00e9gion, de sp\u00e9cifier la ou les r\u00e9gions et le nombre de n\u0153uds. En moins d'une minute, l'instance sera lanc\u00e9e et pr\u00eate \u00e0 l'emploi.<\/p>\n<p>Plusieurs m\u00e9triques de base sont directement disponibles sur la page Spanner dans la console Google. Des vues plus d\u00e9taill\u00e9es sont accessibles via Stackdriver, o\u00f9 vous pouvez \u00e9galement d\u00e9finir des seuils pour les m\u00e9triques et des politiques d'alerte.<\/p>\n<h4>Acc\u00e8s aux ressources ?<\/h4>\n<p>\nMySQL offre des configurations de permissions et de r\u00f4les utilisateurs tr\u00e8s d\u00e9taill\u00e9es et \u00e9tendues. Il est facile de g\u00e9rer l'acc\u00e8s \u00e0 une table sp\u00e9cifique, voire \u00e0 un sous-ensemble de ses colonnes. Cloud Spanner utilise l'outil Google Identity &amp; Access Management (IAM), qui permet d'\u00e9tablir des politiques et des permissions \u00e0 un niveau tr\u00e8s \u00e9lev\u00e9. L'option la plus d\u00e9taill\u00e9e est la permission au niveau de la base de donn\u00e9es, qui ne s'int\u00e8gre pas dans la plupart des cas de production. Cette limitation vous oblige \u00e0 ajouter des mesures de s\u00e9curit\u00e9 suppl\u00e9mentaires dans votre code, votre infrastructure, ou les deux, pour pr\u00e9venir l'utilisation non autoris\u00e9e des ressources Spanner.<\/p>\n<h4>Des sauvegardes ?<\/h4>\n<p>\nPour parler simplement, il n'existe pas de sauvegardes dans Cloud Spanner. Bien que les exigences \u00e9lev\u00e9es du SLA de Google garantissent que vous ne perdrez aucune donn\u00e9e en raison de pannes mat\u00e9rielles ou de bases de donn\u00e9es, cela ne prot\u00e8ge pas contre les erreurs humaines, les d\u00e9fauts d\u2019application, etc. Nous savons tous que la haute disponibilit\u00e9 ne remplace pas une strat\u00e9gie de sauvegarde r\u00e9fl\u00e9chie. Pour l'instant, la seule fa\u00e7on de sauvegarder les donn\u00e9es est de les transf\u00e9rer par flux \u00e0 partir de la base de donn\u00e9es vers un environnement de stockage s\u00e9par\u00e9.<\/p>\n<h4>Performance des requ\u00eates ?<\/h4>\n<p>\nPour charger les donn\u00e9es et tester les requ\u00eates, nous avons utilis\u00e9 Yahoo! Cloud Serving Benchmark. Le tableau ci-dessous pr\u00e9sente la charge de travail B YCSB avec un ratio de lecture de 95 % et d'\u00e9criture de 5 %.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/8fca14875af33c8ed3cd04b602c52b78.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Le test de charge a \u00e9t\u00e9 effectu\u00e9 sur un moteur de calcul (CE) n1-standard-32 (32 vCPU, 120 Go de RAM), et l'instance de test n'a jamais \u00e9t\u00e9 un goulot d'\u00e9tranglement dans les tests.<\/i><br \/>\n<i>** Le nombre maximum de threads dans une instance YCSB est de 400. Il a \u00e9t\u00e9 n\u00e9cessaire de lancer six instances parall\u00e8les des tests YCSB pour obtenir un total de 2400 threads.<\/i><\/p>\n<p>En examinant les r\u00e9sultats des tests, notamment la combinaison de la charge du processeur et du TPS, nous pouvons clairement voir que Cloud Spanner \u00e9volue assez bien. Une forte charge, g\u00e9n\u00e9r\u00e9e par un grand nombre de threads, est compens\u00e9e par un grand nombre de n\u0153uds dans le cluster Cloud Spanner. Bien que la latence semble assez \u00e9lev\u00e9e, surtout avec 2400 threads, des tests suppl\u00e9mentaires avec 6 instances plus petites du moteur de calcul pourraient \u00eatre n\u00e9cessaires pour obtenir des chiffres plus pr\u00e9cis. Chaque instance ex\u00e9cutera un test YCSB au lieu d'une seule grande instance CE avec 6 tests parall\u00e8les. Cela permettra de mieux diff\u00e9rencier la latence des requ\u00eates Cloud Spanner et la latence ajout\u00e9e par la connexion r\u00e9seau entre Cloud Spanner et l'instance CE sur laquelle le test est effectu\u00e9.<\/p>\n<h3>Comment Cloud Spanner se comporte-t-il en tant qu'OLAP ?<\/h3>\n<p><\/p>\n<h4>Partitionnement ?<\/h4>\n<p>\nLa division des donn\u00e9es en segments physiquement et\/ou logiquement ind\u00e9pendants, appel\u00e9s partitions, est un concept tr\u00e8s populaire dans la plupart des m\u00e9canismes OLAP. Les partitions peuvent am\u00e9liorer consid\u00e9rablement les performances des requ\u00eates et la maintenabilit\u00e9 de la base de donn\u00e9es. Une exploration plus approfondie des partitions pourrait donner lieu \u00e0 un article (ou plusieurs), donc mentionnons simplement l'importance d'avoir un sch\u00e9ma de partitionnement et de sous-partitionnement. La capacit\u00e9 \u00e0 sectionner les donn\u00e9es en partitions et m\u00eame plus loin en sous-partitions est cruciale pour les performances des requ\u00eates analytiques.<\/p>\n<p>Cloud Spanner ne prend pas en charge les partitions en tant que telles. Il divise les donn\u00e9es en ce qu'on appelle des <i>splits<\/i>- bas\u00e9s sur des plages de cl\u00e9s primaires. La division est effectu\u00e9e automatiquement pour \u00e9quilibrer la charge dans le cluster Cloud Spanner. Une fonctionnalit\u00e9 tr\u00e8s pratique de Cloud Spanner est la r\u00e9partition de la charge de la table parent (table qui n\u2019est pas interleaved avec une autre). Spanner d\u00e9termine automatiquement si <i>splits <\/i>des donn\u00e9es sont plus fr\u00e9quemment lues que celles d'autres <i>splits<\/i>- et peut d\u00e9cider de proc\u00e9der \u00e0 un partage suppl\u00e9mentaire. Ainsi, plus de n\u0153uds peuvent \u00eatre impliqu\u00e9s dans la requ\u00eate, ce qui augmente \u00e9galement efficacement la capacit\u00e9.<\/p>\n<h4>Chargement des donn\u00e9es ?<\/h4>\n<p>\nLa m\u00e9thode Cloud Spanner pour les gros volumes de donn\u00e9es est similaire \u00e0 un chargement normal. Pour atteindre des performances optimales, vous devez suivre certaines recommandations, notamment :<\/p>\n<ul>\n<li>Triez vos donn\u00e9es par cl\u00e9 primaire.<\/li>\n<li>Divisez-les en 10*<i>n\u0153uds<\/i> sections s\u00e9par\u00e9es.<\/li>\n<li>Cr\u00e9ez un ensemble de t\u00e2ches de travail qui chargent les donn\u00e9es en parall\u00e8le.<\/li>\n<\/ul>\n<p>\nAvec ce type de chargement des donn\u00e9es, tous les n\u0153uds de Cloud Spanner sont utilis\u00e9s.<\/p>\n<p>Nous avons utilis\u00e9 la charge de travail A YCSB pour g\u00e9n\u00e9rer un ensemble de donn\u00e9es de 10 millions de lignes.<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/89b9c0353716be2d389b3e8da82781ad.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>* Le test de charge a \u00e9t\u00e9 r\u00e9alis\u00e9 sur le moteur de calcul n1-standard-32 (32 vCPU, 120 Go de RAM), et l'instance de test n'a jamais \u00e9t\u00e9 un goulot d'\u00e9tranglement lors des tests.<br \/>\n** Une configuration \u00e0 1 n\u0153ud n'est pas recommand\u00e9e pour les charges de travail en production.<\/i><\/p>\n<p>Comme mentionn\u00e9 ci-dessus, Cloud Spanner g\u00e8re automatiquement les fractionnements en fonction de leur charge, donc les r\u00e9sultats s'am\u00e9liorent apr\u00e8s plusieurs r\u00e9p\u00e9titions cons\u00e9cutives du test. Les r\u00e9sultats pr\u00e9sent\u00e9s ici sont les meilleures performances que nous avons obtenues. En regardant les chiffres ci-dessus, nous pouvons voir comment Cloud Spanner (bien) \u00e9volue avec l'augmentation du nombre de n\u0153uds dans le cluster. Les chiffres qui se d\u00e9marquent repr\u00e9sentent des latences moyennes extr\u00eamement basses, qui contrastent avec les r\u00e9sultats de charges de travail mixtes (95 % pour la lecture et 5 % pour l'\u00e9criture), comme d\u00e9crit dans la section ci-dessus.<\/p>\n<h4>\u00c9voluer ?<\/h4>\n<p>\nAugmenter ou diminuer le nombre de n\u0153uds de Cloud Spanner est une t\u00e2che qui se fait en un clic. Si vous souhaitez charger rapidement des donn\u00e9es, vous pouvez envisager de booster l'instance \u00e0 son maximum (dans notre cas, c'\u00e9tait 25 n\u0153uds dans la r\u00e9gion US-EAST), puis r\u00e9duire le nombre de n\u0153uds adapt\u00e9 \u00e0 votre charge de travail normale, une fois que toutes les donn\u00e9es sont dans la base de donn\u00e9es, en gardant \u00e0 l'esprit la limite de 2 To\/n\u0153ud.<\/p>\n<p>Nous avons \u00e9t\u00e9 rappel\u00e9s de cette limite m\u00eame avec une base de donn\u00e9es beaucoup plus petite. Apr\u00e8s plusieurs ex\u00e9cutions de tests de charge, notre base de donn\u00e9es faisait environ 155 Go, et en r\u00e9duisant \u00e0 une instance \u00e0 1 n\u0153ud, nous avons rencontr\u00e9 l'erreur suivante :<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/4a46c97e7943b5105bf178316dc67433.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons r\u00e9ussi \u00e0 r\u00e9duire la port\u00e9e de 25 \u00e0 2 instances, mais nous sommes rest\u00e9s bloqu\u00e9s sur deux n\u0153uds.<\/p>\n<p>L'augmentation et la r\u00e9duction du nombre de n\u0153uds dans un cluster Cloud Spanner peuvent \u00eatre automatis\u00e9es via l'API REST. Cela peut \u00eatre particuli\u00e8rement utile pour diminuer une charge accrue sur le syst\u00e8me aux heures de pointe.<\/p>\n<h4>Comment se porte les performances des requ\u00eates OLAP ?<\/h4>\n<p>\n\u00c0 l'origine, nous avions pr\u00e9vu de consacrer beaucoup de temps \u00e0 notre \u00e9valuation de Spanner sur cette partie. Apr\u00e8s plusieurs SELECT COUNT, nous avons imm\u00e9diatement compris que le test serait bref et que Spanner NE serait pas adapt\u00e9 comme moteur OLAP. Peu importe le nombre de n\u0153uds dans le cluster, une simple s\u00e9lection du nombre de lignes dans une table de 10M de lignes a pris entre 55 et 60 secondes. De plus, toute requ\u00eate n\u00e9cessitant plus de m\u00e9moire pour stocker des r\u00e9sultats interm\u00e9diaires s'est termin\u00e9e par une erreur OOM.<\/p>\n<p><code>SELECT COUNT(DISTINCT(field0)) FROM usertable; \u2014 (10M de valeurs distinctes) -&gt; SpoolingHashAggregateIterator a manqu\u00e9 de m\u00e9moire lors de la cr\u00e9ation de nouvelles lignes.<\/code><\/p>\n<p>Certaines donn\u00e9es concernant les requ\u00eates TPC-H peuvent \u00eatre trouv\u00e9es dans l'article de Todd Lipkon <noindex><a rel=\"nofollow\" href=\"https:\/\/kudu.apache.org\/2017\/10\/23\/nosql-kudu-spanner-slides.html\">nosql-kudu-spanner-slides.html<\/a><\/noindex>, diapositives 42 et 43. Ces chiffres sont en accord avec nos propres r\u00e9sultats (malheureusement).<\/p>\n<p><img decoding=\"async\" alt=\"Google Cloud Spanner : le bon, le mauvais, le moche\" src=\"\/wp-content\/uploads\/2020\/02\/d070c839bbc62b1ba1bebbaf64127e93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>4. Nos conclusions<\/h4>\n<p>\n\u00c9tant donn\u00e9 l'\u00e9tat actuel des fonctionnalit\u00e9s de Cloud Spanner, il est difficile de l'imaginer comme un simple remplacement d'une solution OLTP existante, surtout lorsque vos besoins d\u00e9passeront ses capacit\u00e9s. Il faudrait d\u00e9penser un temps consid\u00e9rable pour construire une solution en tenant compte des lacunes de Cloud Spanner.<\/p>\n<p>Lorsque nous avons commenc\u00e9 l'\u00e9valuation de Cloud Spanner, nous nous attendions \u00e0 ce que ses fonctionnalit\u00e9s de gestion soient au niveau ou, du moins, pas tr\u00e8s \u00e9loign\u00e9es des autres solutions Google SQL. Mais nous avons \u00e9t\u00e9 surpris par l'absence totale de sauvegardes et le contr\u00f4le d'acc\u00e8s tr\u00e8s limit\u00e9 sur les ressources. Sans parler de l'absence de vues, de l'absence d'un environnement de d\u00e9veloppement local, de s\u00e9quences non prises en charge, de JDBC sans support DML et DDL, etc.<\/p>\n<p>Alors, que faire pour ceux qui doivent mettre \u00e0 l'\u00e9chelle une base de donn\u00e9es transactionnelle ? Il semble qu'il n'y ait pas encore de solution unique sur le march\u00e9 qui convienne \u00e0 tous les cas d'utilisation. Il existe de nombreuses solutions \u00e0 code source ferm\u00e9 et ouvert (certaines d'entre elles sont mentionn\u00e9es dans cet article), chacune ayant ses forces et ses faiblesses, mais aucune d'entre elles n'offre de SaaS avec un SLA de 99,999 % et un haut niveau de coh\u00e9rence. Si un niveau \u00e9lev\u00e9 de SLA est votre objectif principal et que vous n'\u00eates pas enclin \u00e0 cr\u00e9er votre propre solution pour plusieurs environnements cloud, Cloud Spanner pourrait \u00eatre la solution que vous recherchez. Mais vous devez \u00eatre conscient de toutes ses limitations.<\/p>\n<p>Pour \u00eatre juste, il faut noter que Cloud Spanner a \u00e9t\u00e9 rendu accessible au public au printemps 2017, il est donc raisonnable de s'attendre \u00e0 ce que certains de ses d\u00e9fauts actuels puissent \u00e9ventuellement dispara\u00eetre (nous l'esp\u00e9rons), et lorsque cela se produira, cela pourrait changer la donne. Apr\u00e8s tout, Cloud Spanner n'est pas simplement un projet tiers pour Google. Google l'utilise comme base pour d'autres produits Google. Et lorsque Google a r\u00e9cemment remplac\u00e9 Megastore dans Google Cloud Storage par Cloud Spanner, cela a permis \u00e0 Google Cloud Storage d'\u00eatre strictement coh\u00e9rent pour les listes d'objets \u00e0 l'\u00e9chelle mondiale (ce qui n'est toujours pas le cas pour <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">Amazon<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/cloudplatform.googleblog.com\/2018\/02\/how-Google-Cloud-Storage-offers-strongly-consistent-object-listing-thanks-to-Spanner.html\">S3<\/a><\/noindex>).<\/p>\n<p>Donc, il y a toujours de l'espoir... nous esp\u00e9rons.<\/p>\n<p>C'est tout. Comme l'auteur de l'article, nous continuons \u00e9galement \u00e0 esp\u00e9rer, et que pensez-vous \u00e0 ce sujet ? \u00c9crivez vos commentaires.<\/p>\n<p><b>Nous invitons tous les int\u00e9ress\u00e9s \u00e0 visiter notre <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\">webinaire gratuit<\/a><\/noindex> dans le cadre duquel nous expliquerons en d\u00e9tail le cours<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/eoP2\/\"> \u00abAWS pour les d\u00e9veloppeurs\u00bb<\/a><\/noindex> d'OTUS.<\/b><br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/489012\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043c\u044b \u043f\u0440\u0435\u0432\u0435\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043e Google Cloud Spanner, \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0438\u0432 \u0435\u0435 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u0443\u0440\u0441\u0430 \u00abAWS \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\u00bb. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u043b\u043e\u0433\u0435 Lightspeed HQ. \u041a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 POS-\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0440\u0433\u043e\u0432\u0446\u0435\u0432, \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u0440\u043e\u0434\u0430\u0432\u0446\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, Lightspeed \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":69569,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-69568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-20T12:24:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:50+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Google Cloud Spanner : le bon, le mauvais, le laid | ProHoster","description":"Bonjour, habitants de Habr. Nous continuons traditionnellement \u00e0 partager du contenu int\u00e9ressant \u00e0 l'approche du lancement de nouveaux cours.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Google Cloud Spanner: \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043f\u043b\u043e\u0445\u043e\u0439, \u0437\u043b\u043e\u0439 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d\u0435. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/google-cloud-spanner-horoshij-plohoj-zloj","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-20T12:24:23+00:00","article:modified_time":"2020-03-03T13:14:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"69568","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:20:25","updated":"2022-09-30 15:10:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/69568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=69568"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/69568\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/69569"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=69568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=69568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=69568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}