Wie kann ich eine unverschlüsselte Amazon RDS DB-Instance für MySQL oder MariaDB mit minimalen Ausfallzeiten verschlüsseln?

Lesedauer: 5 Minute
0

Ich habe versucht, eine verschlüsselte Read Replica meiner unverschlüsselten Amazon Relational Database Service (Amazon RDS) -Instance für MySQL oder MariaDB zu erstellen. Ich habe jedoch eine Fehlermeldung erhalten. Wie kann ich das lösen?

Kurzbeschreibung

Amazon RDS hat die folgenden Einschränkungen für verschlüsselte DB-Instances:

  • Sie können eine bestehende unverschlüsselte Amazon RDS-DB-Instance nicht ändern, um die Instance zu verschlüsseln.
  • Sie können kein verschlüsseltes Lesereplikat aus einer unverschlüsselten Instance erstellen.

Da Sie eine bestehende Amazon RDS-Instance nicht verschlüsseln können, müssen Sie eine neue verschlüsselte Instance erstellen. Andernfalls erhalten Sie beim Erstellen einer verschlüsselten Read Replica einer unverschlüsselten Amazon RDS for MySQL-Instance die folgende Fehlermeldung:

"You cannot create an encrypted Read Replica from an unencrypted DB
            instance. (Service: AmazonRDS; Status Code: 400; Error Code:
            InvalidParameterCombination; Request ID:)"

Gehen Sie wie folgt vor, um eine unverschlüsselte DB-Instance mit minimalen Ausfallzeiten zu verschlüsseln:

1.Verschlüsseln Sie einen unverschlüsselten Snapshot, den Sie aus einer unverschlüsselten Read Replica der DB-Instance erstellen.

2.Stellen Sie eine neue DB-Instance aus dem verschlüsselten Snapshot wieder her, um eine neue verschlüsselte DB-Instance bereitzustellen.

3.Verwenden Sie die MySQL-Replikation, um Änderungen von der Quelle zur neuen verschlüsselten DB-Instance zu synchronisieren.

4.Stellen Sie sicher, dass die neue, verschlüsselte DB-Instance mit der Quell-DB-Instance synchronisiert ist.

5.Wechseln Sie Ihre Verbindungen und leiten Sie Ihren Traffic an die neue DB-Instance weiter.

Behebung

Einrichtung der Replikation mit minimalen Ausfallzeiten

1.Erstellen Sie ein temporäres Read Replica für die unverschlüsselte Amazon RDS-DB-Instance als Quelle. In diesem Beispiel heißt die unverschlüsselte Quell-DB-Instance QUELLE-EU und das temporäre Read Replica heißt TEMP-RR.

2.Stellen Sie eine Verbindung zu TEMP-RR her und beobachten Sie die Replikatverzögerung, bis Seconds_Behind_Master stabil auf dem Wert 0 ist. Dies deutet darauf hin, dass TEMP-RR mit QUELLE-EU synchronisiert ist:

mysql> SHOW SLAVE STATUS \G
Seconds_Behind_Master: 0

3.Stoppen Sie den Replikation-Prozess auf TEMP-RR.

MySQL > call mysql.rds_stop_replication;
+---------------------------+
| Message                   |
+---------------------------+
| Slave is down or disabled |
+---------------------------+

4.Notieren Sie sich die Werte für Relay_Master_Log_File und Exec_Master_Log_Pos von TEMP-RR:

mysql> SHOW SLAVE STATUS \G
Relay_Master_Log_File: mysql-bin-changelog.000012
Exec_Master_Log_Pos: 123

5.Stellen Sie in QUELLE-EU den Parameter Binlog-Aufbewahrungszeiten ein, um Binärprotokolle für die Zeit aufzubewahren, die für den Abschluss des Vorgangs erforderlich ist. Im folgenden Beispiel sind die Binlog-Aufbewahrungszeiten auf 24 Stunden festgelegt:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

6.Machen Sie einen Snapshot von TEMP-RR. Löschen Sie optional TEMP-RR, nachdem Sie den Snapshot erstellt haben.

7.Kopieren Sie den Snapshot von TEMP-RR und setzen Sie Enable Encryption auf Ja.

8.Stellen Sie eine neue DB-Instance aus dem kopierten Snapshot wieder her, für den die Verschlüsselung aktiviert ist. In diesem Beispiel heißt die neue verschlüsselte DB-Instance NEU-RR-EN.

9.Ändern Sie die eingehenden Regeln in der Sicherheitsgruppe QUELLE-EU, um den Datenverkehr von NEU-RR-EN zuzulassen. Wenn Sie dieselbe Sicherheitsgruppe auf beiden DB-Instances verwenden, können Sie dieselbe Sicherheitsgruppen-ID-Referenz wie QUELLE-EU verwenden.

**Hinweis:**Achten Sie darauf, ausgehenden Datenverkehr von NEU-RR-EN nach QUELLE-EU zuzulassen.

10.Melden Sie sich bei QUELLE-EU an, richten Sie einen Replikationsbenutzer ein und gewähren Sie dem Benutzer dann die erforderlichen Berechtigungen:

mysql> create user 'repl_user'@'%' identified by 'password123';
mysql> grant replication slave, replication client on *.* to 'repl_user'@'%';
mysql> show grants for 'repl_user'@'%';

**Hinweis:**Ersetzen Sie repl_user durch Ihren eigenen Replikationsbenutzernamen und password123 durch Ihr eigenes Passwort.

11.Stellen Sie eine Verbindung zu NEU-RR-EN her und stellen Sie eine Replikationsverbindung zu QUELLE-EU her:

mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );

Der rds-Endpunkt ist der DB-Instance-Endpunkt für QUELLE-EU.

Der Benutzername (repl_user) und das Passwort (password123) sind der Benutzername und das Passwort, die Sie in Schritt 10 erstellt haben. Verwenden Sie die erfassten Werte von Relay_Master_Log_File und Exec_Master_Log\ _Pos aus Schritt 4, um die Replikation mit der Prozedur mysql.rds_set_external_master einzurichten.

Hinweis: Wenn QUELLE-EUöffentlich zugänglich ist und NEU-RR-EN (neue verschlüsselte DB-Instance) auf „privat“ gesetzt ist, verwenden Sie die private IP-Adresse (von QUELLE-EU) anstelle von rds-endpoint.

12.Starten Sie von NEU-RR-EN aus die Replikation:

mysql > CALL mysql.rds_start_replication;

13.Vergewissern Sie sich von NEU-RR-EN aus, dass die Replikation erfolgreich und synchron zwischen QUELLE-EU und NEU-RR-EN war.

mysql> SHOW SLAVE STATUS \G

Wenn Ihre Verbindung zwischen der Quell-DB-Instance und der Read Replica erfolgreich ist, sieht Ihre Ausgabe wie folgt aus:

Slave_IO_State: Waiting for master to send event
Seconds Behind master: 0

14.Nachdem Seconds_Behind_Master stabil auf dem Wert 0 ist, stoppen Sie den Datenverkehr und schließen Sie die Verbindungen auf QUELLE-EU. Dann beginnt die Ausfallzeit.

**Hinweis:**Stoppen Sie alle Anwendungsserver und Clients, die eine Verbindung zu QUELLE-EU herstellen, um sicherzustellen, dass keine neuen Änderungen an QUELLE-EU vorgenommen werden. Optional können Sie die von QUELLE-EU verwendete Sicherheitsgruppe vorübergehend sperren. Dadurch wird eingehender Datenverkehr von jeder Anwendung oder jedem Client verhindert, mit Ausnahme von NEU-RR-EN und dem Host, von dem aus der Benutzer diese Aktionen ausführt.

15.Stellen Sie als Datenbank-Master-Benutzer eine Verbindung zu NEU-RR-EN her und beenden Sie dann die Replikation:

MySQL > call mysql.rds_stop_replication;

**Wichtig:**Nachdem Sie diesen Befehl ausgeführt haben, repliziert NEU-RR-EN keine Daten mehr aus QUELLE-EU.

16.Machen Sie NEU-RR-EN zu einem eigenständigen Server, indem Sie die Replikationsbeziehung zwischen QUELLE-EU und NEU-RR-EN beenden:

MySQL > call mysql.rds_reset_external_master;

17.Verweisen Sie alle Anwendungen, Clients und Datenbankverbindungen auf NEU-RR-EN, indem Sie den DNS-Endpunkt NEU-RR-EN in allen Verbindungszeichenfolgen angeben. Oder benennen Sie QUELLE-EU um und ändern Sie dann NEU-RR-EN, sodass es denselben Namen verwendet, den QUELLE-EU verwendet.

18.Vergewissern Sie sich, dass die Sicherheitsgruppenregeln auf NEU-RR-EN eingehenden Datenverkehr von den entsprechenden Anwendungen und Clients zulassen.

19.Nachdem Sie die Anwendungen und Clients auf NEU-RR-EN verwiesen und die Umgebung getestet haben, löschen Sie QUELLE-EU.

**Tipp:**Es hat sich bewährt, diesen Vorgang auf einer Test-Instance zu testen, bevor dieser Vorgang in einer Produktionsumgebung angewendet wird.


Weitere Informationen

Mit Read Replicas arbeiten

Wie verschlüssele ich Amazon RDS-Snapshots?

Problembehandlung bei der Replikation in der MySQL-Dokumentation

Konfiguration der Positionsreplikation von binären Logdateien mit einer externen Master-Instance

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren