{"id":84114,"date":"2020-06-05T07:42:55","date_gmt":"2020-06-05T05:42:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah"},"modified":"2020-06-05T07:42:55","modified_gmt":"2020-06-05T05:42:55","slug":"one-cloud-os-urovnya-data-czentra-v-odnoklassnikah","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah","title":{"rendered":"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/fa983acacec59ff2d4ed098f87223971.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo zusammen! Mein Name ist Oleg Anastassiev, ich arbeite bei Odnoklassniki im Plattform-Team. Neben mir stehen viele Server zur Verf\u00fcgung. Wir haben vier Rechenzentren mit etwa 500 Racks und mehr als 8000 Servern. Irgendwann wurde uns klar, dass die Implementierung eines neuen Managementsystems es uns erm\u00f6glichen w\u00fcrde, die Hardware effizienter auszulasten, den Zugang zu verwalten, die (Re)Verteilung von Rechenressourcen zu automatisieren, neue Dienste schneller zu starten und schneller auf gro\u00dfe St\u00f6rungen zu reagieren. <\/p>\n<p><\/p>\n<p>Was haben wir daraus gemacht? <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Neben mir und der ganzen Hardware gibt es noch viele Menschen, die mit dieser Hardware arbeiten: Ingenieure vor Ort in den Rechenzentren, Netzwerkspezialisten, die Netzwerkausr\u00fcstung konfigurieren, Administratoren oder SREs, die f\u00fcr die Ausfallsicherheit der Infrastruktur sorgen, sowie Teams von Entwicklern, die jeweils f\u00fcr bestimmte Funktionen des Portals verantwortlich sind. Die von ihnen entwickelte Software funktioniert etwa so:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/592fd0acfa7322eb80fbb85601a92918.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Benutzeranfragen gelangen wie auf die Fronten des Hauptportals <noindex><a rel=\"nofollow\" href=\"http:\/\/www.ok.ru\/\">www.ok.ru<\/a><\/noindex>, sowie auf andere, wie beispielsweise die API-Endpoints f\u00fcr Musik. Diese greifen auf Anwendungsserver zu, um Gesch\u00e4ftslogik zu verarbeiten, wobei bei der Bearbeitung einer Anfrage die erforderlichen spezialisierten Microservices aufgerufen werden \u2013 wie one-graph (Graf der sozialen Beziehungen), user-cache (Cache der Benutzerprofile) und so weiter.<\/p>\n<p><\/p>\n<p>Jeder dieser Dienste ist auf vielen Maschinen bereitgestellt, und jede hat verantwortliche Entwickler, die f\u00fcr die Funktionalit\u00e4t der Module, deren Betrieb und technologische Weiterentwicklung zust\u00e4ndig sind. Alle diese Dienste laufen auf physischen Servern, und bis vor kurzem haben wir genau eine Aufgabe auf einen Server ausgef\u00fchrt, d. h. der Server war auf eine bestimmte Aufgabe spezialisiert.<\/p>\n<p><\/p>\n<p>Warum ist das so? Dieser Ansatz hatte mehrere Vorteile:<\/p>\n<p><\/p>\n<ul>\n<li>Die <strong>massive Verwaltung wird erleichtert<\/strong>. Angenommen, die Aufgabe erfordert bestimmte Bibliotheken oder spezifische Einstellungen. In diesem Fall wird der Server genau einer bestimmten Gruppe zugeordnet, eine richtlinienbasierte Konfiguration f\u00fcr diese Gruppe (oder eine bereits bestehende) wird erstellt, und diese Konfiguration wird zentral und automatisch auf alle Server dieser Gruppe verteilt.<\/li>\n<li>Die <strong>Diagnose wird vereinfacht<\/strong>. Angenommen, Sie beobachten eine erh\u00f6hte CPU-Auslastung und stellen fest, dass diese Last nur durch die Aufgabe verursacht werden kann, die auf dieser Hardware l\u00e4uft. Die Suche nach dem Schuldigen endet sehr schnell.<\/li>\n<li>Die <strong>Monitoring<\/strong>. Wenn mit dem Server etwas nicht stimmt, zeigt das Monitoring dies an, und Sie wissen genau, wer schuld ist.<\/li>\n<\/ul>\n<p><\/p>\n<p>Einem Dienst, der aus mehreren Replikaten besteht, werden mehrere Server zugewiesen \u2013 jeweils einer pro Replikat. Die Bereitstellung von Rechenressourcen f\u00fcr den Dienst gestaltet sich somit sehr einfach: So viele Server der Dienst hat, so viele Ressourcen kann er maximal beanspruchen. \u201eEinfach\u201c hei\u00dft hier nicht, dass es leicht zu bedienen ist, sondern dass die Ressourcen manuell verteilt werden.<\/p>\n<p><\/p>\n<p>Dieser Ansatz erm\u00f6glichte es uns au\u00dferdem, <strong>spezialisierte Hardwarekonfigurationen<\/strong> F\u00fcr Aufgaben, die auf diesem Server durchgef\u00fchrt werden, verwenden wir einen 4U-Server mit einem Geh\u00e4use f\u00fcr 38 Laufwerke, wenn diese Aufgaben gro\u00dfe Datenmengen speichern. Bei rein rechenintensiven Aufgaben k\u00f6nnen wir einen g\u00fcnstigeren 1U-Server anschaffen. Dies ist in Bezug auf die Rechenressourcen effizient. Dieser Ansatz erm\u00f6glicht es uns auch, bei einer Last, die mit einem sozialen Netzwerk, das uns freundlich gesinnt ist, vergleichbar ist, viermal weniger Maschinen zu nutzen. <\/p>\n<p><\/p>\n<p>Eine solche Effizienz der Nutzung von Rechenressourcen sollte auch wirtschaftliche Effizienz gew\u00e4hrleisten, wenn man davon ausgeht, dass Server die teuersten Komponenten sind. Lange Zeit war die Hardware am teuersten, und wir haben viel Aufwand betrieben, um die Kosten der Hardware zu senken, indem wir Algorithmen zur Gew\u00e4hrleistung der Fehlertoleranz entwickelt haben, um die Anforderungen an die Zuverl\u00e4ssigkeit der Ausr\u00fcstung zu reduzieren. Heute sind wir an einem Punkt angekommen, an dem der Preis f\u00fcr einen Server nicht mehr entscheidend ist. Wenn man die neuesten exotischen Modelle au\u00dfen vor l\u00e4sst, spielt die spezifische Konfiguration der Server im Rack keine Rolle. Jetzt stehen wir vor einem neuen Problem \u2014 den Kosten des Platzes, den ein Server im Rechenzentrum einnimmt, also dem Platz im Rack.<\/p>\n<p><\/p>\n<p>Als wir uns dessen bewusst wurden, haben wir beschlossen, die Effizienz der Racknutzung zu berechnen.<br \/>\nWir haben den Preis des leistungsst\u00e4rksten Servers aus einer wirtschaftlich sinnvollen Perspektive genommen, berechnet, wie viele solcher Server wir in die Racks unterbringen k\u00f6nnen, welche Aufgaben wir basierend auf dem alten Modell \"ein Server = eine Aufgabe\" darauf ausf\u00fchren k\u00f6nnten und wie gut diese Aufgaben die Hardware auslasten w\u00fcrden. Die Berechnungen waren ersch\u00fctternd. Es stellte sich heraus, dass die Effizienz der Racknutzung bei uns nur etwa 11 % betr\u00e4gt. Die Schlussfolgerung ist offensichtlich: Die Effizienz der Rechenzentren muss verbessert werden. Nat\u00fcrlich scheint die L\u00f6sung klar zu sein: Man sollte auf einem Server mehrere Aufgaben gleichzeitig ausf\u00fchren. Doch hier beginnen die Herausforderungen. <\/p>\n<p><\/p>\n<p>Die Massenkonfiguration wird erheblich komplizierter \u2013 jetzt ist es unm\u00f6glich, einem Server eine bestimmte Gruppe zuzuweisen. Schlie\u00dflich k\u00f6nnen auf einem Server mehrere Aufgaben verschiedener Teams ausgef\u00fchrt werden. Zudem kann die Konfiguration f\u00fcr unterschiedliche Anwendungen konfliktreich sein. Auch die Diagnose wird schwieriger: Wenn Sie einen Anstieg der CPU- oder Festplattenauslastung auf einem Server feststellen, wissen Sie nicht, welche Aufgabe Probleme verursacht.<\/p>\n<p><\/p>\n<p>Das Wichtigste ist jedoch, dass es keine Isolation zwischen den auf einer Maschine laufenden Aufgaben gibt. Zum Beispiel zeigt das Diagramm die durchschnittliche Antwortzeit einer Serveraufgabe vor und nachdem eine andere, nicht miteinander verbundene Berechnungsanwendung auf demselben Server gestartet wurde \u2013 die Antwortzeit der Hauptaufgabe hat sich erheblich erh\u00f6ht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/c7c07359ae572ca8c84a4c63559e4083.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist offensichtlich, dass Aufgaben entweder in Containern oder in virtuellen Maschinen gestartet werden m\u00fcssen. Da praktisch alle unsere Aufgaben unter dem Betriebssystem Linux oder daf\u00fcr angepasst laufen, m\u00fcssen wir nicht viele verschiedene Betriebssysteme unterst\u00fctzen. Daher ist Virtualisierung nicht erforderlich; aufgrund der zus\u00e4tzlichen Overheads ist sie weniger effizient als Containerisierung.<\/p>\n<p><\/p>\n<p>Docker-Container sind eine hervorragende L\u00f6sung, um Aufgaben direkt auf Servern auszuf\u00fchren: Die Dateisystem-Images l\u00f6sen Konflikte in der Konfiguration effektiv. Da Images aus mehreren Schichten bestehen k\u00f6nnen, reduzieren wir erheblich den Datenumfang, der f\u00fcr die Bereitstellung auf der Infrastruktur erforderlich ist, indem wir gemeinsame Komponenten in separate Basis-Schichten auslagern. Dadurch werden die Basis- und volumin\u00f6sen Schichten schnell in der gesamten Infrastruktur zwischengespeichert, und f\u00fcr die Bereitstellung verschiedener Anwendungsarten und Versionen sind nur noch kleine Schichten zu \u00fcbertragen. <\/p>\n<p><\/p>\n<p>Au\u00dferdem bieten uns das bereitgestellte Registry und das Tagging von Images in Docker die notwendigen Werkzeuge f\u00fcr das Versionieren und die Bereitstellung von Code in die Produktion.<\/p>\n<p><\/p>\n<p>Docker bietet, wie jede \u00e4hnliche Technologie, eine gewisse Containerisolation direkt ab Werk. Zum Beispiel gibt es eine Speicherkapazit\u00e4tsbegrenzung \u2013 jeder Container erh\u00e4lt ein Limit f\u00fcr den Speicherverbrauch auf der Maschine, das er nicht \u00fcberschreiten kann. Auch die CPU-Nutzung der Container kann isoliert werden. F\u00fcr uns war jedoch die standardm\u00e4\u00dfige Isolation nicht ausreichend. Aber dazu sp\u00e4ter mehr.<\/p>\n<p><\/p>\n<p>Das unmittelbare Starten von Containern auf Servern ist nur ein Teil der Herausforderung. Ein anderer Aspekt betrifft die Platzierung der Container auf den Servern. Wir m\u00fcssen verstehen, welcher Container auf welchen Server gesetzt werden kann. Das ist keine einfache Aufgabe, da die Container so nah wie m\u00f6glich auf den Servern platziert werden m\u00fcssen, ohne die Geschwindigkeit ihrer Arbeit zu beeintr\u00e4chtigen. Eine solche Platzierung kann auch in Bezug auf die Ausfallsicherheit kompliziert sein. H\u00e4ufig m\u00f6chten wir Replikate desselben Dienstes in verschiedenen Racks oder sogar in unterschiedlichen Hallen des Rechenzentrums unterbringen, um bei einem Ausfall eines Racks oder einer Halle nicht alle Replikate des Services zu verlieren. <\/p>\n<p><\/p>\n<p>Container manuell zu verteilen, ist keine Option, wenn man 8.000 Server und 8.000 bis 16.000 Container hat. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus wollten wir den Entwicklern mehr Eigenverantwortung bei der Ressourcenzuteilung geben, sodass sie ihre Dienste selbstst\u00e4ndig in der Produktion bereitstellen k\u00f6nnen, ohne die Hilfe eines Administrators. Dabei war es uns wichtig, die Kontrolle zu behalten, um sicherzustellen, dass kein unwesentlicher Dienst alle Ressourcen unserer Rechenzentren verbraucht. <\/p>\n<p><\/p>\n<p>Offensichtlich ben\u00f6tigen wir eine Verwaltungs-EBene, die dies automatisch \u00fcbernimmt.<\/p>\n<p><\/p>\n<p>Hier kommen wir zu einem einfachen und klaren Bild, das alle Architekten lieben: drei K\u00e4stchen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/079df6e79874ef55b0d967fde3d5feca.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>one-cloud masters \u2013 ein hochverf\u00fcgbarer Cluster, der f\u00fcr die Orchestrierung der Cloud verantwortlich ist. Der Entwickler sendet ein Manifest an den Master, das alle notwendigen Informationen f\u00fcr die Bereitstellung des Dienstes enth\u00e4lt. Der Master gibt basierend darauf Befehle an die ausgew\u00e4hlten Minions (Rechner, die f\u00fcr das Starten von Containern vorgesehen sind). Auf den Minions befindet sich unser Agent, der den Befehl erh\u00e4lt, eigene Befehle an Docker ausgibt, und Docker konfiguriert den Linux-Kernel, um den entsprechenden Container zu starten. Neben der Ausf\u00fchrung von Befehlen informiert der Agent den Master kontinuierlich \u00fcber \u00c4nderungen im Zustand sowohl des Minion-Rechners als auch der auf ihm betriebenen Container.<\/p>\n<p><\/p>\n<h2 id=\"raspredelenie-resursov\">Ressourcenzuteilung<\/h2>\n<p><\/p>\n<p>Jetzt betrachten wir die anspruchsvollere Aufgabe der Ressourcenverteilung f\u00fcr mehrere Minionen.<\/p>\n<p><\/p>\n<p>Rechenressourcen in one-cloud sind:<\/p>\n<p><\/p>\n<ul>\n<li>Die Rechenleistung der CPU, die von einer bestimmten Aufgabe ben\u00f6tigt wird. <\/li>\n<li>Der verf\u00fcgbare Speicher f\u00fcr die Aufgabe. <\/li>\n<li>Netzwerkverkehr. Jeder der Minionen hat eine spezifische Netzwerkschnittstelle mit begrenzter Bandbreite, daher k\u00f6nnen Aufgaben nicht ohne Ber\u00fccksichtigung des dabei \u00fcbertragenen Datenvolumens verteilt werden. <\/li>\n<li>Festplatten. Neben dem, naheliegenderweise, ben\u00f6tigten Platz f\u00fcr die Daten der Aufgabe, weisen wir auch den Festplattentyp zu: HDD oder SSD. Festplatten k\u00f6nnen eine endliche Anzahl von Anfragen pro Sekunde bedienen \u2014 IOPS. Daher reservieren wir f\u00fcr Aufgaben, die mehr IOPS erzeugen als ein einzelnes Laufwerk bew\u00e4ltigen kann, auch 'Spindeln' \u2014 d. h. Speicherger\u00e4te, die ausschlie\u00dflich f\u00fcr die Aufgabe reserviert werden m\u00fcssen.<\/li>\n<\/ul>\n<p><\/p>\n<p>F\u00fcr einen bestimmten Dienst, zum Beispiel f\u00fcr user-cache, k\u00f6nnten wir die ben\u00f6tigten Ressourcen folgenderma\u00dfen angeben: 400 CPU-Kerne, 2,5 TB Speicher, 50 Gbit\/s Verkehr in beide Richtungen, 6 TB Speicher auf HDD, verteilt auf 100 Spindeln. Oder in einer f\u00fcr uns vertrauteren Form so:<\/p>\n<p><\/p>\n<pre><code>alloc:\n    cpu: 400\n    mem: 2500\n    lan_in: 50g\n    lan_out: 50g\n    hdd:100x6T<\/code><\/pre>\n<p><\/p>\n<p>Die Ressourcen des user-cache-Dienstes nutzen nur einen Teil der verf\u00fcgbaren Ressourcen in der Produktionsinfrastruktur. Daher m\u00f6chten wir sicherstellen, dass der user-cache, egal ob durch menschliches Versagen oder nicht, nicht mehr Ressourcen verbraucht als ihm zugewiesen sind. Das hei\u00dft, wir m\u00fcssen die Ressourcen begrenzen. Aber woran k\u00f6nnten wir das Kontingent festmachen?<\/p>\n<p><\/p>\n<p>Lassen Sie uns zu unserem stark vereinfachten Schema der Komponenteninteraktion zur\u00fcckkehren und es mit mehr Details neu zeichnen \u2014 so: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/27e5bfbffadd3d4b9fdc6bf138d135ed.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ins Auge f\u00e4llt:<\/p>\n<p><\/p>\n<ul>\n<li>Das Web-Frontend und die Musik nutzen isolierte Cluster desselben Anwendungsservers.<\/li>\n<li>Es lassen sich logische Schichten identifizieren, zu denen diese Cluster geh\u00f6ren: Frontends, Caches, Datenspeicher- und Verwaltungs-Schichten.<\/li>\n<li>Der Frontend ist heterogen, es handelt sich um verschiedene funktionale Teilsysteme. <\/li>\n<li>Caches k\u00f6nnen ebenfalls \u00fcber die Teilsysteme verteilt werden, deren Daten sie zwischenspeichern.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lassen Sie uns das Bild noch einmal neu zeichnen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/905dacc0aca859e65bd33ef751a557cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wow! Wir sehen die Hierarchie! Das bedeutet, dass wir Ressourcen effizienter zuteilen k\u00f6nnen: einen verantwortlichen Entwickler f\u00fcr einen Knoten dieser Hierarchie zuweisen, der einer funktionalen Teilsystem entspricht (wie \u201emusic\u201c im Bild), und auch die Quote an dasselbe Hierarchie-Niveau binden. Eine solche Hierarchie erm\u00f6glicht es uns auch, die Dienste flexibler zu organisieren, um die Verwaltung zu erleichtern. Zum Beispiel teilen wir alle Web-Server, da es sich um eine sehr gro\u00dfe Gruppe handelt, in mehrere kleinere Gruppen auf, die im Bild als group1 und group2 dargestellt sind.<\/p>\n<p><\/p>\n<p>Indem wir \u00fcberfl\u00fcssige Linien entfernen, k\u00f6nnen wir jeden Knoten unseres Bildes in einer flacheren Form darstellen: <strong>group1.web.front<\/strong>, <strong>api.music.front<\/strong>, <strong>user-cache.cache<\/strong>.<\/p>\n<p><\/p>\n<p>So kommen wir zum Konzept der \"hierarchischen Warteschlange\". Sie hat einen Namen, wie \"group1.web.front\". Eine Ressourcenquote und Benutzerrechte werden ihr zugewiesen. Einer Person aus dem DevOps-Team geben wir die Berechtigung, den Dienst in die Warteschlange zu senden, und diese Person kann etwas in der Warteschlange starten, w\u00e4hrend jemand aus dem OpsDev-Team Administratorrechte erh\u00e4lt und somit die Warteschlange verwalten, Personen zuweisen und ihnen Rechte erteilen kann usw. Die Dienste, die in dieser Warteschlange gestartet werden, werden im Rahmen der Warteschlangenquote ausgef\u00fchrt. Wenn die Rechenressourcen der Warteschlange nicht ausreichen, um alle Dienste gleichzeitig auszuf\u00fchren, werden sie nacheinander ausgef\u00fchrt, wodurch tats\u00e4chlich eine Warteschlange entsteht. <\/p>\n<p><\/p>\n<p>Betrachten wir die Dienste n\u00e4her. Ein Dienst hat einen vollst\u00e4ndigen Namen, der immer den Namen der Warteschlange enth\u00e4lt. Somit wird der Dienst f\u00fcr das Web-Frontend den Namen <strong>ok-web.group1.web.front<\/strong>tragen. Der Dienst des Anwendungsservers, auf den er zugreift, wird den Namen <strong>ok-app.group1.web.front<\/strong>. Jeder Service hat ein Manifest, das alle notwendigen Informationen f\u00fcr die Platzierung auf bestimmten Maschinen angibt: wie viele Ressourcen diese Aufgabe ben\u00f6tigt, welche Konfiguration erforderlich ist, wie viele Replikate vorhanden sein m\u00fcssen und Eigenschaften zur Fehlerbehandlung dieses Services. Nach der Bereitstellung des Services auf den Maschinen entstehen seine Instanzen. Diese werden ebenfalls eindeutig benannt \u2013 durch die Instanznummer und den Servicenamen: <strong>1.ok-web.group1.web.front, 2.ok-web.group1.web.front, \u2026<\/strong><\/p>\n<p><\/p>\n<p>Das ist sehr praktisch: Wenn man nur den Namen des laufenden Containers betrachtet, kann man sofort viele Informationen ableiten.<\/p>\n<p><\/p>\n<p>Kommen wir nun n\u00e4her dazu, was diese Instanzen tats\u00e4chlich tun: die Aufgaben.<\/p>\n<p><\/p>\n<h2 id=\"klassy-izolyacii-zadach\">Isolation Klassen der Aufgaben<\/h2>\n<p><\/p>\n<p>Alle Aufgaben in OK (und wahrscheinlich \u00fcberall) lassen sich in Gruppen einteilen:<\/p>\n<p><\/p>\n<ul>\n<li><strong>Aufgaben mit kurzer Latenz \u2014 prod<\/strong>. F\u00fcr solche Aufgaben und Services ist die Antwortzeit (latency) von gro\u00dfer Bedeutung, wie schnell jede Anfrage vom System verarbeitet wird. Beispiele f\u00fcr Aufgaben: Webfronts, Caches, Anwendungsserver, OLTP-Speicher usw.<\/li>\n<li><strong>Rechenintensive Aufgaben \u2014 batch<\/strong>. Hier ist die Verarbeitungsgeschwindigkeit jeder einzelnen Anfrage weniger wichtig. Entscheidend ist, wie viele Berechnungen diese Aufgabe in einem bestimmten (gro\u00dfen) Zeitrahmen ausf\u00fchren kann (Durchsatz). Solche Aufgaben betreffen MapReduce, Hadoop, maschinelles Lernen und Statistik.<\/li>\n<li><strong>Hintergrundaufgaben \u2014 idle<\/strong>. F\u00fcr solche Aufgaben sind weder Latenz noch Durchsatz von gro\u00dfer Bedeutung. Dazu geh\u00f6ren verschiedene Tests, Migrationen, Neuberechnungen und Konvertierungen von Daten aus einem Format in ein anderes. Sie sind einerseits \u00e4hnlich zu Berechnungen, andererseits spielt es keine Rolle, wie schnell sie abgeschlossen werden. <\/li>\n<\/ul>\n<p><\/p>\n<p>Lassen Sie uns betrachten, wie solche Aufgaben Ressourcen verbrauchen, beispielsweise von der zentralen Verarbeitungseinheit.<\/p>\n<p><\/p>\n<p><strong>Aufgaben mit kurzer Latenz.<\/strong> Das Verbrauchsmuster der CPU f\u00fcr eine solche Aufgabe sieht folgenderma\u00dfen aus:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/1ed82c0df76325eb30056ad9af86e86e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein Anfrage wird vom Benutzer verarbeitet, die Aufgabe beginnt, alle verf\u00fcgbaren CPU-Kerne zu nutzen, verarbeitet, gibt eine Antwort zur\u00fcck, wartet auf die n\u00e4chste Anfrage und bleibt inaktiv. Die n\u00e4chste Anfrage kommt \u2014 wieder werden alle Ressourcen genutzt, berechnet und wir warten auf die n\u00e4chste.<\/p>\n<p><\/p>\n<p>Um minimale Latenz f\u00fcr diese Aufgabe zu garantieren, m\u00fcssen wir die maximalen Ressourcen, die sie verbraucht, ermitteln und die erforderliche Anzahl von Kernen auf dem Minion (der Maschine, die die Aufgabe ausf\u00fchrt) reservieren. Die Reservierungsformel f\u00fcr unsere Aufgabe lautet somit:<\/p>\n<p><\/p>\n<pre><code>alloc: cpu = 4 (max)<\/code><\/pre>\n<p><\/p>\n<p>Wenn wir also einen Minion mit 16 Kernen haben, k\u00f6nnen wir genau vier solcher Aufgaben darauf platzieren. Besonders bemerkenswert ist, dass der durchschnittliche CPU-Verbrauch solcher Aufgaben oft sehr niedrig ist \u2013 was offensichtlich ist, da die Aufgabe einen Gro\u00dfteil der Zeit in Warteschleife auf eine Anfrage verbringt und nichts tut.<\/p>\n<p><\/p>\n<p><strong>Berechnungsaufgaben.<\/strong> Ihr Muster wird etwas anders sein:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/35b37fa1d70a137287cafdbfe3bcfc2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der durchschnittliche Ressourcenverbrauch der CPU f\u00fcr solche Aufgaben ist relativ hoch. Oft m\u00f6chten wir, dass die Berechnungsaufgabe innerhalb eines bestimmten Zeitrahmens abgeschlossen wird, weshalb wir die minimale Anzahl an Prozessoren reservieren m\u00fcssen, die erforderlich ist, damit die gesamte Berechnung in einem akzeptablen Zeitrahmen abgeschlossen werden kann. Die Reservierungsformel daf\u00fcr lautet:<\/p>\n<p><\/p>\n<pre><code>alloc: cpu = [1,*<\/code><\/pre>\n<p><\/p>\n<p><em>\u201eBitte platziere es auf dem Minion, wo mindestens ein freier Kern vorhanden ist, und alles weitere wird genutzt.\u201c<\/em><\/p>\n<p><\/p>\n<p>Hier ist die Ressourcennutzung bereits deutlich besser als bei Aufgaben mit geringer Latenz. Der Gewinn wird jedoch viel gr\u00f6\u00dfer sein, wenn beide Aufgabentypen auf einer Miniserver-Maschine kombiniert werden und ihre Ressourcen flexibel verteilt werden. Wenn eine Aufgabe mit geringer Latenz Prozessorleistung ben\u00f6tigt, erh\u00e4lt sie diese sofort, und wenn die Ressourcen nicht mehr gebraucht werden, werden sie an die Berechnungsaufgabe weitergegeben, also etwa so:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/875ad8d3f6a01e4fd0a89d0931e986c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber wie macht man das?<\/p>\n<p><\/p>\n<p>Lass uns zun\u00e4chst prod und seine Zuweisung anschauen: cpu = 4. Wir m\u00fcssen vier Kerne reservieren. Das kann in Docker run auf zwei Arten gemacht werden: <\/p>\n<p><\/p>\n<ul>\n<li>Mit der Option <code>--cpuset=1-4<\/code>, d. h. vier bestimmte Kerne auf der Maschine der Aufgabe zuweisen.<\/li>\n<li>Verwenden <code>--cpuquota=400_000 --cpuperiod=100_000<\/code>, eine Quota f\u00fcr die Prozessorzeit festlegen, d. h. angeben, dass die Aufgabe in jedem realen Zeitintervall von 100 ms nicht mehr als 400 ms Prozessorzeit verbraucht. Das ergibt die gleichen vier Kerne. <\/li>\n<\/ul>\n<p><\/p>\n<p>Aber welcher dieser Ans\u00e4tze ist geeignet?<\/p>\n<p><\/p>\n<p>Das cpuset sieht ziemlich ansprechend aus. Bei dieser Aufgabe stehen vier dedizierte Kerne zur Verf\u00fcgung, was bedeutet, dass die Prozessor-Caches maximal effizient arbeiten. Es gibt jedoch einen Nachteil: Wir m\u00fcssten die Verteilung der Berechnungen \u00fcber die weniger belasteten Kerne der Maschine selbst \u00fcbernehmen anstatt durch das Betriebssystem, und das ist eine recht anspruchsvolle Aufgabe, insbesondere wenn wir versuchen, auf einer solchen Maschine Batch-Jobs zu platzieren. Tests haben gezeigt, dass hier die Variante mit der Quotenregelung besser geeignet ist: So hat das Betriebssystem mehr Freiheit bei der Auswahl des Kerns zur Ausf\u00fchrung der Aufgabe zu einem bestimmten Zeitpunkt, und die Prozessorzeit wird effizienter verteilt.<\/p>\n<p><\/p>\n<p>Lassen Sie uns betrachten, wie im Docker eine Reservierung f\u00fcr die minimale Anzahl von Kernen erstellt werden kann. Die Quotenregelung f\u00fcr Batch-Jobs ist bereits nicht mehr anwendbar, da es nicht notwendig ist, ein Maximum zu beschr\u00e4nken; es reicht aus, nur ein Minimum zu garantieren. Hier eignet sich die Option gut. <code>docker run --cpushares<\/code>.<\/p>\n<p><\/p>\n<p>Wir haben uns darauf geeinigt, dass wenn ein Batch eine Garantie f\u00fcr mindestens einen Kern ben\u00f6tigt, wir angeben, <code>--cpushares=1024<\/code>, und wenn ein Minimum von zwei Kernen erforderlich ist, geben wir an, <code>--cpushares=2048<\/code>. CPU-Anteile beeinflussen die Verteilung der Prozessorzeit nicht, solange ausreichend vorhanden ist. Wenn also das Produkt momentan nicht alle vier Kerne nutzt, gibt es keine Einschr\u00e4nkungen f\u00fcr Batch-Aufgaben, und sie k\u00f6nnen zus\u00e4tzliche Prozessorzeit verwenden. In einer Situation, in der die CPU jedoch \u00fcberlastet ist, und das Produkt all seine vier Kerne verbraucht hat und auf die Quota st\u00f6\u00dft, wird die verbleibende Prozessorzeit proportional zu den CPU-Anteilen verteilt. Das bedeutet, dass bei drei verf\u00fcgbaren Kernen eine Aufgabe mit 1024 CPU-Anteilen einen Kern erh\u00e4lt, w\u00e4hrend die anderen beiden einem Job mit 2048 CPU-Anteilen zugewiesen werden.<\/p>\n<p><\/p>\n<p>Doch die Verwendung von Quota und Shares reicht nicht aus. Wir m\u00fcssen sicherstellen, dass Aufgaben mit kurzer Verz\u00f6gerung Priorit\u00e4t vor Batch-Aufgaben bei der Verteilung der Prozessorzeit erhalten. Ohne diese Priorisierung w\u00fcrde die Batch-Aufgabe die gesamte Prozessorzeit in Anspruch nehmen, wenn sie f\u00fcr das Produkt ben\u00f6tigt wird. Bei Docker run gibt es keine Optionen zur Priorisierung von Containern, aber die CPU-Scheduler-Richtlinien in Linux helfen hier. Detaillierte Informationen hierzu sind verf\u00fcgbar <noindex><a rel=\"nofollow\" href=\"http:\/\/man7.org\/linux\/man-pages\/man2\/sched_setscheduler.2.html\">hier<\/a><\/noindex>, und in diesem Artikel werden wir sie kurz durchgehen:<\/p>\n<p><\/p>\n<ul>\n<li><strong>SCHED_OTHER<\/strong><br \/>\nStandardm\u00e4\u00dfig erhalten alle regul\u00e4ren Benutzerprozesse auf einer Linux-Maschine.<\/li>\n<li><strong>SCHED_BATCH<\/strong><br \/>\nIst f\u00fcr ressourcenintensive Prozesse vorgesehen. Bei der Platzierung einer Aufgabe im Prozessor wird eine sogenannte Aktivierungsstrafe eingef\u00fchrt: Eine solche Aufgabe hat eine geringere Wahrscheinlichkeit, Ressourcen des Prozessors zu erhalten, wenn dieser momentan von einer Aufgabe mit SCHED_OTHER genutzt wird.<\/li>\n<li><strong>SCHED_IDLE<\/strong><br \/>\nEin Hintergrundprozess mit sehr niedriger Priorit\u00e4t, sogar niedriger als nice \u201319. Wir verwenden unsere Open-Source-Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/odnoklassniki\/one-nio\">one-nio<\/a><\/noindex>, um die erforderliche Politik beim Start eines Containers durch den Aufruf<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"java\">one.nio.os.Proc.sched_setscheduler( pid, Proc.SCHED_IDLE )<\/code><\/pre>\n<p><\/p>\n<p>Aber selbst wenn Sie nicht in Java programmieren, kann dasselbe mit dem Befehl chrt erreicht werden:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">chrt -i 0 $pid<\/code><\/pre>\n<p><\/p>\n<p>Lassen Sie uns alle unsere Isolationsstufen in einer Tabelle zur besseren \u00dcbersicht zusammenfassen:<\/p>\n<p><\/p>\n<p>Isolationsklasse<br \/>\nBeispiel alloc<br \/>\nDocker run Optionen<br \/>\nsched_setscheduler chrt*<\/p>\n<p>Prod<br \/>\ncpu = 4<br \/>\n<code>--cpuquota=400000<\/code> <code>--cpuperiod=100000<\/code><br \/>\nSCHED_OTHER<\/p>\n<p>Batch<br \/>\nCpu = [1, * )<br \/>\n<code>--cpushares=1024<\/code><br \/>\nSCHED_BATCH<\/p>\n<p>Idle<br \/>\nCpu= [2, *)<br \/>\n<code>--cpushares=2048<\/code><br \/>\nSCHED_IDLE<\/p>\n<p><\/p>\n<p>*Wenn Sie chrt aus dem Container heraus ausf\u00fchren, kann die F\u00e4higkeit sys_nice erforderlich sein, da Docker diese F\u00e4higkeit standardm\u00e4\u00dfig beim Start eines Containers entfernt.<\/p>\n<p><\/p>\n<p>Doch die Aufgaben beanspruchen nicht nur die CPU, sondern auch den Traffic, der die Verz\u00f6gerung bei der Netzwerkauslastung noch st\u00e4rker beeinflusst als eine falsche Verteilung der CPU-Ressourcen. Daher m\u00f6chten wir selbstverst\u00e4ndlich dasselbe auch f\u00fcr den Traffic erhalten. Das hei\u00dft, wenn die Produktionsaufgabe Datenpakete ins Netzwerk sendet, begrenzen wir die maximale Geschwindigkeit (Formel <em>alloc: lan=[*,500mbps)<\/em> ), mit der die Produktion dies tun kann. F\u00fcr Batch-Aufgaben garantieren wir lediglich eine minimale Bandbreite, beschr\u00e4nken jedoch die maximale Bandbreite nicht (Formel <em>alloc: lan=[10Mbps,*))<\/em> ) Dabei sollte der Traffic der Produktion Vorrang vor den Batch-Aufgaben haben.<br \/>\nHier hat Docker keine primitiven Elemente, die wir nutzen k\u00f6nnten. Doch uns kommt <noindex><a rel=\"nofollow\" href=\"http:\/\/lartc.org\/\">Linux Traffic Control<\/a><\/noindex>zur Hilfe. Wir konnten das gew\u00fcnschte Ergebnis mit der Disziplin <noindex><a rel=\"nofollow\" href=\"http:\/\/linux-ip.net\/articles\/hfsc.en\/\">Hierarchical Fair Service Curve<\/a><\/noindex>erreichen. Damit schaffen wir zwei Traffic-Klassen: Hochpriorit\u00e4t f\u00fcr die Produktion und Niedrigpriorit\u00e4t f\u00fcr Batch\/Idle. Schlie\u00dflich ergibt sich folgende Konfiguration f\u00fcr den ausgehenden Traffic:<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/gh\/5k\/kf\/gh5kkfwkhwv0ilmbdmdbo83dp6k.png\"><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/3f52a968118b6021bd0c920af17a00c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<p>\u0437\u0434\u0435\u0441\u044c 1:0 \u2014 &#171;\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 qdisc&#187; \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b hsfc; 1:1 \u2014 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 hsfc \u0441 \u043e\u0431\u0449\u0438\u043c \u043b\u0438\u043c\u0438\u0442\u043e\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 8 Gbit\/s, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432; 1:2 \u2014 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 hsfc \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 batch \u0438 idle \u0437\u0430\u0434\u0430\u0447 \u0441 &#171;\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c&#187; \u043b\u0438\u043c\u0438\u0442\u043e\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0438\u0436\u0435. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b hsfc \u2014 \u044d\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 prod-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0441 \u043b\u0438\u043c\u0438\u0442\u0430\u043c\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c, \u2014 450 \u0438 400 Mbit\/s. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 hsfc \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 qdisc \u043e\u0447\u0435\u0440\u0435\u0434\u044c fq \u0438\u043b\u0438 fq_codel, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f\u0434\u0440\u0430 linux, \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u0435\u0440\u044c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u0438 \u0432\u0441\u043f\u043b\u0435\u0441\u043a\u0430\u0445 \u0442\u0440\u0430\u0444\u0438\u043a\u0430. <\/p>\n<p><\/p>\n<p>Normalerweise werden tc-Disziplinen nur zur Priorisierung des ausgehenden Datenverkehrs verwendet. Aber wir m\u00f6chten auch den eingehenden Datenverkehr priorisieren \u2013 denn irgendeine Batch-Aufgabe k\u00f6nnte den gesamten eingehenden Kanal f\u00fcr sich beanspruchen, indem sie beispielsweise ein gro\u00dfes Paket an Eingabedaten f\u00fcr Map &amp; Reduce erh\u00e4lt. Zu diesem Zweck verwenden wir das Modul <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/350023\/tc-ingress-policing-and-ifb-mirroring\">ifb<\/a><\/noindex>, der f\u00fcr jede Netzwerkschnittstelle ein virtuelles ifbX-Interface erstellt und den eingehenden Datenverkehr von der Schnittstelle auf das ifbX umleitet. F\u00fcr ifbX gelten dann alle gleichen Disziplinen zur Steuerung des ausgehenden Datenverkehrs, wobei die hsfc-Konfiguration sehr \u00e4hnlich sein wird:<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iz\/ao\/-k\/izao-kgthgu_ptgyq9cjb1il0wm.png\"><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/967da9c0637cc70ba195af781db18adf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<p>In unseren Experimenten haben wir festgestellt, dass hsfc die besten Ergebnisse erzielt, wenn die Klasse 1:2 des nicht priorisierten Batch-\/Idle-Datenverkehrs auf Minion-Maschinen auf eine bestimmte Freiskapazit\u00e4t begrenzt wird. Andernfalls beeinflusst der nicht priorisierte Datenverkehr die Latenz der Prod-Aufgaben erheblich. Die aktuelle Freiskapazit\u00e4t wird von miniond jede Sekunde bestimmt, indem der durchschnittliche Datenverbrauch aller Prod-Aufgaben dieses Minions gemessen und von der Bandbreite des Netzwerkinterfaces abgezogen wird. <img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/9d6f38110d3b1693afe222b01430b9bb.jpg\" style=\"display:block;margin: 0 auto;\" \/> und von der Bandbreite des Netzwerkinterfaces abgezogen wird. <img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/d5608ec4c58e44b8571ab0b1d0cc7701.jpg\" style=\"display:block;margin: 0 auto;\" \/> mit einem kleinen Puffer, d. h.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/fb01347c2224bd5bbd82169861eeb7e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Bandbreiten werden unabh\u00e4ngig f\u00fcr eingehenden und ausgehenden Datenverkehr definiert. Entsprechend den neuen Werten konfiguriert miniond das Limit der nicht priorisierten Klasse 1:2 neu.<\/p>\n<p><\/p>\n<p>So haben wir alle drei Isolationsklassen umgesetzt: prod, batch und idle. Diese Klassen beeinflussen stark die Ausf\u00fchrungseigenschaften der Aufgaben. Daher haben wir uns entschieden, dieses Merkmal an die Spitze der Hierarchie zu setzen, damit man auf den ersten Blick beim Namen der hierarchischen Warteschlange sofort erkennen kann, womit wir es zu tun haben: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/34dc89c461db711b19a0f4eccc50efce.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alle unsere Bekannten <strong>web<\/strong> und <strong>music<\/strong> werden dann in der Hierarchie unter prod eingeordnet. Zum Beispiel k\u00f6nnen wir unter batch den Dienst <strong>music catalog<\/strong>einordnen, der regelm\u00e4\u00dfig einen Katalog von Tracks aus einer Sammlung von in \"\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438\" hochgeladenen mp3-Dateien erstellt. Ein Beispiel f\u00fcr einen Dienst unter idle k\u00f6nnte sein <strong>music transformer<\/strong>, der die Lautst\u00e4rke der Musik normalisiert.<\/p>\n<p><\/p>\n<p>Nachdem wir wieder \u00fcberfl\u00fcssige Zeilen entfernt haben, k\u00f6nnen wir die Namen unserer Dienste flacher aufzeichnen, indem wir die Isolationsklasse der Aufgabe am Ende des vollst\u00e4ndigen Dienstnamens hinzuf\u00fcgen: <strong>web.front.prod<\/strong>, <strong>catalog.music.batch<\/strong>, <strong>transformer.music.idle<\/strong>.<\/p>\n<p><\/p>\n<p>Jetzt verstehen wir beim Blick auf den Dienstnamen nicht nur, welche Funktion er ausf\u00fchrt, sondern auch seine Isolationsklasse, was seine Kritikalit\u00e4t und \u00c4hnliches bedeutet.<\/p>\n<p><\/p>\n<p>Das ist alles wunderbar, aber es gibt eine bittere Wahrheit. Eine vollst\u00e4ndige Isolation von Aufgaben, die auf einer Maschine laufen, ist unm\u00f6glich.<\/p>\n<p><\/p>\n<p>Was wir erreicht haben: Wenn batch intensiv Ressourcen verbraucht, <strong>nur<\/strong> Die CPU-Ressourcen werden von dem eingebauten Linux-Prozessor-Planer gut verwaltet, was praktisch keinen Einfluss auf die Produktionsaufgaben hat. Beginnt jedoch diese Batch-Aufgabe aktiv mit dem Speicher zu arbeiten, zeigt sich eine gegenseitige Beeinflussung. Das liegt daran, dass die Cache-Speicher der Produktionsaufgabe \u201eausgewaschen\u201c werden \u2013 die Cache-Fehler steigen, und der Prozessor verarbeitet die Produktionsaufgabe langsamer. Eine solche Batch-Aufgabe kann die Latenz unseres typischen Produktionscontainers um 10 % erh\u00f6hen.<\/p>\n<p><\/p>\n<p>Die Isolierung des Traffics ist noch schwieriger, da moderne Netzwerkkarten eine interne Paketwarteschlange haben. Wenn ein Paket von der Batch-Aufgabe zuerst ankommt, wird es auch zuerst \u00fcber das Kabel \u00fcbertragen und da l\u00e4sst sich nichts \u00e4ndern.<\/p>\n<p><\/p>\n<p>Au\u00dferdem ist es uns bisher nur gelungen, die Priorisierung des TCP-Traffics zu l\u00f6sen: Der Ansatz mit hsfc funktioniert nicht f\u00fcr UDP. Selbst im Falle von TCP-Traffic, wenn die Batch-Aufgabe viel Traffic generiert, f\u00fchrt dies ebenfalls zu einer Erh\u00f6hung der Latenz f\u00fcr die Produktionsaufgabe um etwa 10 %.<\/p>\n<p><\/p>\n<h2 id=\"otkazoustoychivost\">Ausfallsicherheit<\/h2>\n<p><\/p>\n<p>Ein Ziel bei der Entwicklung von one-cloud war es, die Ausfallsicherheit von Odnoklassniki zu verbessern. Daher m\u00f6chte ich im Folgenden die m\u00f6glichen Ausfallszenarien und Notf\u00e4lle n\u00e4her betrachten. Lassen Sie uns mit einem einfachen Szenario beginnen \u2013 dem Ausfall eines Containers. <\/p>\n<p><\/p>\n<p>Ein Container kann auf verschiedene Weisen ausfallen. Dies kann durch ein Experiment, einen Bug oder einen Fehler im Manifest geschehen, wodurch die Produktionsaufgabe mehr Ressourcen verbraucht, als im Manifest angegeben. Wir hatten einen Fall: Ein Entwickler implementierte einen komplexen Algorithmus, \u00fcberarbeitete ihn mehrfach und verlor dabei so den \u00dcberblick, dass die Aufgabe am Ende in einer nicht trivialisierbaren Schleife festhing. Da die Produktionsaufgabe jedoch eine h\u00f6here Priorit\u00e4t hat als alle anderen auf den gleichen Minions, begann sie, alle verf\u00fcgbaren CPU-Ressourcen zu verbrauchen. In dieser Situation half die Isolation, genauer gesagt das Kontingent f\u00fcr die CPU-Zeit. Wenn der Aufgabe ein Kontingent zugewiesen wird, verbraucht sie nicht mehr. Daher bemerkten die Batch- und anderen Produktionsaufgaben, die auf demselben Rechner liefen, nichts davon. <\/p>\n<p><\/p>\n<p>Ein weiteres m\u00f6gliches Problem ist der Abbruch des Containers. Hier helfen uns die Restart-Policies, die jeder kennt; Docker erledigt das hervorragend. Fast alle Produktionsaufgaben haben eine Always-Restart-Policy. Manchmal verwenden wir On-Failure f\u00fcr Batch-Jobs oder zur Fehlersuche bei Produktionscontainern.<\/p>\n<p><\/p>\n<p>Was kann man tun, wenn ein gesamter Minion nicht verf\u00fcgbar ist?<\/p>\n<p><\/p>\n<p>Offensichtlich k\u00f6nnte man den Container auf einem anderen Rechner starten. Das Interessante ist hier: Was passiert mit der IP-Adresse (den IP-Adressen), die dem Container zugewiesen wurden? <\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen Containern dieselben IP-Adressen zuweisen wie den Maschinen-Minions, auf denen diese Container laufen. Wenn der Container dann auf einem anderen Rechner gestartet wird, \u00e4ndert sich seine IP-Adresse, und alle Clients m\u00fcssen verstehen, dass der Container umgezogen ist; sie m\u00fcssen jetzt eine andere Adresse ansprechen, was einen separaten Service f\u00fcr die Service Discovery erfordert. <\/p>\n<p><\/p>\n<p>Service Discovery ist praktisch. Auf dem Markt gibt es viele L\u00f6sungen mit unterschiedlichem Grad an Ausfallsicherheit zur Organisation eines Service-Registers. Oft beinhalten solche L\u00f6sungen auch Load-Balancer-Logik, die Speicherung zus\u00e4tzlicher Konfigurationen in Form von KV-Speicher usw.<br \/>\nWir m\u00f6chten jedoch gerne auf die Notwendigkeit verzichten, ein separates Register einzuf\u00fchren, da dies die Implementierung eines kritischen Systems bedeuten w\u00fcrde, das von allen Dienstleistungen in der Produktion genutzt wird. Das w\u00e4re eine potenzielle Fehlerquelle, und es m\u00fcsste entweder eine sehr ausfallsichere L\u00f6sung gew\u00e4hlt oder entwickelt werden, was bekanntlich sehr kompliziert, zeitaufwendig und kostspielig ist. <\/p>\n<p><\/p>\n<p>Ein weiteres gro\u00dfes Manko: Um unsere alte Infrastruktur mit der neuen kompatibel zu machen, m\u00fcsste man s\u00e4mtliche Aufgaben f\u00fcr eine Service Discovery-System umschreiben. Die Aufgaben sind viel und an manchen Stellen nahezu unm\u00f6glich, insbesondere bei Low-Level-Ger\u00e4ten, die auf Betriebssystem-Kernel-Ebene oder direkt mit der Hardware arbeiten. Die Implementierung dieser Funktionalit\u00e4t durch etablierte L\u00f6sungsmuster, wie zum Beispiel <noindex><a rel=\"nofollow\" href=\"https:\/\/linkerd.io\">side-car<\/a><\/noindex> w\u00fcrde teilweise zu zus\u00e4tzlicher Belastung f\u00fchren, teilweise die Nutzungskomplexit\u00e4t erh\u00f6hen und zus\u00e4tzliche Ausfallszenarien schaffen. Da wir es nicht komplizierter machen wollten, haben wir entschieden, die Nutzung von Service Discovery optional zu gestalten. <\/p>\n<p><\/p>\n<p>In One-Cloud IP folgt dem Container, d. h. jede Instanz der Aufgabe hat ihre eigene IP-Adresse. Diese Adresse ist \"statisch\": Sie wird zum Zeitpunkt der ersten Bereitstellung des Dienstes in der Cloud einem jeden Exemplar zugeordnet. Wenn der Dienst w\u00e4hrend seiner Laufzeit eine unterschiedliche Anzahl von Exemplaren hatte, werden letztendlich so viele IP-Adressen zugewiesen, wie es maximal Exemplare gab.<\/p>\n<p><\/p>\n<p>Diese Adressen \u00e4ndern sich anschlie\u00dfend nicht: Sie werden einmal zugewiesen und bestehen w\u00e4hrend der gesamten Lebensdauer des Dienstes in der Produktion. Die IP-Adressen folgen den Containern im Netzwerk. Wenn ein Container auf eine andere Minion migriert, wird die Adresse ebenfalls mit ihm \u00fcbertragen. <\/p>\n<p><\/p>\n<p>Somit \u00e4ndert sich die Zuordnung des Dienstnamens zu seiner Liste von IP-Adressen nur sehr selten. Werfen wir noch einmal einen Blick auf die Namen der Dienstinstanzen, die wir zu Beginn des Artikels erw\u00e4hnt haben (<strong>1.ok-web.group1.web.front.prod, 2.ok-web.group1.web.front.prod, \u2026<\/strong>), dann stellen wir fest, dass sie FQDN \u00e4hneln, die im DNS verwendet werden. Genau so ist es: F\u00fcr die Anzeige von Instanznamen von Diensten in deren IP-Adressen nutzen wir das DNS-Protokoll. Dabei gibt dieses DNS alle reservierten IP-Adressen aller Container zur\u00fcck \u2013 sowohl der laufenden als auch der gestoppten (angenommen, es sind drei Replikate in Verwendung und wir haben f\u00fcnf Adressen reserviert \u2013 alle f\u00fcnf werden zur\u00fcckgegeben). Die Kunden, die diese Informationen erhalten, versuchen, eine Verbindung zu allen f\u00fcnf Replikaten herzustellen \u2013 und erkennen somit die aktiven. Diese Methode der Verf\u00fcgbarkeitsbestimmung ist deutlich zuverl\u00e4ssiger, da weder DNS noch Service Discovery involviert sind, was bedeutet, dass es auch keine schwierig zu l\u00f6senden Probleme hinsichtlich der Aktualit\u00e4t der Informationen und der Ausfallsicherheit dieser Systeme gibt. Dar\u00fcber hinaus k\u00f6nnen wir in kritischen Diensten, von denen der gesamte Portalbetrieb abh\u00e4ngt, ganz auf DNS verzichten und einfach die IP-Adressen in die Konfiguration eintragen.<\/p>\n<p><\/p>\n<p>Die Implementierung eines solchen IP-Transfers f\u00fcr Container kann nicht trivial sein \u2013 und wir werden in folgendem Beispiel betrachten, wie das funktioniert:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/faf99c2609a57daa1bdc193cb0f4cb31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Angenommen, der one-cloud Master gibt dem Minion M1 den Befehl, zu starten. <strong>1.ok-web.group1.web.front.prod<\/strong> mit der IP-Adresse 1.1.1.1. Auf dem Minion l\u00e4uft <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Bird_Internet_routing_daemon\">BIRD<\/a><\/noindex>, der diese Adresse an spezielle Server ank\u00fcndigt. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Route_reflector\">Route Reflector<\/a><\/noindex>. Letztere haben eine BGP-Sitzung mit der Netzwerkhardware, auf die die Route zur IP-Adresse 1.1.1.1 auf M1 \u00fcbertragen wird. M1 routet die Pakete bereits mit Mitteln von Linux in den Container. Es gibt drei Route Reflectoren, da dies ein sehr kritischer Teil der Infrastruktur von one-cloud ist \u2013 ohne sie funktioniert das Netzwerk in one-cloud nicht. Wir platzieren sie in verschiedenen Racks, wenn m\u00f6glich in unterschiedlichen R\u00e4umen des Rechenzentrums, um die Wahrscheinlichkeit eines gleichzeitigen Ausfalls aller drei zu verringern.<\/p>\n<p><\/p>\n<p>Angenommen, die Verbindung zwischen dem Master von one-cloud und dem Minion M1 ist abgerissen. Der Master von one-cloud wird nun unter der Annahme handeln, dass M1 vollst\u00e4ndig ausgefallen ist. Das hei\u00dft, er wird den Minion M2 anweisen, zu starten. <strong>web.group1.web.front.prod<\/strong> Mit derselben Adresse 1.1.1.1 haben wir nun zwei konkurrierende Routen im Netzwerk f\u00fcr 1.1.1.1: auf M1 und M2. Um solche Konflikte zu l\u00f6sen, verwenden wir den Multi Exit Discriminator, der im BGP-Ank\u00fcndigung angegeben wird. Diese Zahl zeigt das Gewicht der angek\u00fcndigten Route an. Aus den Konflikten wird die Route mit dem niedrigeren MED-Wert ausgew\u00e4hlt. Der one-cloud Master unterst\u00fctzt MED als integralen Bestandteil der IP-Adressen der Container. Zun\u00e4chst wird die Adresse mit einem ausreichend hohen MED = 1.000.000 ausgegeben. Bei einem solchen Notfall-Containerumzug reduziert der Master das MED, und M2 erh\u00e4lt den Befehl, die Adresse 1.1.1.1 mit MED = 999.999 anzuk\u00fcndigen. Instanz, die auf M1 arbeitet, bleibt dabei nicht verbunden, und ihre zuk\u00fcnftige Situation interessiert uns wenig, bis die Verbindung zum Master wiederhergestellt ist, wenn sie als alter Dublette gestoppt wird.<\/p>\n<p><\/p>\n<h2 id=\"avarii\">Ausf\u00e4lle<\/h2>\n<p><\/p>\n<p>Alle Systeme zur Verwaltung von Rechenzentren arbeiten in der Regel gut mit kleineren Ausf\u00e4llen. Ein Containerabsturz ist praktisch \u00fcberall die Norm.<\/p>\n<p><\/p>\n<p>Lassen Sie uns betrachten, wie wir mit einem Ausfall umgehen, beispielsweise einem Stromausfall in einem oder mehreren R\u00e4umen des Rechenzentrums.<\/p>\n<p><\/p>\n<p>Was bedeutet ein Ausfall f\u00fcr das Managementsystem des Rechenzentrums? Zun\u00e4chst einmal ist es ein massiver gleichzeitiger Ausfall vieler Maschinen, und das Managementsystem muss gleichzeitig sehr viele Container migrieren. Wenn der Ausfall jedoch sehr umfangreich ist, kann es passieren, dass nicht alle Aufgaben auf andere Minions umverteilt werden k\u00f6nnen, da die Ressourcenf\u00e4higkeit des Rechenzentrums unter 100 % der Last f\u00e4llt. <\/p>\n<p><\/p>\n<p>Ausf\u00e4lle gehen oft mit dem Versagen der Steuerungsschicht einher. Dies kann aufgrund eines Ausfalls der Hardware geschehen, h\u00e4ufiger jedoch, weil Ausf\u00e4lle nicht getestet werden und die Steuerungsschicht selbst aufgrund der erh\u00f6hten Last zusammenbricht. <\/p>\n<p><\/p>\n<p>Was kann man dagegen tun?<\/p>\n<p><\/p>\n<p>Massenauslagerungen bedeuten, dass in der Infrastruktur eine gro\u00dfe Anzahl von Aktionen, Migrationen und Platzierungen stattfindet. Jede Migration ben\u00f6tigt Zeit f\u00fcr die \u00dcbertragung und Entpackung der Container-Images zu den Minions, das Starten und die Initialisierung der Container usw. Daher ist es w\u00fcnschenswert, dass wichtigere Aufgaben vor weniger wichtigen gestartet werden.<\/p>\n<p><\/p>\n<p>Lassen Sie uns erneut einen Blick auf die vertraute Hierarchie der Dienste werfen und versuchen zu kl\u00e4ren, welche Aufgaben wir zuerst starten m\u00f6chten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/2e827271adb8d3ff3d385e53553aaacf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nat\u00fcrlich sind dies die Prozesse, die direkt an der Bearbeitung von Benutzeranfragen beteiligt sind, also prod. Wir geben dies an mit <strong>dem Platzierungspriorit\u00e4t<\/strong> \u2014 eine Zahl, die einer Warteschlange zugewiesen werden kann. Wenn eine Warteschlange eine h\u00f6here Priorit\u00e4t hat, werden ihre Dienste zuerst bereitgestellt.<\/p>\n<p><\/p>\n<p>F\u00fcr prod weisen wir h\u00f6here Priorit\u00e4ten zu, 0; f\u00fcr batch etwas niedrigere, 100; und f\u00fcr idle noch niedrigere, 200. Die Priorit\u00e4ten werden hierarchisch angewendet. Alle Aufgaben unterhalb dieser Hierarchie haben die entsprechende Priorit\u00e4t. Wenn wir m\u00f6chten, dass im Bereich prod die Caches vor den Frontends starten, setzen wir die Priorit\u00e4ten f\u00fcr cache auf 0 und f\u00fcr die Front-Subwarteschlangen auf 1. Wenn wir beispielsweise m\u00f6chten, dass von den Frontends zuerst das Hauptportal gestartet wird und der Musik-Frontend danach, k\u00f6nnen wir letzterem eine niedrigere Priorit\u00e4t von 10 zuweisen.<\/p>\n<p><\/p>\n<p>Das n\u00e4chste Problem ist der Mangel an Ressourcen. Wir haben eine gro\u00dfe Menge an Ger\u00e4ten verloren, ganze Hallen im Rechenzentrum sind betroffen, w\u00e4hrend wir so viele Dienste gestartet haben, dass die Ressourcen nun nicht f\u00fcr alle ausreichen. Wir m\u00fcssen entscheiden, welche Aufgaben wir opfern k\u00f6nnen, damit die wesentlichen kritischen Dienste weiterhin funktionieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/1b1ad3da16df6677dd0ba4b038cdd7d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Gegensatz zur Priorit\u00e4t der Bereitstellung k\u00f6nnen wir nicht einfach alle Batch-Aufgaben opfern, da einige von ihnen wichtig f\u00fcr den Betrieb des Portals sind. Deshalb haben wir separat \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b <strong>Priorit\u00e4t des Verdr\u00e4ngens<\/strong> von Aufgaben. Bei der Bereitstellung kann eine Aufgabe mit h\u00f6herer Priorit\u00e4t eine Aufgabe mit niedrigerer Priorit\u00e4t verdr\u00e4ngen, das hei\u00dft, sie kann gestoppt werden, wenn keine freien Minions mehr vorhanden sind. In diesem Fall wird die Aufgabe mit niedriger Priorit\u00e4t wahrscheinlich unzugeordnet bleiben, da es keinen geeigneten Minion mit ausreichend freien Ressourcen mehr geben wird.<\/p>\n<p><\/p>\n<p>In unserer Hierarchie ist es sehr einfach, einen solchen Priorit\u00e4tsersatz anzugeben, sodass prod- und batch-Aufgaben idle-Aufgaben verdr\u00e4ngen oder stoppen, sich jedoch nicht gegenseitig st\u00f6ren, indem der idle-Aufgabe eine Priorit\u00e4t von 200 zugewiesen wird. Genau wie beim Zuweisung von Priorit\u00e4ten k\u00f6nnen wir unsere Hierarchie nutzen, um komplexere Regeln zu beschreiben. Zum Beispiel k\u00f6nnen wir angeben, dass wir die Musikfunktion opfern, wenn die Ressourcen f\u00fcr unser Haupt-Webportal nicht ausreichen, indem wir die Priorit\u00e4t der entsprechenden Knoten niedriger setzen: 10.<\/p>\n<p><\/p>\n<h2 id=\"avarii-dc-celikom\">Ausf\u00e4lle des Rechenzentrums insgesamt<\/h2>\n<p><\/p>\n<p>Warum kann das gesamte Rechenzentrum ausfallen? Naturgewalten. Es gab einen interessanten Beitrag dar\u00fcber, wie <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/company\/dataline\/blog\/333578\/\">ein Hurrikan die Arbeitsweise des Rechenzentrums beeinflusste.<\/a><\/noindex>Als Naturgewalt kann man auch obdachlose Menschen betrachten, die einmal die Glasfaser in einem Abfluss angez\u00fcndet haben, wodurch das Rechenzentrum die Verbindung zu anderen Standorten komplett verlor. Eine Ursache f\u00fcr den Ausfall kann auch menschliches Versagen sein: Ein Operator kann einen Befehl ausgeben, der das gesamte Rechenzentrum zum Absturz bringt. Dies kann durch einen gro\u00dfen Fehler geschehen. Allgemein gesagt, Rechenzentren fallen aus \u2014 das ist keine Seltenheit. Bei uns passiert das alle paar Monate. <\/p>\n<p><\/p>\n<p>Und das machen wir, damit niemand #okzhivi in Twitter postet.<\/p>\n<p><\/p>\n<p>Die erste Strategie ist die Isolation. Jede Instanz von one-cloud ist isoliert und kann nur Maschinen in einem einzigen Rechenzentrum verwalten. Das bedeutet, dass der Verlust eines Cloud-Dienstes aufgrund von Bugs oder falschen Befehlen des Betreibers nur den Verlust dieses einen Rechenzentrums zur Folge hat. Wir sind darauf vorbereitet: Es gibt eine Reservierungspolitik, bei der die Replikate von Anwendungen und Daten in allen Rechenzentren untergebracht werden. Wir nutzen ausfallsichere Datenbanken und testen regelm\u00e4\u00dfig die Ausf\u00e4lle.<br \/>\nDa wir heute \u00fcber vier Rechenzentren verf\u00fcgen, haben wir auch vier separate, vollst\u00e4ndig isolierte Instanzen von one-cloud.<\/p>\n<p><\/p>\n<p>Dieser Ansatz sch\u00fctzt nicht nur vor physischen Ausf\u00e4llen, sondern kann auch vor Fehlern des Betreibers sch\u00fctzen.<\/p>\n<p><\/p>\n<p>Was kann man noch im Umgang mit dem menschlichen Faktor tun? Wenn ein Betreiber der Cloud einen merkw\u00fcrdigen oder potenziell gef\u00e4hrlichen Befehl erteilt, k\u00f6nnte von ihm pl\u00f6tzlich verlangt werden, eine kleine Aufgabe zu l\u00f6sen, um zu \u00fcberpr\u00fcfen, wie gut er nachgedacht hat. Zum Beispiel, wenn es um eine Massenstilllegung vieler Replikate geht oder wenn es sich einfach um einen seltsamen Befehl handelt \u2013 die Reduzierung der Anzahl der Replikate oder das \u00c4ndern des Namens des Images, nicht nur der Versionsnummer im neuen Manifest.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/vh\/vw\/0d\/vhvw0dzobo9sd4x7zih_cnfnlu8.png\"><img decoding=\"async\" alt=\"One-cloud \u2014 Datacenter-Level OS in den Odnoklassniki\" src=\"\/wp-content\/uploads\/2020\/06\/f7ee44a77e30612a3cd99a6f7aee3820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><\/p>\n<h2 id=\"itogi\">Ergebnisse<\/h2>\n<p><\/p>\n<p>Besondere Merkmale von one-cloud: <\/p>\n<p><\/p>\n<ul>\n<li><strong>Hierarchisches und anschauliches Schema zur Benennung von Services und Containern<\/strong>, das es erm\u00f6glicht, sehr schnell zu erkennen, um welche Aufgabe es sich handelt, zu welchem Bereich sie geh\u00f6rt, wie sie funktioniert und wer daf\u00fcr verantwortlich ist. <\/li>\n<li>Wir wenden unsere <strong>Technik zur Kombination von Prod- und Batch-<\/strong>Aufgaben auf Minion-Instanzen an, um die Effizienz der gemeinsamen Nutzung von Maschinen zu erh\u00f6hen. Statt cpuset verwenden wir CPU-Quoten, Shares, CPU-Planungspolitiken und Linux QoS.<\/li>\n<li>Eine vollst\u00e4ndige Isolation der Container, die auf einer Maschine arbeiten, konnten wir nicht erreichen, aber ihr gegenseitiger Einfluss bleibt innerhalb von 20 %.<\/li>\n<li>Die Organisation der Services in einer Hierarchie hilft bei der automatischen Behebung von St\u00f6rungen durch <strong>Platzierungspriorit\u00e4ten und Verdr\u00e4ngung.<\/strong>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"chavo\">FAQ<\/h2>\n<p><\/p>\n<p>Warum haben wir keine fertige L\u00f6sung gew\u00e4hlt.<\/p>\n<p><\/p>\n<ul>\n<li>Verschiedene Klassen von Aufgabasolationen erfordern unterschiedliche Logik bei der Platzierung auf Minion-Instanzen. W\u00e4hrend Prod-Aufgaben einfach durch Ressourcensicherung platziert werden k\u00f6nnen, m\u00fcssen Batch- und Idle-Aufgaben unter Ber\u00fccksichtigung der tats\u00e4chlichen Ressourcenauslastung auf den Minion-Maschinen platziert werden. <\/li>\n<li>Die Notwendigkeit, solche von Aufgaben genutzten Ressourcen zu ber\u00fccksichtigen, wie: \n<ul>\n<li>Netzwerkbandbreite;<\/li>\n<li>Typen und \u201eSpindeln\u201c der Festplatten.<\/li>\n<\/ul>\n<\/li>\n<li>Die Notwendigkeit, Priorit\u00e4ten f\u00fcr Dienste bei der Beseitigung von St\u00f6rungen, die Rechte und Quoten der Teams f\u00fcr Ressourcen anzugeben, wird durch hierarchische Warteschlangen in one-cloud gel\u00f6st.<\/li>\n<li>Die Notwendigkeit, Container menschenlesbar zu benennen, um die Reaktionszeiten auf St\u00f6rungen und Vorf\u00e4lle zu verk\u00fcrzen.<\/li>\n<li>Die Unf\u00e4higkeit, Service Discovery gleichzeitig fl\u00e4chendeckend einzuf\u00fchren; die Notwendigkeit, eine lange Zeit mit Aufgaben, die auf physischen Hosts betrieben werden, zu koexistieren \u2013 das wird durch 'statische' IP-Adressen gel\u00f6st, die den Containern folgen, und in der Folge die Notwendigkeit einer einzigartigen Integration mit einer gro\u00dfen Netzwerk-Infrastruktur.<\/li>\n<\/ul>\n<p><\/p>\n<p>All diese Funktionen w\u00fcrden bedeutende \u00c4nderungen der bestehenden L\u00f6sungen erfordern, und nachdem wir den Arbeitsaufwand bewertet haben, haben wir festgestellt, dass wir unsere eigene L\u00f6sung mit ungef\u00e4hr dem gleichen Aufwand entwickeln k\u00f6nnen. Doch diese eigene L\u00f6sung wird erheblich einfacher zu betreiben und weiterzuentwickeln sein \u2013 sie enth\u00e4lt keine \u00fcberfl\u00fcssigen Abstraktionen, die Funktionen unterst\u00fctzen, die wir nicht ben\u00f6tigen. <\/p>\n<p><\/p>\n<p>Vielen Dank an alle, die diese letzten Zeilen gelesen haben, f\u00fcr Ihre Geduld und Aufmerksamkeit!<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/odnoklassniki\/blog\/346868\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043b\u043e\u0445\u0430, \u043f\u0438\u043f\u043b! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0410\u043d\u0430\u0441\u0442\u0430\u0441\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0410 \u043a\u0440\u043e\u043c\u0435 \u043c\u0435\u043d\u044f, \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0436\u0435\u043b\u0435\u0437\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0426\u041e\u0414\u0430, \u0432 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 500 \u0441\u0442\u043e\u0435\u043a \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441 8 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u043a\u0443, \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":84115,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-84114","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043b\u043e\u0445\u0430, \u043f\u0438\u043f\u043b! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0410\u043d\u0430\u0441\u0442\u0430\u0441\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0410 \u043a\u0440\u043e\u043c\u0435 \u043c\u0435\u043d\u044f, \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0436\u0435\u043b\u0435\u0437\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0426\u041e\u0414\u0430, \u0432 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 500 \u0441\u0442\u043e\u0435\u043a \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441 8 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u043a\u0443, \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\" \/>\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\/de\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\udd47One-cloud \u2014 \u041e\u0421 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043b\u043e\u0445\u0430, \u043f\u0438\u043f\u043b! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0410\u043d\u0430\u0441\u0442\u0430\u0441\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0410 \u043a\u0440\u043e\u043c\u0435 \u043c\u0435\u043d\u044f, \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0436\u0435\u043b\u0435\u0437\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0426\u041e\u0414\u0430, \u0432 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 500 \u0441\u0442\u043e\u0435\u043a \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441 8 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u043a\u0443, \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah\" \/>\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-06-05T05:42:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-05T05:42:55+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\udd47One-cloud \u2014 Datacenter-Grade OS bei Odnoklassniki | ProHoster","description":"Hallo zusammen! Ich bin Oleg Anastasyev und arbeite bei Odnoklassniki im Platform-Team. Neben mir gibt es bei Odnoklassniki eine Menge Hardware. Wir betreiben vier Rechenzentren mit etwa 500 Racks und \u00fcber 8.000 Servern. Irgendwann haben wir erkannt, dass die Implementierung eines neuen Managementsystems es uns erm\u00f6glichen wird, die Hardware effizienter zu nutzen und das Management zu vereinfachen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\udd47One-cloud \u2014 \u041e\u0421 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430 \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 | ProHoster","og:description":"\u0410\u043b\u043e\u0445\u0430, \u043f\u0438\u043f\u043b! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0410\u043d\u0430\u0441\u0442\u0430\u0441\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0410 \u043a\u0440\u043e\u043c\u0435 \u043c\u0435\u043d\u044f, \u0432 \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0436\u0435\u043b\u0435\u0437\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0426\u041e\u0414\u0430, \u0432 \u043d\u0438\u0445 \u043e\u043a\u043e\u043b\u043e 500 \u0441\u0442\u043e\u0435\u043a \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441 8 \u0442\u044b\u0441\u044f\u0447\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0412 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u043a\u0443, \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/one-cloud-os-urovnya-data-czentra-v-odnoklassnikah","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-06-05T05:42:55+00:00","article:modified_time":"2020-06-05T05:42:55+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"84114","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 15:04:42","updated":"2022-10-02 14:53:14"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/84114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=84114"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/84114\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/84115"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=84114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=84114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=84114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}