{"id":6644,"date":"2018-12-05T14:53:27","date_gmt":"2018-12-05T13:53:27","guid":{"rendered":"http:\/\/blog.capdata.fr\/?p=6644"},"modified":"2022-11-21T16:50:06","modified_gmt":"2022-11-21T15:50:06","slug":"comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/","title":{"rendered":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644&#038;title=Comparatif%20MySQL%20dans%20le%20PaaS%2C%20%C3%A9pisode%201%20%3A%20Google%20Cloud%20SQL\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Comparatif%20MySQL%20dans%20le%20PaaS%2C%20%C3%A9pisode%201%20%3A%20Google%20Cloud%20SQL&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Je vous propose de d\u00e9couvrir ensemble de quelle mani\u00e8re MySQL est impl\u00e9ment\u00e9 dans le PaaS, chez les 3 principaux fournisseurs de ce type de service : Google, Microsoft et Amazon, au rythme d&#8217;un \u00e9pisode par plateforme. <\/p>\n<p>Dans chaque \u00e9pisode nous passerons en revue les diff\u00e9rentes caract\u00e9ristiques techniques de l&#8217;offre, nous verrons les diff\u00e9rences avec une distribution classique en termes de fonctionnalit\u00e9s, tout \u00e7a avec notre oeil de DBA, en insistant sur la maintenabilit\u00e9 et le diagnostic avant tout. Parce que ne vous y trompez pas, vous aurez toujours des probl\u00e8mes de performance dans le cloud, et il vous faudra toujours des m\u00e9thodes et des outils pour pouvoir les analyser.  <\/p>\n<p>Egalement nous verrons comment il est possible de migrer des bases on-premise vers l&#8217;\u00e9quivalent cloud, en essayant \u00e0 chaque fois de minimiser l&#8217;indisponibilit\u00e9 lors de la bascule. <\/p>\n<p><b>Rappels:<\/b> dans le cas du <i>PaaS<\/i> (<i>Platform as a Service<\/i>), la base de donn\u00e9es est un service h\u00e9berg\u00e9 et accessible \u00e0 distance, pour laquelle l&#8217;infrastructure est manag\u00e9e et donc invisible c\u00f4t\u00e9 utilisateur. A la diff\u00e9rence du <i>IaaS<\/i> (<i>Infrastructure as a Service<\/i>), o\u00f9 l&#8217;infrastructure est visible et accessible \u00e0 l&#8217;utilisateur ( = machines virtuelles). <\/p>\n<p>Dans cette s\u00e9rie, nous ne parlerons que du <i>PaaS<\/i>. L&#8217;int\u00e9r\u00eat principal du <i>PaaS<\/i> sur le <i>IaaS<\/i> est que l&#8217;infrastructure est manag\u00e9e: on ne s&#8217;occupe plus de g\u00e9rer des serveurs, des syst\u00e8mes d&#8217;exploitation, des patches, des sauvegardes, etc&#8230; On se concentre sur le service. <\/p>\n<p>A noter \u00e9galement que le monde du cloud est un monde qui bouge tr\u00e8s vite donc les informations qui sont pr\u00e9sent\u00e9es ici sont susceptibles d&#8217;\u00e9voluer dans le futur. <\/p>\n<h2>Le d\u00e9cor:<\/h2>\n<p>Sur GCP, le d\u00e9coupage des briques de service est le suivant : <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/google-cloud-platform-services.jpg\" alt=\"\" width=\"638\" height=\"399\" class=\"aligncenter size-full wp-image-6649\" \/><\/p>\n<p>&#8211; <b>Compute<\/b> regroupe l&#8217;App Engine (runtimes, ex\u00e9cution serverless), une brique Kubernetes, et le Compute Engine qui h\u00e9berge le IaaS, les machines virtuelles, donc l&#8217;\u00e9quivalent d&#8217;EC2 sur AWS. <\/p>\n<p>&#8211; <b>Big Data<\/b> propose une brique base de donn\u00e9es bas\u00e9e sur un moteur de stockage et d&#8217;interrogation en colonne (BigQuery) et une suite d&#8217;outils orient\u00e9s datawarehouse. <\/p>\n<p>&#8211; <b>Storage<\/b> : il faudra aller chercher nos bases de donn\u00e9es relationnelles au rayon du stockage au milieu des briques NoSQL (BigTable, DataStore, et r\u00e9cemment MemoryStore) et stockage pur type S3 (Cloud Storage), sous la d\u00e9nomination <b>Cloud SQL<\/b>. Derri\u00e8re ce titre se cache en r\u00e9alit\u00e9 deux offres : une sur MySQL, une sur PostgreSQL. <\/p>\n<p>Il existe d&#8217;autres briques techniques comme la partie r\u00e9seau\/VPC, et StackDriver qui propose des outils de logging, m\u00e9trologie et diagnostic, que nous verrons un peu plus loin.<\/p>\n<p>Ces briques sont d\u00e9ployables de mani\u00e8re globale sur une ou plusieurs r\u00e9gions chacune comportant au moins 3 zones distinctes proches g\u00e9ographiquement (datacenters). Actuellement il existe 18 r\u00e9gions op\u00e9rationnelles et 2 r\u00e9gions en cours de d\u00e9ploiement:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/GCP_geo.png\" alt=\"\" width=\"915\" height=\"743\" class=\"aligncenter size-full wp-image-6661\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/GCP_geo.png 915w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/GCP_geo-300x244.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/GCP_geo-768x624.png 768w\" sizes=\"auto, (max-width: 915px) 100vw, 915px\" \/><\/p>\n<p>Chaque r\u00e9gion propose une gamme de plateformes techniques pour l&#8217;ex\u00e9cution des services : types et nombre de CPU, etc&#8230; <\/p>\n<p>Dans l&#8217;exemple de la r\u00e9gion europe-west4 (Pays-Bas), nous avons trois zones -a, -b et -c, dans lesquelles nous pouvons d\u00e9ployer des tiers jusqu&#8217;\u00e0 96vCPUs Skylake ou Broadwell, nous pouvons utiliser l&#8217;option <i><a href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/local-ssd\">Local SSD<\/a><\/i> (SSD en attachement direct sur l&#8217;hyperviseur, meilleures performances, meilleur prix mais aucune redondance) ainsi que le mode <i><a href=\"https:\/\/cloud.google.com\/compute\/docs\/nodes\/\">Sole Tenant nodes<\/a><\/i> qui permet de d\u00e9dier un hyperviseur pour un compte. Pour plus de d\u00e9tails, je vous invite \u00e0 consulter la doc en ligne de GCP.<\/p>\n<p>Certaines ressources comme les identit\u00e9s, les images, etc&#8230; peuvent \u00eatre globales, alors que d&#8217;autres comme des sous r\u00e9seau, des adresses IP, des instances ou du stockage peuvent \u00eatre confin\u00e9s \u00e0 une r\u00e9gion voire une seule zone. <\/p>\n<p>Pour repr\u00e9senter une application globale, il existe la notion de <b>projet<\/b>: c&#8217;est un peu l&#8217;espace de nom global du d\u00e9ploiement d&#8217;une application. Chaque ressource est unique dans un projet, chaque projet est unique dans GCP. C&#8217;est sur la base du projet qu&#8217;est \u00e9tablie la facturation. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_projet.png\" alt=\"\" width=\"667\" height=\"361\" class=\"aligncenter size-full wp-image-6665\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_projet.png 667w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_projet-300x162.png 300w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\" \/><\/p>\n<p>Enfin, l&#8217;acc\u00e8s aux ressources peut se faire de trois mani\u00e8res diff\u00e9rentes : <\/p>\n<p>&#8211; Via la <a href=\"https:\/\/cloud.google.com\/compute\/docs\/console\">console web<\/a> : dans un navigateur,  on acc\u00e8de aux diff\u00e9rents services, param\u00e9trage, ex\u00e9cution ou arr\u00eat, duplication, sauvegarde, etc&#8230; ainsi qu&#8217;au monitoring de ces services. <\/p>\n<p>&#8211; Via un <a href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/\">CLI<\/a> (Command Line Interface) : tout ce qui se fait dans la console retrouve un \u00e9quivalent dans la commande <b>gcloud<\/b>. Il suffit de l&#8217;installer sur un <a href=\"https:\/\/cloud.google.com\/sdk\/docs\/quickstart-debian-ubuntu\">linux<\/a> ou <a href=\"https:\/\/cloud.google.com\/sdk\/docs\/quickstart-windows\">windows<\/a> client et de piloter le projet \u00e0 partir de la ligne de commande:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances list\r\nNAME             DATABASE_VERSION  LOCATION        TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS\r\nmysql56-src      MYSQL_5_6         europe-west4                      -                -\r\nmysql-cap-cloud  MYSQL_5_7         europe-west4-a  db-n1-standard-1  35.204.174.228   -                STOPPED\r\nmysql5-slv       MYSQL_5_6         europe-west4-b  db-n1-standard-1  35.204.147.252   -                FAILED\r\n<\/pre>\n<p>&#8211; Via les <a href=\"https:\/\/cloud.google.com\/apis\/docs\/cloud-client-libraries\">API<\/a> en fonction du langage choisi, il en existe pour tous les go\u00fbts : Python, Go, Ruby, PHP, Java, Node.js, C#, etc&#8230;<\/p>\n<h2>Cloud SQL pour MySQL:<\/h2>\n<p>Alors que PostgreSQL est une offre relativement r\u00e9cente (2016) et assez peu mature par rapport \u00e0 ce que produit Amazon notamment (RDS \/ Aurora), l&#8217;offre MySQL en est \u00e0  sa deuxi\u00e8me g\u00e9n\u00e9ration, s&#8217;est enrichie au fil des ann\u00e9es et b\u00e9n\u00e9ficie d&#8217;un peu plus de recul sur les fonctionnalit\u00e9s. Aujourd&#8217;hui il est toujours possible de provisionner des instances MySQL de premi\u00e8re g\u00e9n\u00e9ration mais elles sont propos\u00e9es seulement pour compatibilit\u00e9 et seront retir\u00e9es probablement dans les mois \u00e0 venir. <\/p>\n<p>Avant de passer \u00e0 la pratique, regardons sur le papier les principales caract\u00e9ristiques techniques d&#8217;une instance MySQL gen II:<br \/>\n&#8211; Seules les versions 5.6 et 5.7 sont support\u00e9es.<br \/>\n&#8211; InnoDB est le seul  moteur de stockage support\u00e9.<br \/>\n&#8211; Pour le choix du tier, 64 vCPUs, 416 Gb de RAM et 10Tb de disque au maximum.<br \/>\n&#8211; Concernant le maintien en conditions op\u00e9rationnelles, les sauvegardes sont automatiques et les restaurations possibles \u00e0 un point dans le temps, \u00e9galement les patches mineurs sont appliqu\u00e9s en pr\u00e9cisant une fen\u00eatre de maintenance de pr\u00e9f\u00e9rence.<br \/>\n&#8211; Concernant la disponibilit\u00e9, les donn\u00e9es sont dupliqu\u00e9es sur 2 autres r\u00e9gions id\u00e9alement proches g\u00e9ographiquement, le failover d&#8217;une zone \u00e0 l&#8217;autre est automatis\u00e9 avec une VIP. <\/p>\n<h3>Les tiers disponibles :<\/h3>\n<p>Lors de la cr\u00e9ation d&#8217;une instance Cloud SQL MySQL de g\u00e9n\u00e9ration II, il est possible pour dimensionner la plateforme d&#8217;ex\u00e9cution de choisir entre les mod\u00e8les suivants:<br \/>\n&#8211; <b>db-f1-micro \/ db-g1-small<\/b> : vCPU partag\u00e9s avec d&#8217;autres machines micro \/ small, 1.6Gb de m\u00e9moire et 3Tb de donn\u00e9es maximum, 1000 connexions simultan\u00e9es.<br \/>\n&#8211; <b>db-n1-standard-1 \u00e0 -64<\/b> : de 1 \u00e0 64 vCPUs, de 3 \u00e0 240Gb de RAM, 10Tb de stockage et 4000 connexions simultan\u00e9es.<br \/>\n&#8211; <b>db-n1-highmem-2 \u00e0 -64<\/b> : de 2 \u00e0 64 vCPUs, de 13 \u00e0 416Gb de RAM, 10Tb de stockage et 4000 connexions simultan\u00e9es. <\/p>\n<h3>Le stockage disponible :<\/h3>\n<p>On peut choisir entre un stockage de type SSD (par d\u00e9faut) ou magn\u00e9tique. Pour les SSD, la taille du volume et le nombre de vCPUs vont affecter le nombre d&#8217;IOPS et le d\u00e9bit en Mb\/s :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_2.png\" alt=\"\" width=\"928\" height=\"250\" class=\"aligncenter size-full wp-image-6690\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_2.png 928w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_2-300x81.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_2-768x207.png 768w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/p>\n<p>Pour un tier \u00e0 15 vCPUs ou moins, il faudra provisionner \u00e0 500Gb pour obtenir 15000 IOPS et 240Mb\/s qui sont les maximums. C&#8217;est un travers que l&#8217;on va retrouver chez les concurrents : <b>le fait de toujours surprovisionner la capacit\u00e9 des disques pour pouvoir obtenir de meilleures performances<\/b>. Si pour un besoin de moins de 100Gb on alloue 500Gb parce qu&#8217;il nous faut des IOPS et du d\u00e9bit, on ne se pr\u00e9occupera plus de l&#8217;espace disque, d&#8217;autant qu&#8217;il augmentera tout seul par d\u00e9faut (sans jamais pouvoir \u00eatre r\u00e9duit): <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_1.png\" alt=\"\" width=\"415\" height=\"389\" class=\"aligncenter size-full wp-image-6689\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_1.png 415w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_storage_1-300x281.png 300w\" sizes=\"auto, (max-width: 415px) 100vw, 415px\" \/><\/p>\n<p>Principal danger de cette philosophie : on risque de perdre de vue la ma\u00eetrise de l&#8217;espace disque du point de vue des performances : un index fragment\u00e9 ne va pas co\u00fbter plus cher en stockage, par contre il va co\u00fbter plus cher en temps d&#8217;ex\u00e9cution, en temps vCPU, en verrous maintenus plus longtemps, etc&#8230; <\/p>\n<h3>Les co\u00fbts<\/h3>\n<p>Le co\u00fbt du stockage (novembre 2018 pour la r\u00e9gion europe-west4 &#8211; Pays-Bas):<br \/>\n&#8211; $0.187\/Gb\/mois pour les SSD<br \/>\n&#8211; $0.099\/BG\/mois pour les disques magn\u00e9tiques. <\/p>\n<p>Un exemple de configuration: 1 instance <b>db-n1-standard-16<\/b> :<br \/>\n&#8211; Fonctionnement en 24\/7<br \/>\n&#8211; Avec un failover replica<br \/>\n&#8211; 16 vCPUs d\u00e9di\u00e9s<br \/>\n&#8211; 60Gb de RAM<br \/>\n&#8211; 200 Gb de stockage SSD<br \/>\n&#8211; 1Tb de stockage pour les sauvegardes<\/p>\n<p>En utilisant la <a href=\"https:\/\/cloud.google.com\/products\/calculator\">calculette<\/a> on obtient:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_cost1.png\" alt=\"\" width=\"426\" height=\"435\" class=\"aligncenter size-full wp-image-6694\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_cost1.png 426w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_cost1-50x50.png 50w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_cost1-294x300.png 294w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/p>\n<p>Plus de d\u00e9tails sur les tiers disponibles et sur les co\u00fbts : <a href=\"https:\/\/cloud.google.com\/sql\/pricing#2nd-gen-pricing\">https:\/\/cloud.google.com\/sql\/pricing#2nd-gen-pricing<\/a>. L&#8217;id\u00e9e est de garder ce chiffre en t\u00eate pour pouvoir le comparer ensuite \u00e0 ce que peut donner un \u00e9quivalent sur AWS ou Azure dans les articles suivants. <\/p>\n<h3>Les limitations par rapport \u00e0 une distribution classique:<\/h3>\n<p>1) Pas de <b>LOAD DATA INFILE<\/b> dans le PaaS. Ca para\u00eet logique. A noter que sur Cloud Compute, <b>LOAD DATA LOCAL INFILE<\/b> est lui support\u00e9. <\/p>\n<p>2) Dans la m\u00eame veine, pas de <b>SELECT &#8230; INTO OUTFILE \/ DUMPFILE<\/b>. <\/p>\n<p>3) Pas de <b>CREATE FUNCTION &#8230; SONAME<\/b> pour le code externe (.so)<\/p>\n<p>4) Tout ce qui est li\u00e9 au privil\u00e8ge <b>SUPER<\/b> : par exemple pas moyen de modifier des param\u00e8tres globaux, pas de <b>GRANT ALL<\/b>, pas de <b>CHANGE MASTER TO<\/b>, etc&#8230; <\/p>\n<p>5) Peut \u00eatre le plus impactant : dans la mesure o\u00f9 la r\u00e9plication GTID sert de cadre technique \u00e0 toute la redondance, les param\u00e8tres GTID doivent \u00eatre activ\u00e9s et donc pas de <b>CREATE TABLE AS SELECT<\/b> ni de <b>CREATE TEMPORARY TABLE<\/b> dans les transactions. <\/p>\n<p>6) Attention ! <b>Performance_schema<\/b> n&#8217;est accessible que pour les tiers sup\u00e9rieurs \u00e0 <b>db-n1-standard-8<\/b> ou <b>db-n1-highmem-4<\/b>. <\/p>\n<h3>La connexion<\/h3>\n<p>Deux mani\u00e8res de se connecter : soit utiliser un client classique (mysql, SQLYOG, MySQL Workbench), soit utiliser l&#8217;outil <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/sql-proxy\">Cloud SQL Proxy<\/a>. <\/p>\n<p>Cloud SQL proxy s&#8217;installe sur le client et une fois associ\u00e9 au compte et au projet, permet de g\u00e9rer les connexions de mani\u00e8re plus simple et plus s\u00e9curis\u00e9e:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_cloud_proxy.png\" alt=\"\" width=\"848\" height=\"324\" class=\"aligncenter size-full wp-image-6739\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_cloud_proxy.png 848w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_cloud_proxy-300x115.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_cloud_proxy-768x293.png 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/p>\n<p>Passer par le client natif sera g\u00e9n\u00e9ralement un peu plus rapide que passer par le proxy, mais si la connexion doit \u00eatre port\u00e9e par SSL il faudra g\u00e9rer les certificats soit-m\u00eame:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ .\/cloud_sql_proxy -instances=durable-epoch-220407:europe-west4:mysql-cap-cloud=tcp:3306 &amp;\r\n[1] 10131\r\n2018\/12\/03 10:39:37 Listening on 127.0.0.1:3306 for durable-epoch-220407:europe-west4:mysql-cap-cloud\r\n2018\/12\/03 10:39:37 Ready for new connections\r\n\r\n$ time mysql --login-path=mygcpsql --execute=&quot;select count(1) from sakila.payment;&quot;\r\n+----------+\r\n| count(1) |\r\n+----------+\r\n|    16049 |\r\n+----------+\r\n\r\nreal\t0m0.128s\r\nuser\t0m0.000s\r\nsys\t0m0.004s\r\n\r\n$ time mysql --user=root --host=127.0.0.1 --port=3306 --password=****** --execute=&quot;select count(1) from sakila.payment;&quot;\r\nWarning: Using a password on the command line interface can be insecure.\r\n2018\/12\/03 10:32:00 New connection for &quot;durable-epoch-220407:europe-west4:mysql-cap-cloud&quot;\r\n+----------+\r\n| count(1) |\r\n+----------+\r\n|    16049 |\r\n+----------+\r\n\r\nreal\t0m0.162s\r\nuser\t0m0.004s\r\nsys\t0m0.000s\r\n$ 2018\/12\/03 10:32:00 Client closed local connection on 127.0.0.1:3306\r\n\r\n\r\n<\/pre>\n<p>Cela dit, l&#8217;outil reste assez vaste et n\u00e9cessitera un approfondissement via un article d\u00e9di\u00e9. A titre personnel, j&#8217;utiliserai plut\u00f4t le client natif <i>mysql<\/i> d&#8217;autant que le login-path fonctionne sans probl\u00e8me avec une instance dans le cloud. <\/p>\n<h3>La haute disponibilit\u00e9 et les possibilit\u00e9s de r\u00e9plication:<\/h3>\n<p>Nous avons vu plus haut que le failover peut \u00eatre automatis\u00e9. Attention il n&#8217;est pas actif par d\u00e9faut, le plus simple est de provisionner une instance de secours au moment du d\u00e9ploiement de l&#8217;instance principale :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha1-1.png\" alt=\"\" width=\"407\" height=\"169\" class=\"aligncenter size-full wp-image-6709\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha1-1.png 407w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha1-1-300x125.png 300w\" sizes=\"auto, (max-width: 407px) 100vw, 407px\" \/>\n<\/p>\n<p>A noter qu&#8217;il est toujours possible de <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/configure-ha\">rajouter <\/a>une instance de secours plus tard via la console, gcloud ou une API dans le langage de votre choix. <\/p>\n<p>Cette instance de secours sera appel\u00e9e <i>failover replica<\/i>. Il ne peut y en avoir qu&#8217;une seule par instance master, elle doit se trouver dans une autre zone mais n\u00e9cessairement dans la m\u00eame r\u00e9gion, et ce sera une exacte copie en termes de configuration. La synchronisation sera assur\u00e9e par la <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/replication-semisync.html\">r\u00e9plication semi-synchrone<\/a> MySQL en mode GTID. Ce qui implique que les binlogs seront activ\u00e9s sur le master, donc co\u00fbt de stockage suppl\u00e9mentaire. <\/p>\n<p>Enfin, ce failover replica fera \u00e9videmment l&#8217;objet d&#8217;une facturation suppl\u00e9mentaire. La mauvaise nouvelle c&#8217;est qu&#8217;il sera factur\u00e9 <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/pricing#2nd-gen-instance-pricing\">au m\u00eame prix<\/a> que l&#8217;instance master. A noter que le prix \u00e9voqu\u00e9 un peu plus haut inclut d\u00e9j\u00e0 le co\u00fbt du failover replica, mais je trouve dommage de facturer une instance dormante au m\u00eame prix qu&#8217;une instance active. <\/p>\n<p>Pour assurer le failover automatique, outre le failover replica, plusieurs m\u00e9canismes sont en place:<br \/>\n&#8211; L&#8217;\u00e9criture d&#8217;une ligne de &#8216;heartbeat&#8217; dans une table syst\u00e8me mysql.heartbeat de l&#8217;instance master, chaque seconde.<br \/>\n&#8211; Une <i>VIP<\/i> pour permettre de raccrocher les applications sur la nouvelle instance promue principale suite \u00e0 la bascule.<\/p>\n<p>Un syst\u00e8me externe monitore l&#8217;arriv\u00e9e des lignes de heartbeat et si aucune nouvelle ligne n&#8217;est lisible au del\u00e0 de 60 secondes et si le failover replica est disponible, un failover sera initi\u00e9:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha_failover.gif\" alt=\"\" width=\"766\" height=\"445\" class=\"aligncenter size-full wp-image-6719\" \/><br \/>\n1) On attend que le failover replica ait termin\u00e9 de rejouer toutes les transactions en attente.<br \/>\n2) La VIP et le nom de l&#8217;instance master basculent sur le failover replica qui est promu nouveau master.<br \/>\n3) En arri\u00e8re plan, un nouveau failover replica est recr\u00e9\u00e9 dans une autre zone, c&#8217;est la raison pour laquelle il y a au moins 3 zones par r\u00e9gion. Si une zone compl\u00e8te est en \u00e9chec il en reste toujours deux pour assurer la disponibilit\u00e9. <\/p>\n<p>Au del\u00e0 de la partie failover, il est aussi possible de cr\u00e9er d&#8217;autres slaves en lecture seule, des <i>read replicas<\/i>. Dans ce cas, il est possible de cr\u00e9er plusieurs read replicas pour un m\u00eame master, et dans le cas d&#8217;un failover ils seront automatiquement recr\u00e9\u00e9s \u00e9galement. <\/p>\n<p>Plusieurs choses \u00e0 noter pour les read replicas :<br \/>\n&#8211; Ils seront synchronis\u00e9s avec le master en utilisant la r\u00e9plication GTID asynchrone classique.<br \/>\n&#8211; Il n&#8217;est pas possible de faire des sauvegardes ou recr\u00e9er d&#8217;autres slaves \u00e0 partir d&#8217;un read replica.<br \/>\n&#8211; Ils peuvent \u00eatre externes \u00e0 GCP, de la m\u00eame mani\u00e8re un master peut \u00eatre externe aussi, ce qui va \u00eatre int\u00e9ressant dans le cas d&#8217;une migration:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha6.png\" alt=\"\" width=\"875\" height=\"219\" class=\"aligncenter size-full wp-image-6723\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha6.png 875w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha6-300x75.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_ha6-768x192.png 768w\" sizes=\"auto, (max-width: 875px) 100vw, 875px\" \/><\/p>\n<h3>Backup &#038; restauration:<\/h3>\n<p>D\u00e9j\u00e0 il existe 2 types de backups : les backups <b>automatis\u00e9s<\/b> et les backups <b>\u00e0 la demande<\/b>. Associ\u00e9s \u00e0 l&#8217;activation des logs binaires, ils fournissent une solution de restauration \u00e0 un point dans le temps, ce qui est tr\u00e8s important vis \u00e0 vis de votre <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Perte_de_donn%C3%A9es_maximale_admissible\">RPO<\/a>. <\/p>\n<p>Les backups automatis\u00e9s seront lanc\u00e9s dans une fen\u00eatre de 4 heures que l&#8217;on peut d\u00e9finir \u00e0 la cr\u00e9ation de l&#8217;instance ou plus tard :<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_backup1.png\" alt=\"\" width=\"492\" height=\"315\" class=\"aligncenter size-full wp-image-6729\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_backup1.png 492w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/gcp_backup1-300x192.png 300w\" sizes=\"auto, (max-width: 492px) 100vw, 492px\" \/><br \/>\n7 backups en ligne seront conserv\u00e9s, dans le marbre, pour un co\u00fbt du stockage \u00e0 $0.088\/mois\/GB (novembre 2018, R\u00e9gion europe-west4).<\/p>\n<p>Il est ensuite possible de lancer des backups \u00e0 la demande. Ces backups ne suivront pas la politique de r\u00e9tention des backups automatiques, ils resteront donc sur un bucket disque tant qu&#8217;ils ne seront pas supprim\u00e9s:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ time gcloud sql backups create --instance=mysql-cap-cloud\r\nBacking up Cloud SQL instance...done.                                                                                                                                                                     \r\n[https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud] backed up.\r\n\r\nreal\t0m34.714s\r\nuser\t0m0.204s\r\nsys\t0m0.144s\r\n<\/pre>\n<p>La question de la coh\u00e9rence de ces backups est \u00e9vacu\u00e9e par le postulat de n&#8217;avoir qu&#8217;InnoDB en moteur de stockage pour les g\u00e9n\u00e9ration II, ce qui revient \u00e0 faire un mysqldump en &#8211;single-transaction. Pas besoin de faire un FLUSH TABLE WITH READ LOCK donc, toutefois comme sur les distributions traditionnelles, il vaut mieux <a href=\"https:\/\/www.percona.com\/blog\/2012\/03\/23\/best-kept-mysqldump-secret\/\">\u00e9viter de lancer des op\u00e9rations DDL<\/a> pendant la sauvegarde. <\/p>\n<p>La liste des backups est consultable traditionnellement via la console, gcloud ou une API:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql backups list --instance=mysql-cap-cloud --sort-by=WINDOW_START_TIME\r\nID             WINDOW_START_TIME              ERROR  STATUS\r\n1542664800648  2018-11-19T22:00:00.648+00:00  -      SUCCESSFUL\r\n1543505077704  2018-11-29T15:24:37.704+00:00  -      SUCCESSFUL\r\n1543505836176  2018-11-29T15:37:16.176+00:00  -      SUCCESSFUL\r\n<\/pre>\n<p>Je n&#8217;ai pas trouv\u00e9 le moyen de voir la taille par backup, dommage car la cha\u00eene est \u00e0 base de backup complet (le plus ancien) et ensuite de backups incr\u00e9mentaux, donc on devrait pouvoir voir le gain d&#8217;espace disque sur les backups additionnels.<\/p>\n<p>Une restauration peut se faire sur l&#8217;instance source mais aussi d&#8217;une instance \u00e0 une autre en pr\u00e9cisant &#8211;backup-instance et &#8211;restore-instance :<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql backups restore 1543505077704 --restore-instance=mysql-cap-cloud --quiet\r\nRestoring Cloud SQL instance...done.                                                                                                                                                                  \r\nRestored [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud].\r\n<\/pre>\n<p>ou<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql backups restore 1543505077704 --backup-instance=mysql-cap-cloud --restore-instance=mysql-cap-cloud-2 --quiet\r\nRestoring Cloud SQL instance...done.                                                                                                                                                                  \r\nRestored [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud-2].\r\n<\/pre>\n<p>Le backup source sera identifi\u00e9 par la cl\u00e9 <i>1543505077704<\/i> qui reprend le BACKUP_ID renvoy\u00e9 par la commande de listing vue plus haut. Pendant la dur\u00e9e de la restauration, toute la cible est \u00e9videmment inaccessible:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances describe mysql-cap-cloud | grep '^state'\r\nstate: MAINTENANCE\r\n<\/pre>\n<p>Enfin, si des r\u00e9plicas failover ou read existent, il faudra les supprimer et les reprovisionner une fois la restauration effectu\u00e9e. <\/p>\n<p>Au del\u00e0 de la solution via &#8211;backup-instance et &#8211;restore-instance, il existera une solution pour cloner une instance existante et en cr\u00e9er une nouvelle :<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\ngcloud sql instances clone mysql-cap-cloud mysql-cap-cloud2\r\n<\/pre>\n<p>Pour clore le chapitre sur les backups, on peut dire qu&#8217;ils ne peuvent \u00eatre utilis\u00e9s qu&#8217;au sein du m\u00eame projet. On ne peut pas restaurer vers une instance d&#8217;un autre projet, ou sur une instance de premi\u00e8re g\u00e9n\u00e9ration, etc&#8230;<\/p>\n<h3>Arr\u00eat &#038; red\u00e9marrage:<\/h3>\n<p>Cloud SQL est un service factur\u00e9 \u00e0 l&#8217;utilisation: lorsque l&#8217;instance est coup\u00e9e, seul le stockage est factur\u00e9. Donc si vous n&#8217;avez pas besoin d&#8217;avoir une instance d\u00e9marr\u00e9e en permanence (par exemple vos environnements hors prod), vous allez faire des \u00e9conomies, mais cela implique d&#8217;utiliser un m\u00e9canisme sp\u00e9cifique pour g\u00e9rer les arr\u00eat et d\u00e9marrages. <\/p>\n<p>Tout est contr\u00f4l\u00e9 \u00e0 partir du param\u00e8tre du service <b>ACTIVATION_POLICY<\/b>. Attention ce n&#8217;est pas un param\u00e8tre MySQL mais bien un param\u00e8tre Cloud SQL. <\/p>\n<p>Globalement ce param\u00e8tre peut \u00eatre positionn\u00e9 soit \u00e0 :<\/p>\n<p>&#8211; <b>ALWAYS<\/b> : le service est d\u00e9marr\u00e9 et factur\u00e9.<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances patch mysql-cap-cloud \\\r\n\t--activation-policy=ALWAYS\r\nPatching Cloud SQL instance...done.                                                                                                                                                                                                          \r\nUpdated [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud].\r\n<\/pre>\n<p>&#8211; <b>NEVER<\/b> : le service est stopp\u00e9 et non factur\u00e9.<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances patch mysql-cap-cloud \\\r\n\t--activation-policy=NEVER \r\nPatching Cloud SQL instance...done.                                                                                                                                                                                                          \r\nUpdated [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud].\r\n<\/pre>\n<p>Pour les instances de g\u00e9n\u00e9ration I, il existe un param\u00e8tre <b>ON_DEMAND<\/b> qui implique que la derni\u00e8re d\u00e9connexion coupe le service et la premi\u00e8re connexion le red\u00e9marre, mais pour une instance de g\u00e9n\u00e9ration II cette option n&#8217;est pas disponible et devrait dispara\u00eetre \u00e0 terme. <\/p>\n<p>Il existe \u00e9videmment l&#8217;\u00e9quivalent c\u00f4t\u00e9 console et API mais si vous souhaitez automatiser une mise en sommeil de vos instances de dev \/ recette par exemple, le plus efficace sera de piloter ACTIVATION_POLICY via un client distant, qui peut \u00eatre chez vous on-premise ou dans une VM Cloud Compute. <\/p>\n<p>Si un arr\u00eat suivi d&#8217;un red\u00e9marrage imm\u00e9diat est souhait\u00e9, il existe une troisi\u00e8me solution mais dans ce cas il n&#8217;y a pas d&#8217;arr\u00eat de la facturation:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances restart mysql-cap-cloud\r\nThe instance will shut down and start up again immediately if its \r\nactivation policy is &quot;always.&quot; If &quot;on demand,&quot; the instance will start\r\n up again when a new connection request is made.\r\n\r\nDo you want to continue (Y\/n)?  Y\r\n\r\nRestarting Cloud SQL instance...done.                                                                                                                                                                                                        \r\nRestarted [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql-cap-cloud].\r\n<\/pre>\n<p>A noter que par d\u00e9faut si vous utilisez mysqladmin shutdown l&#8217;instance s&#8217;arr\u00eate et red\u00e9marre imm\u00e9diatement, ce n&#8217;est donc pas une option&#8230; <\/p>\n<p>Remarque : La valeur de @@server-id est g\u00e9n\u00e9r\u00e9e al\u00e9atoirement, elle est notamment r\u00e9g\u00e9n\u00e9r\u00e9e \u00e0 chaque changement de ACTIVATION_POLICY ou red\u00e9marrage via <i>gcloud sql instances restart&#8230;<\/i>. \u00c7a surprend un peu au d\u00e9but mais \u00e0 la r\u00e9flexion ce n&#8217;est pas vraiment un probl\u00e8me dans la mesure o\u00f9 on n&#8217;utilisera que la r\u00e9plication GTID et la valeur de @@server-uuid, elle, ne change jamais. <\/p>\n<h3>Fen\u00eatres de maintenance:<\/h3>\n<p>A partir de la g\u00e9n\u00e9ration II, on peut choisir sa fen\u00eatre de maintenance, pendant laquelle les mises \u00e0 jour n\u00e9cessitant les arr\u00eat \/ red\u00e9marrages de l&#8217;instances peuvent survenir:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance.png\" alt=\"\" width=\"449\" height=\"204\" class=\"aligncenter size-full wp-image-6740\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance.png 449w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance-300x136.png 300w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/p>\n<p>Les <i>failover replicas<\/i> suivront la m\u00eame politique donc il n&#8217;est pas possible de basculer pendant cette p\u00e9riode. Il y a risque donc de downtime, sans garantie (les dates de mise \u00e0 jour ne sont pas annonc\u00e9es \u00e0 l&#8217;avance). C&#8217;est donc une partie assez d\u00e9licate pour 2 raisons principales:<\/p>\n<p>1) Si vous avez \u00e0 la fois vos environnements hors prod et production dans Cloud SQL, il sera compliqu\u00e9 de pouvoir patcher le hors prod et le laisser tourner suffisamment longtemps pour d\u00e9tecter un probl\u00e8me suite \u00e0 une mise \u00e0 jour. Les instances de g\u00e9n\u00e9ration II disposent d&#8217;un second param\u00e8tre <i><a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/instance-settings#maintenance-window-2ndgen\">maintenance timing<\/a><\/i> qui permet d&#8217;indiquer quelles instances sont patch\u00e9es en avance et quelle instances sont patch\u00e9es plus tard, mais cela reste tr\u00e8s vague on ne peut pas vraiment d\u00e9terminer un \u00e9cart de temps pr\u00e9cis entre les instances patch\u00e9es en <i>Earlier<\/i> et les instances patch\u00e9es en <i>Later<\/i>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance2.png\" alt=\"\" width=\"465\" height=\"283\" class=\"aligncenter size-full wp-image-6742\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance2.png 465w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_maintenance2-300x183.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/p>\n<p>2) Ensuite, <b>il y a bien downtime<\/b> c&#8217;est une infrastructure manag\u00e9e et vous ne pourrez rien y faire. Si votre application n\u00e9cessite d&#8217;\u00eatre disponible 24\/7 sans interruption programm\u00e9e, il risque d&#8217;y avoir un os. Vous n&#8217;avez qu&#8217;un contr\u00f4le marginal sur l&#8217;application de ces patches, statistiquement il y a environ 1 \u00e0 2 patches par mois, votre instance est coup\u00e9e environ 5 minutes \u00e0 chaque fois. On se souvient que le SLO (Service Level Objective) de GCP est en 4&#215;9 (99.99%) seulement, ceci explique donc cela, il faudra garder cet argument en t\u00eate lorsque nous comparerons avec les petits camarades AWS et Azure. <\/p>\n<h3>Supervision:<\/h3>\n<p>De notre point de vue de technicien, c&#8217;est l\u00e0 que l&#8217;on rentre vraiment dans le brouillard, si vous voulez bien me passer l&#8217;expression \ud83d\ude42 <\/p>\n<p>Car si du point de vue du m\u00e9tier et des \u00e9tudes, globalement Cloud SQL pour MySQL est une r\u00e9ussite du point de vue compatibilit\u00e9 et co\u00fbt, du point de vue de la production c&#8217;est une autre paire de manches. Ce qui n&#8217;est pas surprenant, un service qui propose une infrastructure manag\u00e9e est cens\u00e9 s&#8217;affranchir des probl\u00e9matiques de production. Notre m\u00e9tier change, on le sait. <\/p>\n<p>La question que l&#8217;on doit se poser toutefois, c&#8217;est quoi faire en cas de d\u00e9gradation de performance. Le <i>clouder<\/i> vous dira avec le sourire que le plus simple reste de pousser le curseur \u00e0 droite, partir sur un tier plus costaud, mais aussi une facture disons, plus <i>cons\u00e9quente<\/i>. <\/p>\n<p>Maintenant, votre int\u00e9r\u00eat sera de voir ce que vous pouvez optimiser avant de commencer \u00e0 payer plus cher votre service. En mettant plus de ressources face \u00e0 un probl\u00e8me de performance, on ne s&#8217;attaque pas \u00e0 la cause racine, m\u00eame dans le cloud. <\/p>\n<p>Pour y arriver, il faut des outils pour pouvoir investiguer comme on pourrait le faire sur une installation traditionnelle. Et comme ce n&#8217;est pas dans l&#8217;int\u00e9r\u00eat du <i>clouder<\/i>, ces outils que l&#8217;on avait l&#8217;habitude manipuler vont commencer \u00e0 se rar\u00e9fier. <\/p>\n<p>Faisons un tour de ce qui est disponible et ce qui ne l&#8217;est pas pour MySQL sur GCP: <\/p>\n<table border=1>\n<th>Analyse de performance g\u00e9n\u00e9rale<\/th>\n<th>Disponibilit\u00e9 dans Cloud SQL<\/th>\n<tr>\n<td>PERFORMANCE_SCHEMA<\/td>\n<td>Attention sur le choix du tier, performance_schema ne sera activable <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/flags\">que pour les tiers sup\u00e9rieurs \u00e0 db-n1-standard-8 ou db-n1-highmem-4<\/a>, et ensuite on ne pourra plus redescendre sur une gamme inf\u00e9rieure. <\/td>\n<\/tr>\n<tr>\n<td>VARIABLES DE STATUT<\/td>\n<td>OK, elles sont toutes l\u00e0 (370 variables en 5.7.14), interrogeables depuis un client avec <a href=\"https:\/\/www.percona.com\/doc\/percona-toolkit\/LATEST\/pt-mext.html\">pt-mext<\/a>, donc rien ne change de ce point de vue. <\/td>\n<\/tr>\n<tr>\n<td>SHOW ENGINE INNODB STATUS<\/td>\n<td>OK, toutes les sections sont l\u00e0. <\/td>\n<\/tr>\n<tr>\n<td>PARAMETRES ORIENTES PERFORMANCES<\/td>\n<td>Dans la liste des param\u00e8tres orient\u00e9s performance, on notera que les param\u00e8tres m\u00e9moire type innodb_buffer_pool_size, innodb_buffer_pool_instances (partitionnement du cache, par d\u00e9faut non partitionn\u00e9), sort_buffer_size, table_open_cache, etc&#8230; ne seront pas positionnables. Ils sont vraisemblablement calcul\u00e9s en fonction du tier. Par contre tmp_table_size et max_heap_table_size sont disponibles, ainsi que query_cache_size ce qui est assez pratique si l&#8217;on souhaite d\u00e9sactiver le query cache.<\/td>\n<\/tr>\n<\/table>\n<p><\/p>\n<table border=1>\n<th>Analyse de requ\u00eates<\/th>\n<th>Disponibilit\u00e9 dans Cloud SQL<\/th>\n<tr>\n<td>EXPLAIN<\/td>\n<td>OK<\/td>\n<\/tr>\n<tr>\n<td>@@optimizer_switch<\/td>\n<td>Positionnable dans la session seulement, en raison du privil\u00e8ge SUPER qui emp\u00eache le SET GLOBAL. A noter que le <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/mrr-optimization.htm\">multi range read<\/a>  est actif par d\u00e9faut mais pas le <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/bnl-bka-optimization.html\">Batch Key Access<\/a>, qui ne sera positionnable que dans la session donc&#8230;<\/td>\n<\/tr>\n<tr>\n<td>SET OPTIMIZER TRACE<\/td>\n<td>OK<\/td>\n<\/tr>\n<tr>\n<td>Param\u00e8tres requ\u00eates lentes<\/td>\n<td>Log_query_not_using_index, slow_query_log et long_query_time sont positionnables, ansi que log_output et general_log. Par d\u00e9faut les requ\u00eates lentes seront stock\u00e9es dans un bucket accessible via le gestionnaire de logs de GCP, t\u00e9l\u00e9chargeables au format JSON et CSV. Assez peu pratique pour lancer un pt-query-digest ou un mysqldumpslow pour agr\u00e9ger les r\u00e9sultats. L&#8217;autre solution consiste \u00e0 changer la destination de log_output et mettre TABLE \u00e0 la place de FILE, mais avec les probl\u00e8mes <a href=\"https:\/\/blog.symedia.pl\/2016\/10\/performance-impact-general-slow-query-log.html\">d&#8217;impact potentiel <\/a>que cela suppose<\/td>\n<\/tr>\n<tr>\n<td>SET PROFILING=1<\/td>\n<td>Fonctionne OK. C&#8217;est toujours \u00e7a d&#8217;autant que le rempla\u00e7ant d\u00e9sign\u00e9 des PROFILES, \u00e0 savoir Performance_schema, n&#8217;est pas disponible sur tous les tiers.<\/td>\n<\/tr>\n<\/table>\n<p>Quant aux outils propos\u00e9s par GCP, un faible nombre de m\u00e9triques est propos\u00e9 sur la page d&#8217;accueil de l&#8217;instance :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_metrics1.png\" alt=\"\" width=\"389\" height=\"285\" class=\"aligncenter size-full wp-image-6744\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_metrics1.png 389w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_metrics1-300x220.png 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/p>\n<p>Pour aller plus loin, il existe la brique <i>Stackdriver<\/i> qui est le service de supervision &#8216;maison&#8217;, il va proposer <a href=\"https:\/\/cloud.google.com\/monitoring\/api\/metrics_gcp#gcp-cloudsql\">une trentaine de compteurs suppl\u00e9mentaires<\/a> :<\/p>\n<p>&#8211; Des compteurs infra PaaS : par exemple utilisation CPU, disque, m\u00e9moire, nombre de failovers, &#8230;<\/p>\n<p>&#8211; Des compteurs sp\u00e9cialis\u00e9s pour MySQL : 15 compteurs en tout :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/stackdriver_perfcntr1.png\" alt=\"\" width=\"813\" height=\"278\" class=\"aligncenter size-full wp-image-6743\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/stackdriver_perfcntr1.png 813w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/stackdriver_perfcntr1-300x103.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/stackdriver_perfcntr1-768x263.png 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><br \/>\nCes compteurs sont ensuite visibles soit dans des dashboards personnalisables ou dans le dashboard pour Cloud SQL par d\u00e9faut. Mais cela reste assez limit\u00e9, si vous voulez savoir si vos param\u00e8tres max_heap_table_size \/ tmp_table_size sont correctement dimensionn\u00e9s, ou historiser les compteurs de l&#8217;optimiseur type handler etc&#8230;, il faudra le faire vous-m\u00eames. Je ne parle m\u00eame pas des postes d&#8217;attente dans performance_schema. Il n&#8217;y a actuellement rien dans Stackdriver qui puisse se plugger sur performance_schema \u00e0 l&#8217;heure actuelle. <\/p>\n<p>On reste donc un peu sur sa faim d&#8217;autant que toutes les variables de statut sont disponibles, pourquoi ne pas toutes les proposer dans Stackdriver ?<\/p>\n<h3>MCO hors sauvegardes:<\/h3>\n<p>Concernant les statistiques, @@innodb_stats_persistent et @@innodb_stats_auto_recalc sont \u00e0 1 par d\u00e9faut en 5.6.6 donc pas de diff\u00e9rence par rapport \u00e0 une instance on-premise. S&#8217;il y a besoin de calculer par table il est toujours possible de positionner des options par table, ou recalculer en utilisant l&#8217;event  scheduler de MySQL qui est l&#8217;une des rares options utilisables dans Cloud SQL. <\/p>\n<p>Concernant la fragmentation, tout est en InnoDB donc attention tout objet est clusteris\u00e9, sujet aux page splits et autres merge split, etc&#8230; Si on souhaite \u00eatre proactif par rapport \u00e0 ces probl\u00e8mes \u00e7a va \u00eatre compliqu\u00e9 car @@innodb_fill_factor est \u00e0 1 par d\u00e9faut et ne pourra pas \u00eatre modifi\u00e9, on ne pourra changer le taux de remplissage des pages que via l&#8217;option MERGE_THRESHOLD et par table \/ index, donc au cas par cas. Rappelez-vous aussi que vous allez surprovisionner le stockage pour pouvoir obtenir de meilleures performances, donc vous risquez de passer \u00e0 c\u00f4t\u00e9 des probl\u00e8mes fragmentation. <\/p>\n<p>Enfin le <a href=\"https:\/\/www.xaprb.com\/blog\/2010\/02\/07\/how-often-should-you-use-optimize-table\/\">probl\u00e8me de reconstruction des indexes secondaires dans le mauvais ordre persiste<\/a> . Pas de param\u00e8tre <a href=\"https:\/\/www.percona.com\/blog\/2011\/11\/06\/improved-innodb-fast-index-creation\/\">@@expand_fast_index_creation<\/a> sur Cloud SQL, si vous voulez absolument reconstruire r\u00e9guli\u00e8rement vos indexes, pensez \u00e0 supprimer les indexes non clustered d&#8217;abord, recr\u00e9ez l&#8217;index cluster et recr\u00e9ez-les non clustered ensuite. <\/p>\n<h3>Migration vers Cloud SQL:<\/h3>\n<p><b>Deux solutions <\/b>: soit vous pouvez vous permettre une indisponibilit\u00e9 et vous pouvez passer par un mysqldump classique pour migrer vos bases dans Cloud SQL, soit vous ne pouvez pas et vous pouvez passer par une r\u00e9plication avec un <a href=\"https:\/\/cloud.google.com\/sql\/docs\/mysql\/replication\/replication-from-external\">master externe<\/a>. <\/p>\n<p>Je me m&#8217;attarderai pas sur la m\u00e9thode via mysqldump. Il faut se rappeler que si vous r\u00e9cup\u00e9rez vos triggers, proc\u00e9dures stock\u00e9es, fonctions et vues par d\u00e9faut un DEFINER sera g\u00e9n\u00e9r\u00e9 et risque de provoquer des erreurs lors de l&#8217;import car cela n\u00e9cessite le privil\u00e8ge SUPER. <\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\nError Code : 1227\r\nAccess denied; you need (at least one of) the SUPER privilege(s) for this operation\r\n<\/pre>\n<p>Egalement certains morceaux de code peuvent n\u00e9cessiter d&#8217;activer l&#8217;option <i>@@log_bin_trust_function_creators<\/i> qui est heureusement disponible dans la liste des param\u00e8tres modifiables dans Cloud SQL. <\/p>\n<p>Si l&#8217;indisponibilit\u00e9 est un facteur dans la migration, alors il est possible de r\u00e9pliquer un master on-premise ou en mode IaaS vers un slave dans Cloud SQL. L&#8217;architecture sera telle que : <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_external_master.png\" alt=\"\" width=\"605\" height=\"358\" class=\"aligncenter size-full wp-image-6745\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_external_master.png 605w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/12\/gcp_external_master-300x178.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/p>\n<p>Vous noterez la pr\u00e9sence d&#8217;une <i>Source Representation Instance<\/i> qui est en fait une instance proxy qui mat\u00e9rialise le master externe dans le PaaS. Elle ne contient pas de donn\u00e9es. <\/p>\n<p><b>Plusieurs choses \u00e0 noter avant de passer \u00e0 l&#8217;action:<\/b><\/p>\n<p>1) On ne pourra pas filtrer en aval avec un replication filter de type replicate_do_db. Et pourquoi \u00e0 votre avis ?<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\nmysql&gt; change replication filter replicate_do_db=(sakila) ;\r\nERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation\r\n<\/pre>\n<p>Il faudra donc le faire en amont si vous ne souhaitez pas migrer toutes les bases via cette technique. <\/p>\n<p>2) La r\u00e9plication GTID est impos\u00e9e, avec tout ce qui va avec : les param\u00e8tres <i>gtid_mode<\/i> et <i>enforce_gtid_consistency<\/i> doivent \u00eatre activ\u00e9s sur le master, ainsi que <i>log_slave_updates<\/i>. Autre d\u00e9tail qui a son importance, GTID n&#8217;arrive qu&#8217;en 5.6.5, donc si vous \u00eates dans une version inf\u00e9rieure c\u00f4t\u00e9 master, vous ne pourrez pas migrer en utilisant cette solution. <\/p>\n<p>3) Les binlogs doivent \u00e9videmment \u00eatre activ\u00e9s, en mode ROW. <\/p>\n<p><b>La mise en place d&#8217;une r\u00e9plication requiert donc 4 \u00e9tapes :<\/b><\/p>\n<p>1) Cr\u00e9er un compte avec le privil\u00e8ge <i>replication slave<\/i> sur le master pour que le thread IO puisse se connecter et collecter les transactions \u00e0 r\u00e9pliquer dans les logs binaires. <\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\nmysql&gt; grant replication slave on *.* to 'replgcp'@'%' identified by '********' ;\r\nQuery OK, 0 rows affected (0.36 sec)\r\n<\/pre>\n<p>Note : On ne conna\u00eet pas l&#8217;IP du slave \u00e0 l&#8217;avance car l&#8217;instance n&#8217;est pas encore cr\u00e9\u00e9e. <\/p>\n<p>2) Une fois les applications stopp\u00e9es, cr\u00e9er un backup via mysqldump et le stocker dans un bucket pr\u00e9alablement cr\u00e9\u00e9 sur Cloud Storage :<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ mysqldump --login-path=capdata56 \\\r\n--databases sakila --hex-blob --skip-triggers \\\r\n--master-data=1 --order-by-primary \\\r\n--no-autocommit --default-character-set=utf8mb4 \\\r\n--single-transaction --set-gtid-purged=on \\\r\n| gzip | gsutil cp - gs:\/\/repl-cap-cloud-bucket\/Sakila.2.GCP.dmp.gz\r\n\r\nWarning: A partial dump from a server that has GTIDs will by default include \r\nthe GTIDs of all transactions, even those that changed suppressed parts of \r\nthe database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. \r\nTo make a complete dump, pass --all-databases --triggers --routines --events. \r\nCopying from &lt;STDIN&gt;...\r\n\/ [1 files][    0.0 B\/    0.0 B]                                                \r\nOperation completed over 1 objects.     \r\n<\/pre>\n<p>Le fichier est compress\u00e9 et copi\u00e9 \u00e0 la vol\u00e9e avec l&#8217;utilitaire <i><a href=\"https:\/\/cloud.google.com\/storage\/docs\/gsutil\">gsutil<\/a><\/i> qui fait partie de la suite CLI. <\/p>\n<p>3) Cr\u00e9er la SRI:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud beta sql instances create mysql56-src --region=europe-west4 \\\r\n--database-version=MYSQL_5_6 --source-ip-address=193.145.24.23 \\\r\n--source-port=5639\r\nCreating Cloud SQL instance...done.\r\nCreated [https:\/\/www.googleapis.com\/sql\/v1beta4\/projects\/durable-epoch-220407\/instances\/mysql56-src].\r\nNAME         DATABASE_VERSION  LOCATION      TIER  PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS\r\nmysql56-src  MYSQL_5_6         europe-west4        -                -\r\n<\/pre>\n<p>O\u00f9 <i>193.145.24.23, 5639<\/i> est l&#8217;IP publique et le port sur laquelle mon master externe est rendu accessible de l&#8217;ext\u00e9rieur, via une redirection de port ou autre artifice. <\/p>\n<p>4) Enfin, cr\u00e9er le slave, l&#8217;initialiser avec le dump puis d\u00e9marrer les thread IO et SQL (on se rappelle qu&#8217;on ne peut pas faire de CHANGE MASTER TO sur le slave, il faudra passer par l&#8217;utilitaire CLI ou la console). <\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\ncapdata@mysql8:\/home\/capdata$ gcloud beta sql instances create mysql5-slv \\\r\n&gt; --master-instance-name=mysql56-src \\\r\n&gt; --master-username=replgcp --prompt-for-master-password \\\r\n&gt; --master-dump-file-path=gs:\/\/repl-cap-cloud-bucket\/Sakila.2.GCP.dmp \\\r\n&gt; --tier=db-n1-standard-1 --storage-size=30 \r\n\r\nWARNING: Starting with release 218.0.0, you will need to specify either a region or a zone to create an instance.\r\nMaster Instance Password: ************\r\n<\/pre>\n<p>Le slave va tenter de se connecter au master pendant 30 minutes au del\u00e0 desquelles il va ensuite stopper et ne pourra plus \u00eatre red\u00e9marr\u00e9. Ce qui vous laisse un intervalle de temps pour r\u00e9cup\u00e9rer l&#8217;IP publique du service nouvellement cr\u00e9\u00e9 et param\u00e9trer ce qu&#8217;il faut c\u00f4t\u00e9 firewall et redirections de flux:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n$ gcloud sql instances describe mysql5-slv --format=&quot;default(ipAddresses)&quot;\r\nipAddresses:\r\n- ipAddress: 35.224.167.132\r\n<\/pre>\n<p>Une fois le slave synchronis\u00e9, il ne vous reste plus qu&#8217;\u00e0 planifier les modalit\u00e9s de bascule. <\/p>\n<h2>En conclusion:<\/h2>\n<p>Bravo si vous \u00eates arriv\u00e9s jusque-l\u00e0 sans sauter de paragraphe \ud83d\ude42<\/p>\n<p>Pour tirer de vraies conclusions il faudra attendre de mettre l&#8217;offre PaaS de Google en perspective par rapport \u00e0 celles de Microsoft et Amazon. Mais d\u00e9j\u00e0 on peut peut faire une liste Plus \/ Moins:<\/p>\n<h3>Les plus<\/h3>\n<p>&#8211; Haut niveau de compatibilit\u00e9 fonctionnelle avec la version classique, ce qui fonctionne globalement on-premise pourra \u00eatre port\u00e9 sans beaucoup de modifications dans le PaaS, or on sait que le co\u00fbt de red\u00e9veloppement est souvent le premier poste d&#8217;une migration.<br \/>\n&#8211; Du point de vue technique ce n&#8217;est pas non plus la boite noire que l&#8217;on craignait. Certes Performance_schema n&#8217;est pas disponible pour tous les tiers mais beaucoup d&#8217;outils de diagnostic sont pr\u00e9sents, avec la possibilit\u00e9 de se cr\u00e9er ses propres outils.<br \/>\n&#8211; Performances disque annonc\u00e9es tr\u00e8s bonnes (15000 IOPS \/ 240Mb\/s).<br \/>\n&#8211; Gestion automatique de la reprise sur incident avec le failover replica et la VIP.<br \/>\n&#8211; Possibilit\u00e9 de migrer en utilisant la r\u00e9plication avec un master externe.<br \/>\n&#8211; Gestion des fen\u00eatres de maintenance <\/p>\n<h3>Les moins<\/h3>\n<p>&#8211; Pas possible de param\u00e9trer la r\u00e9tention des backups au del\u00e0 de 7 jours<br \/>\n&#8211; Faible nombre de compteurs disponibles m\u00eame dans Stackdriver.<br \/>\n&#8211; Manipulation du log de requ\u00eates lentes compliqu\u00e9. (export CSV, JSON, puis retraitement avant de lancer un pt-query-digest ou \u00e9quivalent)<br \/>\n&#8211; Coupures de service al\u00e9atoires lors du passage de patches, et difficult\u00e9 de ma\u00eetriser les impacts sur la production car pas de temps pour tester.<br \/>\n&#8211; Le prix du failover replica est le m\u00eame que celui du master ou d&#8217;un read replica. L&#8217;addition peut monter rapidement en empilant les instances les unes sur les autres.<\/p>\n<p>Dans le prochain \u00e9pisode nous parlerons de MySQL dans le PaaS Azure, nous pourrons alors commencer \u00e0 comparer un peu les deux offres. N&#8217;h\u00e9sitez \u00e0 nous faire part de vos commentaires et questions et abonnez-vous au flux RSS du blog pour la suite de nos aventures. <\/p>\n<p>A bient\u00f4t !<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644&#038;title=Comparatif%20MySQL%20dans%20le%20PaaS%2C%20%C3%A9pisode%201%20%3A%20Google%20Cloud%20SQL\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Comparatif%20MySQL%20dans%20le%20PaaS%2C%20%C3%A9pisode%201%20%3A%20Google%20Cloud%20SQL&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F6644\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Je vous propose de d\u00e9couvrir ensemble de quelle mani\u00e8re MySQL est impl\u00e9ment\u00e9 dans le PaaS, chez les 3 principaux fournisseurs de ce type de service : Google, Microsoft et Amazon, au rythme d&#8217;un \u00e9pisode par plateforme. Dans chaque \u00e9pisode nous&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":6648,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[296,4],"tags":[297],"class_list":["post-6644","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-google-cloud-platform","category-mysql","tag-cloud"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Je vous propose de d\u00e9couvrir ensemble de quelle mani\u00e8re MySQL est impl\u00e9ment\u00e9 dans le PaaS, chez les 3 principaux fournisseurs de ce type de service : Google, Microsoft et Amazon, au rythme d&#8217;un \u00e9pisode par plateforme. Dans chaque \u00e9pisode nous&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-05T13:53:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-21T15:50:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/google-cloud-platform-services.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"638\" \/>\n\t<meta property=\"og:image:height\" content=\"399\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"David Baffaleuf\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"David Baffaleuf\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\"},\"author\":{\"name\":\"David Baffaleuf\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf\"},\"headline\":\"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL\",\"datePublished\":\"2018-12-05T13:53:27+00:00\",\"dateModified\":\"2022-11-21T15:50:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\"},\"wordCount\":5778,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"cloud\"],\"articleSection\":[\"GCP\",\"MySQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\",\"name\":\"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2018-12-05T13:53:27+00:00\",\"dateModified\":\"2022-11-21T15:50:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf\",\"name\":\"David Baffaleuf\",\"sameAs\":[\"http:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/dbaffaleuf\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/","og_locale":"fr_FR","og_type":"article","og_title":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG","og_description":"Je vous propose de d\u00e9couvrir ensemble de quelle mani\u00e8re MySQL est impl\u00e9ment\u00e9 dans le PaaS, chez les 3 principaux fournisseurs de ce type de service : Google, Microsoft et Amazon, au rythme d&#8217;un \u00e9pisode par plateforme. Dans chaque \u00e9pisode nous&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2018-12-05T13:53:27+00:00","article_modified_time":"2022-11-21T15:50:06+00:00","og_image":[{"width":638,"height":399,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2018\/11\/google-cloud-platform-services.jpg","type":"image\/jpeg"}],"author":"David Baffaleuf","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"David Baffaleuf","Dur\u00e9e de lecture estim\u00e9e":"29 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/"},"author":{"name":"David Baffaleuf","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf"},"headline":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL","datePublished":"2018-12-05T13:53:27+00:00","dateModified":"2022-11-21T15:50:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/"},"wordCount":5778,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["cloud"],"articleSection":["GCP","MySQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/","url":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/","name":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2018-12-05T13:53:27+00:00","dateModified":"2022-11-21T15:50:06+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/comparatif-mysql-dans-le-paas-episode-1-google-cloud-sql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Comparatif MySQL dans le PaaS, \u00e9pisode 1 : Google Cloud SQL"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf","name":"David Baffaleuf","sameAs":["http:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/dbaffaleuf\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=6644"}],"version-history":[{"count":87,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6644\/revisions"}],"predecessor-version":[{"id":9506,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/6644\/revisions\/9506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/6648"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=6644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=6644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=6644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}