{"id":91090,"date":"2020-08-08T13:42:11","date_gmt":"2020-08-08T11:42:11","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage"},"modified":"2020-08-08T13:42:11","modified_gmt":"2020-08-08T11:42:11","slug":"arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","title":{"rendered":"Architecture S3\u00a0: 3 ans d'\u00e9volution du stockage Cloud de Mail.ru","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/a53775776b3fc969cc15c9d13a64039d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"https:\/\/www.deviantart.com\/st-pete\/art\/Storage-Corridor-408874509\">Couloir de stockage<\/a><\/noindex> par St-Pete<\/em><\/p>\n<p><\/p>\n<p>Bonjour \u00e0 tous ! Je suis Mons Anderson, architecte de la plateforme <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.ru Cloud Solutions<\/a><\/noindex>, je vais vous expliquer comment nous avons construit notre stockage S3, comment cela fonctionne, quelles solutions ont \u00e9t\u00e9 r\u00e9ussies et lesquelles nous aurions d\u00fb changer si nous devions recommencer un projet similaire aujourd'hui.<\/p>\n<p><\/p>\n<p>Cet article est bas\u00e9 sur une pr\u00e9sentation lors de <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Databases Meetup<\/a><\/noindex> par Mail.ru Cloud Solutions &amp; Tarantool. Dans cet article, nous aborderons :<\/p>\n<p><\/p>\n<ul>\n<li>comment \u00e9tait organis\u00e9 le stockage de Mail.ru, sur lequel nous avons construit le stockage S3 ;<\/li>\n<li>ce que nous avons ajout\u00e9 pour cr\u00e9er Mail.ru Cloud Storage ;<\/li>\n<li>comment fonctionne le mod\u00e8le de stockage d'objets et quelles \u00e9tapes ont \u00e9t\u00e9 mises en place pour la mise en production ;<\/li>\n<li>les am\u00e9liorations du syst\u00e8me en production : basculement et mise \u00e0 l'\u00e9chelle ;<\/li>\n<li>comment nous avons mis en \u0153uvre le sharding et le resharding ;<\/li>\n<li>ainsi que le travail avec les certificats SSL.<\/li>\n<\/ul>\n<p><\/p>\n<p>Si vous ne souhaitez pas lire, vous pouvez <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/NEgm1nsv-qg\">regarder<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"kak-bylo-ustroeno-hranilische-mailru-poverh-kotorogo-my-stroili-s3-hranilische\">Comment \u00e9tait organis\u00e9 le stockage de Mail.ru, sur lequel nous avons construit le stockage S3<\/h2>\n<p><\/p>\n<p>Le d\u00e9veloppement de notre S3 a commenc\u00e9 sur la base du stockage Cloud de Mail.ru, donc il est d'abord important d'expliquer comment cela fonctionne et ce qu'il peut faire.<\/p>\n<p><\/p>\n<p>Le stockage Cloud de Mail.ru se compose de serveurs avec des disques. En moyenne, un serveur de stockage moderne compte 36 disques de 12 \u00e0 14 t\u00e9raoctets. Autrefois, les disques \u00e9taient plus petits, mais au cours des trois derni\u00e8res ann\u00e9es, la capacit\u00e9 des disques a augment\u00e9 et aujourd'hui, il s'agit de pr\u00e8s de 0,5 p\u00e9taoctet de donn\u00e9es brutes. <\/p>\n<p><\/p>\n<p>Les disques de diff\u00e9rents serveurs de stockage sont regroup\u00e9s en ce que l'on appelle des \u00ab paires \u00bb (pair). Une paire est une unit\u00e9 de stockage de fichiers. En essence, c'est un disque mont\u00e9 dans une partition donn\u00e9e \u00e0 un chemin sp\u00e9cifique, o\u00f9 des fichiers identifi\u00e9s par des hachages peuvent \u00eatre plac\u00e9s. <\/p>\n<p><\/p>\n<p>Le terme paire est un nom historique, il est rest\u00e9 jusqu'\u00e0 aujourd'hui, m\u00eame si actuellement, une paire ne compte pas n\u00e9cessairement seulement deux disques. Il peut y en avoir trois, et il peut \u00e9galement y avoir diff\u00e9rents types de stockage hybride, par exemple 3\/2. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/544ab79846539262e2d4dff6ab95ffff.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Paires (pair) \u2014 unit\u00e9s de stockage d'objets<\/em><\/p>\n<p><\/p>\n<p>Toutes les paires sont stock\u00e9es dans PairDB \u2014 une application bas\u00e9e sur Tarantool. Toutes les bases dans notre stockage, d\u00e8s les premi\u00e8res, sont sur Tarantool, nous n'utilisons pas d'autres bases.<\/p>\n<p><\/p>\n<p>PairDB stocke toutes les paires, leurs \u00e9tats, l'espace libre, les capacit\u00e9s de d\u00e9faillance, les derni\u00e8res erreurs. Elle peut \u00e9galement v\u00e9rifier les paires, actualiser leur \u00e9tat, v\u00e9rifier si elles fonctionnent ou non. Autrement dit, PairDB donne une vue d'ensemble de l'\u00e9tat de tous les disques de notre syst\u00e8me.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/d50781b8b51ed5fe126bc84e19c934d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Pair DB : base de donn\u00e9es contenant l'\u00e9tat des paires<\/em><\/p>\n<p><\/p>\n<p>Les fichiers sont stock\u00e9s sur des paires, et pour savoir quel fichier se trouve sur quelle paire, une autre base est n\u00e9cessaire : FileDB. Elle conserve le mappage, la d\u00e9finition de la correspondance : tel fichier est stock\u00e9 sur telle paire, ainsi qu'un petit nombre d'attributs n\u00e9cessaires.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/b1a64737cf7f916bff446c10c1f01d4c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><em>File DB : emplacement o\u00f9 le fichier est stock\u00e9<\/em><\/p>\n<p>Un autre maillon important est le service Nylon, un routeur pour travailler avec des bases de donn\u00e9es. Il constitue un point d'entr\u00e9e unique, permettant de travailler \u00e0 travers une interface unique \u00e0 la fois avec PairDB et FileDB. C'est un service sans \u00e9tat, il effectue l'\u00e9quilibrage des demandes, comprend sur quelle shard de FileDB se diriger, sait quelles paires sont actives et lesquelles ne le sont pas.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/3e2225f229c8cfa462d620d2b5fb581e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Nylon : routeur pour travailler avec des bases de donn\u00e9es<\/em><\/p>\n<p><\/p>\n<p>Il est \u00e9galement n\u00e9cessaire de faire entrer du contenu dans le stockage. Pour cela, il y a un service \u2014 Streamer. Il fournit deux m\u00e9thodes HTTP : la m\u00e9thode PUT pour charger du contenu dans le stockage et la m\u00e9thode GET pour le r\u00e9cup\u00e9rer. HTTP est un protocole assez populaire et pratique pour le transfert de donn\u00e9es. <\/p>\n<p><\/p>\n<p>Lorsqu'on s'adresse \u00e0 Streamer, il contacte PairDB via Nylon pour d\u00e9terminer quelle paire peut recevoir le fichier, puis il transmet les donn\u00e9es via WebDAV \u00e0 cette paire. <\/p>\n<p><\/p>\n<p>Essentiellement, tout serveur de stockage est constitu\u00e9 de nginx plus des disques mont\u00e9s sur des chemins donn\u00e9s. Nous pouvons depuis Streamer charger un fichier dans le stockage, le supprimer, le renommer ou v\u00e9rifier son int\u00e9grit\u00e9. C'est-\u00e0-dire que c'est une interface pratique pour une interaction de bas niveau avec le stockage. <\/p>\n<p>\n<img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/3722a89ed44cace36e9cb1f8bee4bd1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Streamer : point d'entr\u00e9e dans le stockage<\/em><\/p>\n<p><\/p>\n<h2 id=\"chto-my-dobavili-chtoby-sdelat-s3-hranilische\">Ce que nous avons ajout\u00e9 pour cr\u00e9er un stockage S3<\/h2>\n<p><\/p>\n<p>Ainsi, nous avons examin\u00e9 l'architecture de base du stockage au moment de lancer le stockage S3. Gr\u00e2ce \u00e0 la m\u00e9thode PUT, nous pouvions y placer n'importe quel contenu et obtenir comme identifiant de ces donn\u00e9es un hachage. Avec cet identifiant, il \u00e9tait ensuite possible de revenir chercher le fichier d'origine. Mais cela n'est pas suffisant pour mettre en \u0153uvre S3. Dans le protocole S3, en plus du simple stockage d'objets, il y a :<\/p>\n<p><\/p>\n<ul>\n<li>le stockage de m\u00e9tadonn\u00e9es \u2014 propri\u00e9t\u00e9s suppl\u00e9mentaires des objets ;<\/li>\n<li>l'organisation de l'acc\u00e8s aux objets via HTTP ;<\/li>\n<li>le regroupement d'objets dans des collections \u2014 des buckets ;<\/li>\n<li>HTTP-S3 Endpoint. S3 organise les donn\u00e9es dans des structures d\u00e9finies \u2014 des buckets, chacun fournissant un point d'entr\u00e9e pour le stockage de fichiers.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pour mettre en \u0153uvre cette logique, un service distinct \u00e9tait n\u00e9cessaire. Nous voulions \u00e9galement anticiper l'architecture pour une croissance future du service avec une \u00e9volutivit\u00e9 lin\u00e9aire.<\/p>\n<p><\/p>\n<h2 id=\"pervye-komponenty\">Les premiers composants<\/h2>\n<p><\/p>\n<p>D\u00e9mon qui impl\u00e9mente l'API S3. Il s'agit de l'API S3 standard d'Amazon, qui prend en charge le travail avec XML pour les m\u00e9tadonn\u00e9es et permet de transf\u00e9rer directement du contenu. Nous n'avons pas eu besoin d'inventer quoi que ce soit, tout est d\u00e9crit et document\u00e9.<\/p>\n<p><\/p>\n<p>Nous avons \u00e9galement plac\u00e9 Nginx devant le service. Nous l'avons utilis\u00e9 pour la terminaison SSL, l'\u00e9quilibrage de charge, ainsi que pour une certaine logique en Lua (m\u00e9triques, journalisation et tra\u00e7age).<\/p>\n<p><\/p>\n<p>Pour le stockage des m\u00e9tadonn\u00e9es S3, nous avons \u00e9galement choisi Tarantool. Dans la premi\u00e8re version, le d\u00e9mon S3 acc\u00e9dait \u00e0 cette base pour les m\u00e9tadonn\u00e9es, tandis que le contenu lui-m\u00eame \u00e9tait stock\u00e9 dans un grand stockage via Streamer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/03dddec282b5bb41eb63748ccfb6c9a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Nginx + API S3 + m\u00e9tadonn\u00e9es<\/em><\/p>\n<p><\/p>\n<h2 id=\"obektnaya-model-hraneniya\">Mod\u00e8le de stockage objet<\/h2>\n<p><\/p>\n<p>Voyons comment S3 fonctionne. L'utilisateur peut cr\u00e9er un bucket - une collection d'objets. Le bucket est adress\u00e9 par le nom d'h\u00f4te et est un sous-domaine du service. Au sein du bucket, l'utilisateur peut cr\u00e9er des objets. L'identifiant d'un objet sera l'URL. Le contenu de l'objet est un blob, un tableau de donn\u00e9es binaires que nous allons stocker dans le stockage. L'objet a \u00e9galement des attributs : un nom - l'URL elle-m\u00eame, un ACL (liste de contr\u00f4le d'acc\u00e8s), d'autres attributs suppl\u00e9mentaires ou arbitraires - tout cela est enregistr\u00e9 dans les m\u00e9tadonn\u00e9es. <\/p>\n<p><\/p>\n<p>Un sch\u00e9ma normalis\u00e9 de ces donn\u00e9es pourrait ressembler \u00e0 ceci : il y a des projets qui poss\u00e8dent des buckets, qui poss\u00e8dent des objets, et les objets peuvent \u00eatre composites. Puisque l'un des moyens de t\u00e9l\u00e9charger un objet est par morceaux, il existe deux tables auxiliaires pour le t\u00e9l\u00e9chargement : uploads et chunks. Les projets ont \u00e9galement des identifiants pour l'acc\u00e8s et la facturation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/e2bede45ba4044f658b47a9840fd5224.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Sch\u00e9ma de donn\u00e9es<\/em><\/p>\n<p><\/p>\n<p>\u00c9tant donn\u00e9 que nous avons cr\u00e9\u00e9 un service B2B avec acc\u00e8s payant, une facturation \u00e9tait n\u00e9cessaire dans ce sch\u00e9ma.<br \/>\nLe service de facturation a \u00e9galement \u00e9t\u00e9 mis en \u0153uvre sur Tarantool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/d5b1a63e2273e933c95deecdb054bfe6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"dorabotki-s3-hranilischa-shagi-k-prodakshenu\">Am\u00e9liorations du stockage S3 : \u00e9tapes vers la production<\/h2>\n<p><\/p>\n<p>Nous avons d\u00e9j\u00e0 cr\u00e9\u00e9 un mod\u00e8le fonctionnel qui peut \u00eatre utilis\u00e9 : les objets et les m\u00e9tadonn\u00e9es \u00e9taient stock\u00e9s, mais il manquait quelques \u00e9l\u00e9ments pour passer en production.<\/p>\n<p><\/p>\n<p>Tout d'abord, il y a le syst\u00e8me de limitation de taux. Si nous lan\u00e7ons le service sans cela, lors d'une charge de pointe, nous pourrions surcharger de mani\u00e8re impr\u00e9visible certaines parties du syst\u00e8me. La limitation de taux doit fonctionner de la mani\u00e8re suivante : toute requ\u00eate S3 arrive sur un h\u00f4te sp\u00e9cifique, cet h\u00f4te est l'identifiant du bucket, et le bucket appartient \u00e0 un client. Nous devons d\u00e9finir une certaine fonction \u00e0 partir du bucket qui permettrait de calculer la limitation de taux. <\/p>\n<p><\/p>\n<p>De plus, le syst\u00e8me de limitation de taux doit \u00eatre suffisamment performant pour supporter la charge qui arrive sur S3.<\/p>\n<p><\/p>\n<p>Ici, nous avons de nouveau utilis\u00e9 Tarantool. Les limitations de taux consistent en un cluster de 21 instances, les instances sont divis\u00e9es en groupes, r\u00e9parties sur trois n\u0153uds physiques et regroup\u00e9es en un grand cluster topologique. Les modifications de configuration y sont automatiquement propag\u00e9es : les limitations de taux, les valeurs par d\u00e9faut et la configuration sont d\u00e9finies. Chaque bucket est servi par exactement une instance. Lorsque une requ\u00eate arrive pour un bucket sp\u00e9cifique, une instance responsable de ce bucket est d\u00e9termin\u00e9e. Au sein de ce n\u0153ud, le taux actuel des requ\u00eates est calcul\u00e9 selon un algorithme similaire \u00e0 Token Bucket. Ensuite, le syst\u00e8me de limitations de taux, bas\u00e9 sur les indicateurs de charge actuels et les propri\u00e9t\u00e9s d\u00e9finies pour le bucket sp\u00e9cifique, d\u00e9cide si la requ\u00eate peut \u00eatre ex\u00e9cut\u00e9e ou non. La v\u00e9rification des limites s'effectue \u00e0 la premi\u00e8re \u00e9tape de l'ex\u00e9cution de la requ\u00eate S3, prot\u00e9geant tous les autres \u00e9l\u00e9ments du syst\u00e8me contre une surcharge excessive. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/1b91e5d1fe067c859ba9b36d58827579.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il est \u00e9galement assez difficile de fonctionner sans cache sous une charge. S3 implique des acc\u00e8s r\u00e9p\u00e9t\u00e9s aux m\u00eames objets, c'est-\u00e0-dire qu'il s'agit d'un stockage chaud. Dans des conditions normales, l'acc\u00e8s \u00e0 un seul fichier est g\u00e9r\u00e9 par toute la cha\u00eene : Streamer, FileDB, PairDB, Storage. Mais lors d'un acc\u00e8s r\u00e9p\u00e9t\u00e9 au fichier, nous optimisons l'acc\u00e8s \u00e0 ce contenu \u00e0 l'aide d'un cache local.<\/p>\n<p><\/p>\n<p>Le cache est hi\u00e9rarchique et est r\u00e9alis\u00e9 \u00e0 l'aide de nginx, de disques SSD locaux et de RAM. Ici, nous n'avons pas utilis\u00e9 Tarantool, car il est plus pratique de servir des objets \u00e0 partir du syst\u00e8me de fichiers, ce qui nous permet de mettre en \u0153uvre un tiering de cache. De plus, nous avons de gros objets avec une taille maximale de 32 Go, et dans Tarantool, il n'est possible de mettre en cache que de petits objets.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/faa02bd52a1d70642589d775f22c5e75.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce premier syst\u00e8me que nous avons lanc\u00e9 avait une capacit\u00e9 calcul\u00e9e, suffisante pour explorer et comprendre le produit, et pour s'assurer qu'il fonctionnerait. <\/p>\n<p><\/p>\n<h2 id=\"dorabotki-boevoy-sistemy-feylover-i-masshtabirovanie\">Am\u00e9liorations du syst\u00e8me op\u00e9rationnel : basculement et mise \u00e0 l'\u00e9chelle<\/h2>\n<p><\/p>\n<p>Le syst\u00e8me \u00e9tait d\u00e9j\u00e0 op\u00e9rationnel, mais nous avions omis certaines choses au d\u00e9part ; il fallait ajouter le basculement et la mise \u00e0 l'\u00e9chelle. <\/p>\n<p><\/p>\n<p>Notre d\u00e9mon S3 r\u00e9cup\u00e9rait des m\u00e9tadonn\u00e9es via le protocole Tarantool. \u00c0 la place de la base de donn\u00e9es originale, nous avons install\u00e9 Tarantool, qui agissait comme un routeur proxy pour les requ\u00eates de m\u00e9tadonn\u00e9es. Du point de vue de l'application impl\u00e9mentant l'API, rien n'a chang\u00e9 \u2014 elle continuait \u00e0 interroger la base via le protocole Tarantool, mais le routeur a pu assurer un basculement actif. Cela signifie que nous pouvions v\u00e9rifier la disponibilit\u00e9 des n\u0153uds, g\u00e9rer les pauses lors des commutations et des pannes, etc. De plus, nous n'avons pas modifi\u00e9 l'application elle-m\u00eame. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/978ff8a458f8d48b98672121cf6eca5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"podrobnee-o-tom-kak-my-realizovali-shardirovanie\">En savoir plus sur notre mise en \u0153uvre du sharding<\/h2>\n<p><\/p>\n<p>La question suivante \u00e0 laquelle nous avons d\u00fb faire face \u00e9tait le sharding. Le syst\u00e8me grandissait, le nombre d'objets augmentait et il fallait assurer des possibilit\u00e9s de croissance future.<\/p>\n<p><\/p>\n<p>Revenons au sch\u00e9ma de donn\u00e9es : il y a des projets, des compartiments, des cr\u00e9dos et de la facturation. Ce sont des objets qui, tr\u00e8s probablement, ne d\u00e9passeront pas les limites d'une instance en termes de volume ou de requ\u00eates dans un avenir proche. Donc, il n'y a pas de sens \u00e0 les sharder, et nous les avons extraits dans une instance s\u00e9par\u00e9e, qui restera non shard\u00e9e. Cela permet de g\u00e9rer les projets et les compartiments de mani\u00e8re plus coh\u00e9rente, puisqu'il y a un point non shard\u00e9 unique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/c5a1c1a875e756e3dceb5f885fbda2c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il y a aussi dans le sch\u00e9ma des objets qui croissent lin\u00e9airement \u2014 au d\u00e9part, il y en avait des centaines de milliers, maintenant leur nombre se compte par milliards. De tels objets, ainsi que leurs parties, devaient \u00eatre d\u00e9plac\u00e9s vers un cluster shard\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/00bb418cc61ad2e3e8797caf5d1ab202.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons divis\u00e9 le sch\u00e9ma, mais les objets doivent interagir avec les compartiments : chaque objet appartient toujours \u00e0 un compartiment sp\u00e9cifique, plus l'ACL fonctionne sur le compartiment. Ainsi, pour chaque shard contenant des objets, nous conservons une copie fant\u00f4me de chaque compartiment. De plus, lors de la modification des objets et de l'ex\u00e9cution des requ\u00eates, il est n\u00e9cessaire de calculer le volume pour la facturation, c'est pourquoi chaque shard a des compteurs de facturation.<\/p>\n<p><\/p>\n<p>Nous avons \u00e9galement ajout\u00e9 plusieurs tables et composants :<\/p>\n<p><\/p>\n<ul>\n<li>une corbeille, pour la suppression de projets anciens qui sont supprim\u00e9s ou gel\u00e9s ;<\/li>\n<li>une file d'attente pour les t\u00e2ches en arri\u00e8re-plan, c'est-\u00e0-dire que le stockage principal peut ex\u00e9cuter des t\u00e2ches en arri\u00e8re-plan qui doivent \u00eatre effectu\u00e9es sur le cluster;<\/li>\n<li>le support du cycle de vie \u2014 un m\u00e9canisme qui permet de travailler avec des objets et de g\u00e9rer leur cycle de vie.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/933e98dc559eb8e6bac14003215a6836.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9tant donn\u00e9 qu'une partie des donn\u00e9es a \u00e9t\u00e9 r\u00e9partie sur des shards, il a \u00e9t\u00e9 n\u00e9cessaire d'utiliser un proxy de shard. On aurait pu r\u00e9utiliser le routeur pour ce r\u00f4le, mais un proxy de shard distinct, d\u00e9di\u00e9 uniquement \u00e0 la shardisation des donn\u00e9es, permet de r\u00e9cup\u00e9rer les donn\u00e9es en entier depuis le routeur, sans penser \u00e0 la shardisation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/4b181ed4629180e15558f25b1e4d5718.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je vais expliquer s\u00e9par\u00e9ment pourquoi nous n'avons pas choisi une solution existante, mais voulions cr\u00e9er une fonction de shardisation personnalis\u00e9e. <\/p>\n<p><\/p>\n<p>Voyons comment cela fonctionne. Nous avons 256 shards disponibles. Pour chaque bucket, nous d\u00e9finissons une plage \u00e0 l'aide d'une fonction de coh\u00e9rence. C'est simple : tout comme vous utilisez une fonction de coh\u00e9rence pour d\u00e9terminer l'appartenance \u00e0 un shard, vous d\u00e9terminez le shard de d\u00e9part et attribuez une plage :<\/p>\n<p><\/p>\n<p><code>f(bucket, shards) = sous-ensemble<\/code><\/p>\n<p><\/p>\n<p>Donc, si l'on prend un bucket, on peut dire que lui et ses donn\u00e9es seront toujours dans un sous-ensemble sp\u00e9cifique de tous les shards. Cela permet de r\u00e9duire l'influence de certains buckets sur d'autres et de simplifier le traitement des requ\u00eates map-reduce, lorsque nous devons, par exemple, effectuer une liste des objets d'un bucket. Pour cela, il faut interroger tous les shards o\u00f9 ces objets sont stock\u00e9s. Si les objets \u00e9taient r\u00e9partis sur tous les shards, toute liste impacterait l'ensemble du syst\u00e8me, ici cela n'impacte qu'un sous-ensemble sp\u00e9cifique.<\/p>\n<p><\/p>\n<p>Ensuite, chaque objet appartient \u00e0 un bucket sp\u00e9cifique, donc lorsque nous sollicitons un objet, nous le faisons par son nom dans un bucket sp\u00e9cifique. Cela signifie que nous pouvons d\u00e9finir une fonction pour un objet, non pas sur l'ensemble du domaine disponible des shards, mais seulement sur son sous-ensemble de bucket :<\/p>\n<p><\/p>\n<p><code>f(object, subset) = shard<\/code><\/p>\n<p><\/p>\n<p>Nous prenons un objet sp\u00e9cifique, et comme arguments de la fonction, nous passons non pas tous les shards, mais le sous-ensemble de son bucket \u2014 et nous obtenons le shard sp\u00e9cifique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/10480ad2430c228c511ff3cdc5071596.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ainsi, la shardisation est r\u00e9alis\u00e9e, il existe un proxy de shard. Ensuite, il reste \u00e0 acc\u00e9der au proxy de shard depuis le routeur et la base de donn\u00e9es des m\u00e9tadonn\u00e9es. Par exemple, pour cr\u00e9er des objets de copies de sauvegarde \u2014 lorsque nous cr\u00e9ons un bucket, le stockage principal doit cr\u00e9er un repr\u00e9sentant de ce bucket sur tous les shards o\u00f9 il doit \u00eatre pr\u00e9sent.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/bb34d1f747903a3c2f08f582e4424787.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"kak-my-realizovali-resharding\">Comment nous avons mis en \u0153uvre le resharding<\/h2>\n<p><\/p>\n<p>Le plus grand d\u00e9fi du sharding est le resharing. Il \u00e9tait crucial pour nous de le r\u00e9aliser sans downtime, car le syst\u00e8me \u00e9tait d\u00e9j\u00e0 en production. Je vais montrer comment nous avons r\u00e9solu le probl\u00e8me \u00e0 l'aide d'une t\u00e2che similaire de migration de donn\u00e9es en direct d'un projet \u00e0 un autre.<\/p>\n<p><\/p>\n<p>Voici le sch\u00e9ma de notre cluster, obtenu apr\u00e8s l'impl\u00e9mentation du sharding. Nous avons nginx, l'API S3, un routeur, une base primaire avec des projets, un proxy sharding et directement des shards.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/0e6bd16c7fc47437b3b7d96b6d9809a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au-dessus, j'ai omis de mentionner qu'\u00e0 un certain stade du projet, il y avait une t\u00e2che produit : \u00ab Lancer un autre stockage, Icebox, comme Hotbox, mais pour les donn\u00e9es froides \u00bb. En fait, c'est le m\u00eame type de stockage, mais avec des URL diff\u00e9rentes et sans caches.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/9ce9085e1d03e9a99b6b8ccc0717c653.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Icebox \u00e9tait moins utilis\u00e9 que Hotbox, donc il a mis un certain temps \u00e0 b\u00e9n\u00e9ficier d'un sharding. Finalement, nous avons d\u00e9cid\u00e9 de l'abandonner et de fusionner Hotbox et Icebox en un seul service, en s\u00e9parant simplement les classes de stockage. <\/p>\n<p><\/p>\n<p>Les buckets dans les stockages ne se chevauchent pas, il \u00e9tait donc facile de les fusionner et de les d\u00e9placer, mais les clients utilisaient \u00e0 la fois l'un et l'autre stockage, il fallait donc r\u00e9soudre le probl\u00e8me du downtime. Nous ne pouvions pas simplement \u00e9teindre et copier. Nous avons migr\u00e9 en plusieurs \u00e9tapes.<\/p>\n<p><\/p>\n<p>Tout d'abord, nous avons synchronis\u00e9 les stockages primaires. Nous avions Tarantool et nous pouvions lors de la cr\u00e9ation d'un objet faire ce qui suit : <\/p>\n<p><\/p>\n<ul>\n<li>une demande de cr\u00e9ation de bucket arrive \u00e0 la base, par exemple dans Hotbox ;<\/li>\n<li>Tarantool v\u00e9rifie dans une autre base (dans ce cas, dans Icebox) qu'il n'existe pas de tel bucket ;<\/li>\n<li>si le bucket existe, la base indique qu'il ne peut pas \u00eatre cr\u00e9\u00e9, et il est synchronis\u00e9 comme existant.<br \/>\n<img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/6694c9804f09942416c1717b455b9fd3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Synchronisation des buckets<\/em><\/li>\n<\/ul>\n<p><\/p>\n<p>Dans le stockage qui devait recevoir toutes les donn\u00e9es, nous avons introduit pour les projets et les buckets un indicateur indiquant o\u00f9 l'objet est stock\u00e9. Il pouvait \u00eatre stock\u00e9 localement, c'est-\u00e0-dire dans Hotbox, dans Icebox \u2014 alors il n'y avait aucune donn\u00e9e dans le nouveau stockage, ou il pouvait \u00eatre en \u00e9tat de migration.<\/p>\n<p><\/p>\n<p>Si un projet ou un bucket avait l'indicateur Migrating, alors pendant la migration, la demande \u00e9tait d'abord ex\u00e9cut\u00e9e dans le nouveau stockage, celui o\u00f9 les donn\u00e9es devaient se trouver, et si elles n'y \u00e9taient pas, les demandes \u00e9taient redirig\u00e9es vers le stockage alternatif.<\/p>\n<p><\/p>\n<p>Ensuite, nous avons bascul\u00e9 le trafic. \u00c9tant donn\u00e9 que l'API pouvait g\u00e9rer les demandes d'Icebox ainsi que celles de Hotbox, nous avons pu changer le trafic sans downtime, simplement en d\u00e9pla\u00e7ant les h\u00f4tes et en ajoutant les enregistrements correspondants dans Nginx. <\/p>\n<p><\/p>\n<p>Apr\u00e8s le redirection du trafic, Nginx et l'API d'Icebox pouvaient \u00eatre retir\u00e9s.<br \/>\nNous avons ensuite supprim\u00e9 Icebox nginx et l'API S3 \u2014 et tout a fonctionn\u00e9 :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/62d9f960fc1f11b875a8f8a5aa8e8152.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons ensuite lanc\u00e9 un processus de migration en arri\u00e8re-plan qui fonctionne dans la base de donn\u00e9es \u2014 elle passe en revue tous les projets et leurs buckets un par un, attribue le statut Migrating, transf\u00e8re les donn\u00e9es et, \u00e0 la fin du transfert, change le statut en Local.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/1a3129136f7ccacfdcff260f10cb0605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apr\u00e8s le transfert des donn\u00e9es, nous n'avons plus besoin de l'ancien stockage, et nous supprimons les derni\u00e8res parties de l'ancien syst\u00e8me, ainsi que le support du statut de migration dans le code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/13b6f11add40c21a3b9afc05dd0dfea9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le resharding de l'ancien stockage vers un stockage shard\u00e9 a \u00e9t\u00e9 r\u00e9alis\u00e9 selon les m\u00eames principes :<\/p>\n<p><\/p>\n<ul>\n<li>Tous les buckets ont \u00e9t\u00e9 marqu\u00e9s comme <code>Non-sharded<\/code>. Toutes les requ\u00eates \u00e0 eux allaient vers le stockage original, non shard\u00e9.<\/li>\n<li>De nouveaux buckets \u00e9taient imm\u00e9diatement cr\u00e9\u00e9s avec le statut <code>Sharded<\/code>.<\/li>\n<li>Nous avons pris les buckets un par un, avons d\u00e9fini le statut <code>Migrating<\/code> et avons transf\u00e9r\u00e9 les donn\u00e9es.<\/li>\n<\/ul>\n<p><\/p>\n<p>Les requ\u00eates \u00e9taient trait\u00e9es selon le principe suivant :<\/p>\n<p><\/p>\n<ul>\n<li>Nous lisons dans le nouveau, puis dans l'ancien.<\/li>\n<li>Nous cr\u00e9ons uniquement dans le nouveau.<\/li>\n<li>Nous mettons \u00e0 jour en deux phases : si le nouveau n\u2019existe pas, nous transf\u00e9rons de l\u2019ancien au nouveau, puis nous mettons \u00e0 jour.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"rabota-s-ssl-sertifikatami\">Gestion des certificats SSL<\/h2>\n<p><\/p>\n<blockquote><p>Sur le frontend, nous utilisons Nginx. Dans notre cas, ce n'est pas un Nginx ordinaire, mais un OpenResty, Nginx avec le support de LuaJIT.<\/p><\/blockquote>\n<p>Une autre partie du syst\u00e8me \u2014 gestion des certificats SSL. Dans le stockage S3, vous pouvez d\u00e9finir votre propre domaine pour acc\u00e9der \u00e0 un bucket sp\u00e9cifique, simplement gr\u00e2ce \u00e0 <code>CNAME<\/code>. Mais sans HTTPS aujourd'hui, cela n'est pas possible : un domaine personnalis\u00e9 implique un certificat SSL personnalis\u00e9. <\/p>\n<p><\/p>\n<p>Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, Nginx est responsable de l'\u00e9quilibrage et de la terminaison SSL. Dans notre cas, ce n'est pas un Nginx ordinaire, mais un OpenResty, Nginx avec le support de LuaJIT.<\/p>\n<p><\/p>\n<p>Cela nous a permis d'apprendre tr\u00e8s facilement \u00e0 notre Nginx \u00e0 d\u00e9livrer des certificats arbitraires. De plus, il \u00e9tait n\u00e9cessaire de d\u00e9livrer des certificats de mani\u00e8re dynamique (sans avoir besoin de les \u00e9crire dans le fichier de configuration). Nous avons utilis\u00e9 l'extension <code>ssl_certificate_by_lua<\/code>, qui permet de lire le certificat \u00e0 partir d'une source arbitraire directement pendant le handshake TLS. Comme stockage de certificats, nous avons \u00e9galement utilis\u00e9 Tarantool : cela permet de g\u00e9rer les certificats de l'ext\u00e9rieur et assure une d\u00e9livrance extr\u00eamement rapide.<\/p>\n<p><\/p>\n<p>Un d\u00e9mon distinct a \u00e9galement \u00e9t\u00e9 impl\u00e9ment\u00e9, dont la t\u00e2che consiste \u00e0 mettre \u00e0 jour r\u00e9guli\u00e8rement les certificats \u00e9mis par Let\u2019s Encrypt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Architecture S3\u00a0: 3 ans d&#039;\u00e9volution du stockage Cloud de Mail.ru\" src=\"\/wp-content\/uploads\/2020\/08\/8d61c1cb3084d9eb4eb8faa745e212db.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"chto-by-ya-sohranil-a-chto-sdelal-po-drugomu-esli-razrabatyvat-hranilische-zanovo\">Ce que j'aurais conserv\u00e9 et ce que j'aurais fait diff\u00e9remment en red\u00e9veloppant un stockage.<\/h2>\n<p><\/p>\n<h3 id=\"chto-nuzhno-bylo-ispolzovat-s-samogo-nachala\">Ce qui aurait d\u00fb \u00eatre utilis\u00e9 d\u00e8s le d\u00e9part.<\/h3>\n<p><\/p>\n<p><strong>Sharding d\u00e8s le d\u00e9part.<\/strong>. La re-sharding a caus\u00e9 pas mal de probl\u00e8mes. C'est facile \u00e0 faire, mais n\u00e9anmoins, si l'on commence des projets qui doivent \u00eatre \u00e9volutifs, il vaut mieux directement opter pour un cluster shard\u00e9, m\u00eame avec un minimum de n\u0153uds. La mise en \u0153uvre du sharding d\u00e8s le d\u00e9part est presque gratuite par rapport \u00e0 l'int\u00e9gration du sharding dans un syst\u00e8me en production.<\/p>\n<p><\/p>\n<p><strong>Travailler avec Tarantool via les load balancers.<\/strong>. Maintenant, nous int\u00e9grons toutes les nouvelles bases au travail via des load balancers. Cela permet d'\u00e9largir les fonctionnalit\u00e9s et d'atteindre une plus grande r\u00e9silience. <\/p>\n<p><\/p>\n<p><strong>Auto-failover.<\/strong>. J'aurais install\u00e9 tous les outils n\u00e9cessaires pour l'auto-failover, car les premiers \u00e9checs apr\u00e8s le lancement \u00e9taient li\u00e9s \u00e0 son absence. Apr\u00e8s l'exp\u00e9rience avec S3, tous les produits suivants ont \u00e9t\u00e9 lanc\u00e9s en tenant compte de cela.<\/p>\n<p><\/p>\n<p><strong>La fonctionnalit\u00e9 S3 \u00ab Versioning \u00bb.<\/strong>. Au d\u00e9part, cela semblait \u00eatre une fonctionnalit\u00e9 peu recherch\u00e9e. Int\u00e9grer cette possibilit\u00e9 dans l'architecture d'un syst\u00e8me op\u00e9rationnel est extr\u00eamement difficile.<\/p>\n<p><\/p>\n<p><strong>Facturation s\u00e9par\u00e9e.<\/strong>. La fa\u00e7on dont nous avons int\u00e9gr\u00e9 la facturation dans notre syst\u00e8me a bien fonctionn\u00e9 au d\u00e9but, mais par la suite, cela est devenu un frein. Il aurait mieux valu l'impl\u00e9menter comme un service compl\u00e8tement ind\u00e9pendant.<\/p>\n<p><\/p>\n<h3 id=\"chto-bylo-udachnym-resheniem\">Ce qui \u00e9tait une d\u00e9cision judicieuse.<\/h3>\n<p><\/p>\n<p><strong>Mod\u00e8le de donn\u00e9es.<\/strong>. L'histoire a montr\u00e9 qu'au fur et \u00e0 mesure du d\u00e9veloppement du service, nous correspondons assez pr\u00e9cis\u00e9ment au mod\u00e8le de donn\u00e9es d'Amazon, ce qui nous permet de r\u00e9aliser les fonctionnalit\u00e9s disponibles l\u00e0-bas.<\/p>\n<p><\/p>\n<p><strong>Sch\u00e9ma de sharding.<\/strong>. Je soutiendrais des sharding de plage similaires par compartiments, car cela permet de bien r\u00e9partir les demandes de diff\u00e9rents compartiments \u00e0 travers un grand cluster.<\/p>\n<p><\/p>\n<p><strong>Utilisation de Tarantool.<\/strong>. Tarantool a beaucoup aid\u00e9 au d\u00e9veloppement et \u00e0 la modification du service. Nous avons facilement travaill\u00e9 avec les donn\u00e9es, transform\u00e9 et shard\u00e9 le stockage sans avoir besoin de monter au niveau de l'application. <\/p>\n<p><\/p>\n<blockquote><p>Cette pr\u00e9sentation a \u00e9t\u00e9 prononc\u00e9e pour la premi\u00e8re fois \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Databases Meetup<\/a><\/noindex> par Mail.ru Cloud Solutions &amp; Tarantool. Voir <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=jM4hL2u6JM0&amp;list=PLQzTaxmOHjntyNRPWhaWHqlHp8UN_wgQ3\">vid\u00e9o<\/a><\/noindex> d'autres pr\u00e9sentations et abonnez-vous aux annonces des \u00e9v\u00e9nements sur Telegram. <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Autour de Kubernetes dans Mail.ru Group.<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Vous pouvez \u00e9galement consulter mon ancienne pr\u00e9sentation sur S3 ou lire l'article de mon coll\u00e8gue sur le stockage en bloc.<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=O0iIADHgBVc\">Ing\u00e9nierie inverse de l'architecture Amazon S3 et comment le stockage S3 de MCS avait l'air il y a 3 ans.<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/472694\/\">Plus que Ceph : stockage en blocs dans le cloud MCS<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/513356\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Storage Corridor by St-Pete \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f Mons Anderson, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Mail.ru Cloud Solutions, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043d\u0430\u0448\u0435 S3-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0443\u0434\u0430\u0447\u043d\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u043e\u0438\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0443\u043b\u044f \u0441\u0435\u0439\u0447\u0430\u0441. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430 @Databases Meetup by Mail.ru Cloud Solutions &amp; Tarantool. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91091,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91090","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=\"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\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage\" \/>\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\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 S3: 3 \u0433\u043e\u0434\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Mail.ru Cloud Storage | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage\" \/>\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-08-08T11:42:11+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-08T11:42:11+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\udd47Architecture S3 : 3 ans d'\u00e9volution de Mail.ru Cloud Storage | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","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\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 S3: 3 \u0433\u043e\u0434\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Mail.ru Cloud Storage | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","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-08-08T11:42:11+00:00","article:modified_time":"2020-08-08T11:42:11+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91090","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 12:34:25","updated":"2022-10-02 13:27:50","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\/91090","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=91090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/91090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/91091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=91090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=91090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=91090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}