Die Geschichte der Migration vom Heimserver (MariaDB + Java) auf AWS (DynamoDB + Python + PHP) mit reduzierten monatlichen Kosten

Schön dich kennenzulernen, mein Name ist Yuya Takeda (@kagamikarasu). Wir entwickeln "SOLD OUT 2 Market Information Site".

Die Sanierung der "Marktinformationsseite" begann um August 2020 und wurde im September ersetzt. Es ist über einen Monat her und hat sich beruhigt, daher möchte ich einen Artikel über die "Marktinformationsseite" schreiben.

Was ist AUSVERKAUFT 2?

Es ist ein "Online-Shop vorgeben" von mu betrieben. https://so2.mutoys.com/

Lernprogramm https://so2-docs.mutoys.com/common/tutorial.html

Sie geben Artikel aus, um neue Artikel zu erhalten, und verwenden sie, um neue Produkte zu erstellen und zu verkaufen. Verkauf an NPCs, Verkauf an Benutzer, Teilnahme an Veranstaltungen und Spielstile sind für jede Person unterschiedlich.

Was ist AUSVERKAUFT 2 Marktinformationsseite?

Dies ist eine von mir entwickelte Marktinformationsseite (@kagamikarasu). https://market.kagamikarasu.net/

Da die API von mu für die Öffentlichkeit zugänglich ist, habe ich sie damit entwickelt. Sie können den Preis- / Bestandsübergang für jedes Produkt und die Anzahl der Bestandsreduzierungen für jedes Geschäft im Diagramm- / Tabellenformat erfassen.

Der Endbenutzer kann lediglich eine Referenz erstellen.

Warum haben Sie es neu entwickelt?

Ich lief auf meinem Heimserver + Conoha (LB-Rolle) + Java 1.8 + MySQL (später MariaDB). Es wurde schwierig zu entwickeln, also habe ich es neu entwickelt.

Java ist chaotisch, das Abrufen und Bereitstellen von Zertifikaten ist mühsam. Ich wollte meinen Heimserver (kein PC / USV) wegen der aufgeblähten Datenbank beenden ...

Kampf gegen das Aufblähen der Datenbank

Es waren über eine Milliarde Datensätze auf einem großen Tisch. Zuerst habe ich an nichts gedacht, also habe ich nicht an die Datenmenge gedacht.

Ich hatte das Gefühl, dass es offensichtlich langsam war, also überprüfte ich den Index und die Suchbedingungen, aber Ich befand mich in einem Zustand des Wassers auf dem verbrannten Stein, also löste ich ihn, indem ich den Speicher änderte und IOPS verdiente.

Festplatte → SSD → SSD (NVME) in 3 Jahren. NVME ist sehr schnell, bis dahin, wenn Sie süß sagen Haben Sie bei der Eingabe des Befehls einen Fehler gemacht, weil die Migration beim Ändern des Speichers zu schnell war? Ich bezweifle das.

Übergangsziel

Ich habe gerade SAA studiert und mich für AWS entschieden. Das größte Problem ist, die vierte monatliche Gebühr niedrig zu halten.

Wenn es sich um RDS + EC2 + ALB handelt, ohne an irgendetwas zu denken, denke ich, dass RDS je nach Konfiguration ein angemessener Geldbetrag sein wird. Es ist nichts für ein Unternehmen, aber es ist sehr schmerzhaft für eine Person (zumindest für mich) ('A')

Service verwendet

* Bitte befolgen Sie die Dosierung für die unten aufgeführten Artikel. </ font>

  • DynamoDB (auf Anfrage)
  • SQS (Standardwarteschlange)
  • Lambda(Python+Pandas) + CloudWatchEvent
  • ECS(EC2spot+ECR+ALB)
  • S3 (HIVE + JSON-Format)
  • Route53
  • API Gateway

Konfigurationsdiagramm nach der Migration

スクリーンショット 2020-10-28 15.15.07.png

DynamoDB Die Migration auf RDS (MariaDB) ist am einfachsten. Wenn Sie jedoch Hunderte von GB Daten migrieren und betreiben, werden die Betriebskosten reduziert. Ich habe geschrieben, dass es auf mehrere hundert GB migrieren wird, aber alle Migrationsdaten werden im HIVE-Format + JSON-Format an S3 übertragen. Führen Sie gegebenenfalls S3 → Lambda → SQS → DyanamoDB aus, was später beschrieben wird.

Die kostenlose Stufe von DynamoDB beträgt zum Zeitpunkt des Schreibens des Artikels 25 GB und 25 On-Demand-WCU / RCU.

  • 1WCU kann in 1 Sekunde bis zu 1 KB Daten schreiben
  • 1 RCU kann in 1 Sekunde bis zu 4 KB Daten lesen

Daher ist es wünschenswert, die Daten pro Datensatz innerhalb von 1 KB zu halten. Dieses Mal wird nur eine Tabelle verwendet und 5WCU / RCU zugewiesen. Da die Marktinformationsseite jedes Element extrahiert, lautet der Partitionsschlüssel natürlich item_id. Da ich es in chronologischer Reihenfolge haben möchte, ist der Sortierschlüssel die UNIX-Zeit des Registrierungsdatums und der Registrierungszeit.

In der Datenbank vor der Migration (MariaDB) hatten wir Daten in Speichereinheiten (vor der Aggregation) in Intervallen von 10 Minuten. Die migrierte Datenbank (DyanmoDB) enthält Daten in Artikeleinheiten (aggregiert) in Intervallen von 3 Stunden.

Da auch SQS verwendet wird, wird die spezifische Aggregations- / Speichermethode später beschrieben, der WCU-Verbrauch entspricht jedoch der in der folgenden Abbildung gezeigten. Sie können die Datenbank weiterhin kostenlos nutzen, solange die Kapazität innerhalb von 25 GB liegt.

スクリーンショット 2020-10-27 15.02.58.png

SQS Als nächstes kommt SQS. Ich hatte noch nie von Warteschlangen gewusst, aber als ich SAA studierte, stellte ich fest, dass es sehr gut war und entschied mich, es in Kombination mit DynamoDB zu verwenden.

Die kostenlose Stufe für SQS beträgt 1 Million Anfragen. Ich habe es zuerst nicht verstanden, aber ich werde 2 Anfragen zum Senden und Empfangen verwenden. Derzeit schätzen wir auf 2000 Artikel, daher setzen wir diese in 3-Stunden-Einheiten, um sie auf 1 Million Anfragen zu begrenzen. 2000 * 8 * 30 * 2 = 960.000 Da es sich um SQS handelt, ist es in Ordnung, wenn Sie ein wenig herauskommen, aber ich möchte es so frei wie möglich halten, also alle 3 Stunden.

Wie oben erwähnt, werden aggregierte Daten alle 3 Stunden in DynamoDB gespeichert. Es wird in Artikeleinheiten gespeichert, aber derzeit war es notwendig, etwa 2000 Artikel alle 3 Stunden zu speichern. Wenn Sie 2000 Artikel in 1 Sekunde speichern, benötigen Sie 2000WCU als 1 KB pro Artikel. Da es für mehr als 1000 US-Dollar pro Monat bankrott gehen wird, werde ich dieses Mal SQS und DynamoDB kombinieren, um das Schreib-Timing zu verschieben.

Insbesondere ist es Lambda (Aggregation) → SQS → Lambda (SQS-Extraktion / DynamoDB-Speicher) → DynamoDB. Es muss kein FIFO sein, daher wird eine Standardwarteschlange verwendet.

Zuerst dachte ich, dass der Lambda-Trigger von SQS praktisch ist, aber es gab einen Verbrauch, von dem ich nicht erwartet hatte, dass er überwacht wird, und als ich ihn untersuchte, trat Folgendes auf. Referenz: https://encr.jp/blog/posts/20200326_morning/

Es ist eine kleine Sache, aber ich fühlte mich ein wenig unwohl, deshalb habe ich beschlossen, sie mit CloudWatch Event und Lambda anstelle von Lambda-Trigger selbst aus SQS zu holen.

Die Anzahl der empfangenen SQS ist wie folgt. In CloudWatch Event wird die Warteschlange in Einheiten von 1 Minute angezeigt, und Lambda legt ein Limit für die Warteschlangenerfassung fest, um eine Kapazitätsüberlastung so weit wie möglich zu verhindern.

スクリーンショット 2020-10-27 16.15.14.png

Lambda CloudWatch Event + Lambda ist für die gesamte Erfassung und Aggregation verantwortlich.

Lambda ist die Anzahl der Anforderungen und die Ausführungszeit. Die kostenlose Stufe umfasst 1 Million Anfragen und 400.000 GB Sekunden. Zumindest hat meine Nutzung die kostenlose Stufe nicht überschritten. (Etwas mehr als 10% des freien Rahmens)

Zum Zeitpunkt des Schreibens werden die folgenden Funktionen erstellt.

  • Stammdatenerfassung (S3 speichern)
  • Erfassung von Verkaufs- / Auftragsdaten (in S3 speichern)
  • Aggregation von Verkaufs- / Auftragsdaten (S3-Erfassung / Speicherung / SQS)
  • Erfassung von Bevölkerungsdaten (S3 speichern)
  • Aggregation von Bevölkerungsdaten (S3-Erfassung / Speicherung / SQS)
  • Antwortfunktion für API Gateway
  • Andere Funktionen zur Erstellung von Inhalten

Da ich Python + Pandas verwende, ist die Aggregation sehr einfach. Zuerst dachte ich, ich könnte es forcieren, aber es wurde im Gedächtnis sehr schmerzhaft, also benutzte ich Pandas.

Da das Serverless Framework verwendet wird, ist die Bereitstellung einfacher. Ich denke, dass das, was ich tue, dasselbe ist wie CloudFormation, daher beschreibe ich auch API Gateway.

  • Administratorrechte sind erforderlich, aber ich denke, dies ist aufgrund des Mechanismus unvermeidbar ...

Wenn Sie den Test und die Bereitstellung wiederholen, steigt der Abfall wahrscheinlich aufgrund der Versionsverwaltung. Ich denke, Sie sollten "Serverless-Prune-Plugin" verwenden, um es automatisch zu löschen.

Der Nutzungsbetrag für Lambda ist wie folgt. Die zugewiesene Speichermenge hängt von der Funktion ab, ist jedoch auf 128 MB bis 512 MB eingestellt.

スクリーンショット 2020-10-27 16.49.43.png

CloudWatchEvent Wird für die Stapelverarbeitung verwendet (reguläre Verarbeitung). Ich denke, es gibt verschiedene Dinge wie EC2 + cron und digdag, aber da Lambda verwendet werden kann, werde ich es mit CloudWatch Event kombinieren.

Als ich dachte, dass die Charge zu einem bestimmten Zeitpunkt nicht funktionierte, war es GMT ... Da die Sprache auf Japanisch eingestellt ist, war ich vorsichtig mit JST ...

ECS(EC2) In Bezug auf ECS ist dies sehr mächtig. Es ist eine Kombination aus ECR + ECS + ALB + Route53.

  1. ECR - Halten des Docker-Images
  2. ECS (Service-> Task) - Docker-Container ausführen
  3. ALB-Target der ECS-Aufgabe (Docker-Container)
  4. Route 53 - Docker-Kommunikation zwischen Containern mithilfe der ECS-Diensterkennung

Ich benutze EC2 anstelle von Fargate. (Weil es billig ist ...) Mit ECS und ALB können Sie mehrere Aufgaben-> Docker-Container in einer EC2-Instanz ausführen.

Auf diese Weise können Sie die Bereitstellung ohne Aktualisierung oder Hinzufügen neuer Instanzen durchführen. (Es sei denn, es ist das Speicherlimit der Instanz) Die Existenz der EC2-Instanz selbst wird dünn, und da sie vom Docker ausgeführt wird, wird keine Verbindung über SSH selbst hergestellt.

EC2 verwendet auch Spot-Instanzen. Dies hat je nach Instanztyp zu einer Reduzierung der Gebühren um 70% im Vergleich zu On-Demand-Instanzen geführt. スクリーンショット 2020-10-27 22.29.05.png

Anstelle eines großen Rabattes ist es ein Ersatz, der jederzeit von AWS unterbrochen werden kann. Wenn dies fehlschlägt, füllt Spot Fleet die erforderlichen Instanzen automatisch auf und der ECS-Dienst füllt die erforderlichen Aufgaben auf. Gleichzeitig funktioniert der Gesundheitscheck von ALB, abnormale Dinge werden vom Ziel entfernt und normale Dinge werden ins Visier genommen.

Da ich diesmal die t3.micro-Instanz verwendet habe, kostet sie ungefähr 1 Yen pro Stunde, und wenn sie 1 Monat lang von 2 Einheiten betrieben wird, sind es ungefähr 1440 Yen. Da wir Spot-Instanzen verwenden, sind es diesmal 432 Yen mit einem Rabatt von 70%, je nach Fall.

ALB Wie bereits erwähnt, wird es für die Kombination mit ECS verwendet, es ist jedoch möglich, Zertifikate von ACM zu verwenden. Es ist viel einfacher als Let's Encrypt, weil es nur ein Knopfdruck ist.

Abhängig von der Anzahl der Zugriffe wird es jedoch wahrscheinlich etwa 2000 Yen kosten. Der persönliche Gebrauch ist etwas teuer, wenn Sie ihn nur mit einem einzigen Dienst verwenden. Da jedoch Host-basiertes Ruding möglich ist, Wenn Sie mehrere Dienste ausführen, ist dies meiner Meinung nach keine hohe Investition in Bezug auf ECS, ACM, Routing und Verwaltung.

Außerdem werden Sticky-Sitzungen deaktiviert, da Redis die Sitzungen verwaltet. Dies liegt daran, dass, wenn EC2 beim Einschalten plötzlich abfällt, auf das heruntergefallene EC2 zugegriffen wird.

Route 53 Es wird um die Domain sein. Übrigens haben wir in Bezug auf die Domain letztes Jahr von "Name.com" auf "Route 53" gewechselt. Grundsätzlich kostet es ungefähr 50 Yen pro Monat.

Abgesehen davon gibt es eine Funktion namens ECS Service Discovery. Es ist schwierig, eine Kommunikation zwischen Containern mit ECS zu realisieren. (Obwohl verschiedene Container auf demselben Server verbunden werden können, verschiedene Server, Netzwerkmodus usw.)

Bei der Diensterkennung können bei ECS registrierte Dienste automatisch in der internen Hostzone registriert / aktualisiert werden. Wenn der Netzwerkmodus awsvpc ist, kann ein Datensatz registriert werden.

Da eine neue Hostzone erstellt wird, kostet dies etwa 50 Yen erneut. Es ist jedoch sehr hilfreich, den Dienst und die interne Domäne automatisch zu verknüpfen. Selbst wenn der Dienst (die Aufgabe) ausfällt, kehrt ECS automatisch zurück und verknüpft ihn.

In dieser Umgebung ist Redis (nicht ElastiCache) in ECS eingerichtet Es dient zur Kommunikation mit der Anwendungsseite (separater Container). Es wäre schön, ElastiCache verwenden zu können, aber es kostet Geld ...

S3 In S3 werden Ihnen der Speicherbetrag und GET / PUT in Rechnung gestellt. In diesem System werden Stammdaten und Vor- / Nachdaten in S3 gespeichert. Da PUT nur auf der Systemseite ausgeführt werden kann, versuche ich, es nicht so weit wie möglich zu generieren. Da GET jedoch vom Timing des Benutzers abhängt, zwischenspeichern Sie es in EC2 mit Redis, damit GET nicht so häufig wie möglich auftritt. Ich bin.

スクリーンショット 2020-10-27 22.57.37.png

Crawler Maßnahmen

Kommunikation kostet auch Geld, es ist eine kleine Sache, aber ich denke, je mehr Sie Dienste kombinieren, desto größer sind die Auswirkungen. Insbesondere in ALB fallen für neue Verbindungen Gebühren an, sodass ich keine Kommunikation verschwenden möchte. Es ist schön, dass robots.txt damit umgehen kann, aber ich denke, es ist auch eine gute Idee, die eingehende Verbindung mit ACL zu trennen.

Ungefähr 2 Monate später

Ich habe mich gefragt, ob es instabil sein würde, weil ich eine Spot-Instanz verwendet habe, aber ich war überrascht, dass es keine Beweise dafür gab, dass sie gefallen war. Ich habe nach dem Austausch einige Wochen lang neue Funktionen entwickelt, aber die Entwicklung ist viel einfacher als in der vorherigen Umgebung.

Zumal es mit Docker entwickelt wurde, ist es zum Zeitpunkt der Erstellung etwas schwierig, aber danach erstellen und aktualisieren Sie einfach die Aufgabe. Pandas auf der Lambda-Seite sind ebenfalls sehr einfach zu handhaben, und sobald der Mechanismus eingerichtet ist, habe ich das Gefühl, dass ich alles tun kann. → Grundsätzlich werden Daten von Lambda generiert, von Laravel in Redis gespeichert und das Ergebnis an den Benutzer zurückgegeben.

Der Nutzungsbetrag der kostenlosen Stufe war vor Monatsende wie folgt. スクリーンショット 2020-10-28 15.31.42.png

Es ist über ein Jahr her, seit ich mein Konto erstellt habe, also dachte ich, ich hätte keine einjährige kostenlose Stufe. Es war eine kostenlose Stufe und es wurde keine Abrechnung vorgenommen. Ist es ein Jahr ab der ersten Abrechnung, anstatt ein Konto zu erstellen?

Zukunftsaussichten

Dieses Mal habe ich das Gefühl, den Übergang geschafft zu haben. Da alle früheren Daten in S3 gespeichert sind, können sie bei Bedarf in DynamoDB wiedergegeben werden. (Ich habe das Gefühl, dass frühere Daten nicht viel benötigt werden ....)

Da ich nur Konstruktionsarbeiten durchgeführt habe, sind die Betriebsarbeiten spärlich. Der Bereitstellungsprozess ist beispielsweise manuell. Ich möchte CircleCI und CodeDeploy nacheinander kombinieren, aber ich frage mich, ob ich in Schwierigkeiten bin, wenn ich mich selbst entwickle.

Außerdem ist die Überwachungsumgebung ebenfalls spärlich. Wir überwachen die äußere Form nicht und richten SNS nicht ein. Ich habe kürzlich bemerkt, dass ich robots.txt und ACL festgelegt habe, weil Bots viel zugreifen und LCU nüchtern verbrauchen. Da das Protokoll in CloudWatch ausgegeben wird, möchte ich eine Umgebung erstellen, in der es einfach analysiert werden kann.

Da es sich um numerische Daten handelt, halte ich es für interessant, maschinelles Lernen auszuprobieren. Eigentlich habe ich es ein wenig berührt (multiple Regression), aber ich habe auf meinem PC mit vielen Parametern geschrien ('A') Lambda ist sehr hart, daher frage ich mich, ob es sich anfühlt, eine Instanz einzurichten und zu analysieren.

Schließlich

Der Inhalt jedes einzelnen ist dünn geworden, aber wenn ich die Gelegenheit dazu habe, möchte ich mich damit befassen und einen Artikel schreiben. Danke, dass Sie so weit gelesen haben!

Recommended Posts

Die Geschichte der Migration vom Heimserver (MariaDB + Java) auf AWS (DynamoDB + Python + PHP) mit reduzierten monatlichen Kosten
Vom Anfangszustand von CentOS8 bis zum Ausführen von PHP Python Perl Ruby mit Nginx
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
SSH-Anmeldung am Zielserver von Windows mit einem Klick auf eine Verknüpfung
Die Geschichte vom Umzug von Pipenv zur Poesie
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Eine Geschichte über den Versuch, mit der kostenlosen Stufe von AWS zur COVID-19-Analyse beizutragen, und das Scheitern
Die Geschichte des Starts eines Minecraft-Servers von Discord
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Lerne Nim mit Python (ab Anfang des Jahres).
ODBC-Zugriff auf SQL Server von Linux mit Python
So kratzen Sie mit Python den Aktienkurs einer einzelnen Aktie von der Nikkei Shimbun-Website
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~
Python-Skript, das den Status des Servers über den Browser überprüfen kann
Die Geschichte der Implementierung des Themas Facebook Messenger Bot mit Python
Die Geschichte der Einführung von Jedi (automatisches Vervollständigungspaket von Python) in Emacs
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Immerhin die Geschichte der Rückkehr von Linux zu Windows
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Aggregieren Sie die täglichen Treffer pro Sekunde aus den Webserver-Protokollen in Python
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Der neueste NGINX ist ein Anwendungsserver! ?? Ich habe den Benchmark von NGINX Unit mit PHP, Python, Go! !!
Versuchen Sie, die Position des Senders aus dem Funkwellenausbreitungsmodell mit Python [Wi-Fi, Beacon] zu berechnen.
Flirte von PHP nach Python
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte, dass man mit Pycharm kein Pygame spielen kann
Der 14. März ist der Tag des Umfangsverhältnisses. Die Geschichte der Berechnung des Umfangsverhältnisses mit Python
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Terminalzuordnung von der Serverseite zu Amazon SNS (Python + Boto3)
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Vom "Zeichnen" zum "Schreiben" des Konfigurationsdiagramms: Zeichnen Sie das AWS-Konfigurationsdiagramm mit Diagrammen
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Wie man mit dem Problem umgeht, dass die Erstellung fehlschlägt, wenn CI / CD von Python Function mit AWS Amplify
[Abgeschlossene Version] Versuchen Sie, die Anzahl der Einwohner der Stadt anhand der Adressliste mit Python herauszufinden
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter