Verwenden Sie Hikari CP, um die Verbindung zum Amazon Aurora-Cluster zu bündeln

Ich habe schon einmal einen Artikel wie diesen geschrieben.

Zu diesem Zeitpunkt habe ich DBCP2 für den Verbindungspool verwendet, da ich von der lokalen Tomcat 8 + MySQL 5.5-Umgebung auf den Tomcat 8 + Aurora-Cluster (MySQL-kompatibel) unter AWS EC2 migriert habe, aber es gab verschiedene Probleme und die Anpassung war schwierig.

Dieses Mal werde ich dies durch HikariCP (2.7.6) ersetzen und sehen, wie es sich ändert.

Probleme mit der Apache DBCP2-Verbindung

Kurz gesagt, es ist ** "nur langsam" **. Insbesondere "ist der Prozess des Erwerbs (Ausleihens) einer Verbindung aus dem Pool langsam".

aus diesem Grund,

Es ist leicht, in eine solche Situation zu geraten.

Was ist Hikari CP?

Es ist ein schneller, einfacher und äußerst zuverlässiger Verbindungspool.

Die Einführungsseite zeigt beispielhaft, wie Sie in Maven einbetten.

Ich denke, dass viele Leute es in Kombination mit Hibernate verwenden, daher werde ich die ausführliche Erklärung weglassen.

Aus DBCP2 ersetzt und getestet

Verwenden Sie in einer bestimmten Webanwendung (die unter Tomcat 8 ausgeführt wird) JNDI DataSource Factory und versuchen Sie, sie in ein treiberbasiertes Format zu integrieren.

Vor dem Austausch (DBCP2)

DBCP2-Verbindung


<Context reloadable="true" crossContext="true">
        <Resource
                name="jdbc/[Name des Verbindungspools]"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.mysql.jdbc.Driver"
                factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                url="jdbc:mysql://[Cluster-Endpunkt]/[DB Name]?useUnicode=true&amp;characterEncoding=utf8&amp;connectTimeout=10000&amp;socketTimeout=180000&amp;alwaysSendSetIsolation=false&amp;cacheServerConfiguration=true&amp;elideSetAutoCommits=true&amp;useLocalSessionState=true"
                username="[Verbundener Benutzername]"
                password="[Verbindungskennwort]"
                maxTotal="300"
                maxIdle="150"
                minIdle="10"
                initialSize="10"
                testOnBorrow="true"
                validationQuery="select concheck.validation()"
                validationQueryTimeout="10"
                timeBetweenEvictionRunsMillis="60000"
                maxWait="10000" />
</Context>

Nach dem Austausch (HikariCP)

Hikari CP-Verbindung


<Context reloadable="true" crossContext="true">
        <Resource
                name="jdbc/[Name des Verbindungspools]"
                auth="Container"
                type="javax.sql.DataSource"
                driverClassName="com.mysql.jdbc.Driver"
                factory="com.zaxxer.hikari.HikariJNDIFactory"
                jdbcUrl="jdbc:mysql://[Cluster-Endpunkt]/[DB Name]?useUnicode=true&amp;characterEncoding=utf8&amp;connectTimeout=10000&amp;socketTimeout=180000&amp;alwaysSendSetIsolation=false&amp;cacheServerConfiguration=true&amp;elideSetAutoCommits=true&amp;useLocalSessionState=true"
                dataSource.implicitCachingEnabled="true"
                dataSource.user="[Verbundener Benutzername]"
                dataSource.password="[Verbindungskennwort]"
                minimumIdle="10"
                maximumPoolSize="300"
                connectionTimeout="10000"
                idleTimeout="180000"
                maxLifetime="180000"
                connectionInitSql="select concheck.validation()"
                validationTimeout="9800" />
</Context>

Vergleich

JMeter hat 45 Minuten lang 3.000 Anfragen (750 Threads) pro Minute an eine Webanwendung gesendet. Dann habe ich aus mehreren Bildschirmanforderungen in der Webanwendung drei Arten von Rohverarbeitungszeiten (bei unabhängiger Ausführung) extrahiert: kurz / mittel / lang.

Anfrage (Bildschirm) Durchschnittswert Median 90%Wert 最小Wert 最大Wert
Kurzzeitbearbeitungsbildschirm 60 49 78 24 22,832
Mittlerer Bildschirm 234 177 332 86 21,607
Langzeitverarbeitungsbildschirm 728 171 1,827 45 24,557

Anfrage (Bildschirm) Durchschnittswert Median 90%Wert 最小Wert 最大Wert
Kurzzeitbearbeitungsbildschirm 46 45 57 22 347
Mittlerer Bildschirm 172 158 242 83 3,087
Langzeitverarbeitungsbildschirm 676 146 1,703 41 9,524

Hikari CP ist insgesamt schnell, aber ** bemerkenswert ist das Maximum **.

Im Fall von DBCP2 liegen alle kurz / mittel / lang im Bereich von 20 Sekunden. Dies liegt nicht daran, dass die Verarbeitung des DB-Servers (Aurora) beim parallelen SQL-Fluss langsam wurde, sondern es gab eine Wartezeit (die durch die Verarbeitung anderer Threads beeinflusst wird), um eine Verbindung aus dem Pool zu erhalten (auszuleihen). Zeigt an, dass Sie dies tun.

Wenn im Fall von HikariCP die Anzahl der Anforderungen ungefähr auf dieser Ebene liegt, wird eine Antwort im Bereich von ** "einfache SQL-Verarbeitungszeit + α" ** zurückgegeben.

Failover-Vorgang

Wenn bei DBCP2 die Betriebslast einer Anwendung hoch wird, besteht die Tendenz, dass die Wiederverbindung nach dem Failover sofort blockiert wird. Als ich ein Failover mit HikariCP unter der oben genannten Last ausführte, war es in einem Zustand, in dem die Wiederverbindung in kurzer Zeit durchgeführt wurde, wie in der folgenden Abbildung gezeigt.

hikari_reconnect.png

Zusammenfassung

Der Unterschied ist bei geringer Last nicht so spürbar, aber bei einem System mit einer bestimmten Last ändert sich die Leistung stark je nach Verbindungspool, was auch die Kapazität der Anzahl der Verbindungen (skalierbarer Bereich) und die Stabilität des Failover-Betriebs erhöht. Es stellt sich heraus, dass sich viel ändern wird.

Insbesondere bei der Migration von einer lokalen in eine AWS-Umgebung oder einer Migration nur von DB zu Aurora wird die Kommunikationsverzögerung (Latenz) von Webserver und Client, die SQL ausgibt, groß. ** "Was war das Problem mit DBCP2 zuvor? Ich hatte keine, aber sobald ich migriert bin, hat sich die Anzahl der Verbindungen nicht gut skaliert und ist verstopft. “** und andere Ereignisse treten häufig auf. Daher denke ich, dass es notwendig ist, bei der Migration sorgfältig zu überprüfen.


Recommended Posts

Verwenden Sie Hikari CP, um die Verbindung zum Amazon Aurora-Cluster zu bündeln
Verwenden Sie aus irgendeinem Grund zu verwenden
Die Geschichte des Wechsels von Amazon RDS für MySQL zu Amazon Aurora Serverless
Verwendung von binding.pry für die Ansichtsdatei
[Ruby] Wie man Slice für Anfänger benutzt