為什麼會在 Amazon Aurora 資料庫叢集發生容錯移轉之後遇到唯讀錯誤?

1 分的閱讀內容
0

我正在使用 Amazon Aurora 資料庫叢集,在容錯移轉後收到下列錯誤訊息: 「MySQL 伺服器正在使用 --read-only 選項執行,因此它無法執行此陳述式」如何解決此錯誤?

簡短描述

當 Amazon Aurora 資料庫叢集遇到多可用區容錯移轉時,叢集端點會自動更新以反映並指向新指定的寫入器和讀取器角色。舊的寫入器會重新啟動,然後在現有複本提升為寫入器時被設定為唯讀模式。

如果您收到唯讀錯誤訊息,這表示您正在嘗試透過具有讀取器角色的現有節點執行資料定義語言 (DDL)、資料操作語言 (DML) 或資料控制語言 (DCL) 操作。在 Aurora MySQL 中,您可以通過檢查 innodb_read_only 變數來確認這一點,如下所示:

mysql> show variables where variable_name='innodb_read_only';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | ON    |
+------------------+-------+
1 row in set (0.01 sec)

解決方法

利用叢集寫入器端點

由於 Aurora 叢集中資料庫執行個體的角色可能會變更,因此最佳做法是使用叢集寫入器端點來確保始終指向最新的寫入器。如果您使用資料庫執行個體端點或直接 IP 地址,則可能不會注意到發生容錯移轉,並將在重新連線至相同主機時收到唯讀訊息。這將阻止您按預期執行任何 DDL/DML 變更。

不要過度快取 DNS

如果您沒有使用智慧型驅動程式,則在容錯移轉事件發生後,您會依賴 DNS 記錄更新和傳播。Aurora DNS 區域使用 5 秒的短存留時間 (TTL),因此重要的是,您的網路和用戶端設定不要進一步增加此時間。DNS 快取可以發生在架構的多個層級,例如作業系統 (OS)、網路層和應用程式容器。了解這些層級的設定方式非常重要。如果有非預期 DNS 快取超過 5 秒的 TTL,您可能會在容錯移轉後重新連線至舊的寫入器。

Java 虛擬機器 (JVM) 可以無限期地過度快取 DNS。當 JVM 將主機名稱解析為 IP 地址時,它會在一段指定的時間 (TTL) 內快取 IP 地址。在某些組態中,JVM 預設 TTL 會設定為在重新啟動 JVM 前永遠不換重新整理 DNS 項目。這可能會導致容錯移轉後發生唯讀錯誤。在這種情況下,請務必手動設定小型 TTL,以便定期重新整理。

使用智慧型驅動程式

Amazon Aurora 資料庫叢集端點會自動傳播 DNS 記錄更新,但程序不會立即進行。這可能會導致對資料庫上發生的事件的回應延遲,而且應用程式可能會處理該事件。智慧型驅動程式透過近乎即時的 INFORMATION_SCHEMA.REPLICA_HOST_STATUS 中繼資料資料表使用資料庫叢集地形。這有助於將連線路由至適當的角色,並有助於在現有複本之間進行負載平衡。MariaDB Connector/J 第三方智慧型驅動程式底範例,其對 Aurora MySQL 提供原生支援。

注意: 即使是智慧型驅動程式也可能受到過度 DNS 快取的影響。

測試您連線到哪個執行個體

正如 Aurora 連線管理手冊的最佳做法中所述,在不使用智慧型驅動程式時,您應該測試並了解在建立新連線後登入的執行個體。這可協助您確認已連線至正確的執行個體。您可以使用 @@innodb_read_only variable 測試您是否已連線至寫入器執行個體或 Aurora 讀取器。此範例顯示的值為 0,表示您已連線至寫入器。

mysql> select @@innodb_read_only;
+--------------------+
| @@innodb_read_only |
+--------------------+
| 0                  |
+--------------------+
1 row in set (0.00 sec)

相關資訊

Amazon Aurora 連線管理

為 DNS 名稱查詢設定 JVM TTL

DBA 連線管理手冊

AWS 官方
AWS 官方已更新 3 年前