如何增加 Amazon RDS for MySQL 或 Amazon RDS for PostgreSQL 執行個體的最大連線數?

2 分的閱讀內容
0

我想增加 Amazon Relational Database Service (Amazon RDS) for MySQL 或 Amazon RDS for PostgreSQL 資料庫執行個體的最大連線數。

解決方案

檢視目前的 max_connections 值

在 Amazon RDS for MySQL 中,max_connections 指標會監控同時用戶端連線的設定 (允許) 數目上限。

根據預設,max_connections 參數是基於下列 Amazon RDS for MySQL 內的公式 (從 DBInstanceClassMemory 值計算):

max_connections = DBInstanceClassMemory/12582880

若要檢查目前的 max_connections 值,請在連線至 Amazon RDS for MySQL 執行個體後執行下列命令:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

在 Amazon RDS for PostgreSQL 中,max_connections 指標會監控並行連線的設定數目上限。依預設,max_connections 參數是依據下列 Amazon RDS for PostgreSQL 內的公式 (從 DBInstanceClassMemory 值計算):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

如要檢查目前的 max_connections 值,請在連線至 Amazon RDS for PostgreSQL 執行個體後執行下列命令:

postgres=> show max_connections;

RDS for MySQL 和 RDS for PostgreSQL 兩者的 max_connections 預設值 取決於 Amazon RDS 執行個體所使用的執行個體類別。具有更多可用記憶體的資料庫執行個體類別支援大量的資料庫連線。

請注意,使用公式計算的 max_connections 預設數目可能會與前述命令傳回的預設連線數略有不同。這是因為總 DBInstanceClassMemory 中的某些記憶體會保留給基礎作業系統作業。上述命令僅考慮為 PostgreSQL 引擎而非基礎主機作業系統保留記憶體。

檢閱連線過多的原因

當用戶端連線數目超過 max_connections 值時,您會遇到類似下列內容的錯誤:

下列因素可能會導致您的資料庫連線超過 max_connections 值:

**資料庫執行個體的用戶端或應用程式連線數目增加:**此為工作負載或表格/資料列層級鎖定增加所造成。

**作業結束後不正確地關閉用戶端或應用程式連線:**當伺服器連線未正確關閉時,用戶端應用程式會開啟新的連線。經過一段時間後,這些新的伺服器連線可能會導致您的執行個體超過 max_connections 值。如要列出 RDS for MySQL 資料庫執行個體的所有作用中連線,請執行下列命令:

SHOW FULL PROCESSLIST

如要檢視 RDS for PostgreSQL 執行個體每個資料庫的連線,請執行下列命令:

SELECT datname, numbackends FROM pg_stat_database;

**睡眠連線:**當您為連線逾時參數 (例如 MySQL 中的 wait_timeoutInteractive_timeout) 設定較高值時,便會造成睡眠連線 (也稱為非作用中的開啟連線)。若您設定的連線限制非常高,即使您未使用這些連線,也可能會增加記憶體使用量。因此,當應用程式伺服器嘗試開啟與資料庫的所有用戶端連線時,可能會拒絕這些連線。如要終止 RDS for MySQL 資料庫執行個體中的睡眠連線,請執行下列命令:

CALL mysql.rds_kill(example-pid);

**閒置連線:**您可執行下列查詢,來檢視 RDS for PostgreSQL 執行個體中的閒置連線。此查詢顯示下列其中一種狀態超過 15 分鐘的後端程序相關資訊:「閒置」、「交易閒置」、「交易閒置 (已中止)」和「已停用」。

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

如要終止 RDS for PostgreSQL 執行個體中的閒置連線,請執行下列命令:

SELECT pg_terminate_backend(example-pid)

**秘訣:**最佳實務是僅設定應用程式效能所需的作用中連線。您也可以考慮升級到較大的 Amazon RDS 資料庫執行個體類別。

增加 max_connections 值

您可以使用下列方法,增加 RDS for MySQL 或 RDS for PostgresSQL 資料庫執行個體的連線數上限:

  • 使用自訂執行個體層級參數群組,為 max_connections 參數設定較大的值。增加 max_connections 參數不會導致任何中斷。即使您可將 max_connections 的值增加至超出預設值,但此並非最佳實務。這是因為,當工作負載增加且需要更多記憶體時,執行個體可能會遇到問題。增加連線數目可能會增加記憶體用量。記憶體不足的執行個體可能會當機。對於較小的執行個體尤其如此。若您增加 max_connections 值,請務必監控資源的使用狀況。此外,關於增加,請務必諮詢您的 DBA。最佳實務是保留預設值,或在需要更多連線時擴展為較大的執行個體類別。
  • 如果您的資料庫執行個體使用預設參數群組,請將參數群組變更為自訂參數群組。請務必將自訂資料庫參數群組與您的 Amazon RDS 執行個體建立關聯,然後重新啟動執行個體。新的自訂參數群組與資料庫執行個體建立關聯後,您可以修改 max_connections 參數值。如需詳細資訊,請參閱如何修改 Amazon RDS 資料庫參數群組的值?
    **注意:**變更參數群組可能會導致中斷。如需詳細資訊,請參閱使用資料庫參數群組
  • 將資料庫執行個體擴充成記憶體更多的資料庫執行個體類別。請注意,擴充 RDS 執行個體會影響帳戶的計費金額。若要進一步了解,請參閱 Amazon RDS 的資料庫執行個體帳單
    警告:修改 Amazon RDS 資料庫執行個體會造成停機。

依設定 max_connections 參數的最佳實務操作

使用資料庫執行個體的 max_connections 參數時,務必考慮下列最佳實務:

  • 預設連線限制會針對其他主要記憶體取用者 (例如:緩衝集區) 使用預設值的系統進行調整。最佳實務是為實體類別擴充規模,而不是變更執行個體類別值。但是,如果您的執行個體有大量的可用記憶體,那麼您可以手動變更此參數。變更這些資料庫執行個體的設定之前,請考慮調整連線限制,以利增減資料庫執行個體的可用記憶體容量。
  • max_connections 值應稍微高過您預計在各資料庫執行個體上開啟的最大連線數。
  • 若您為 RDS for MySQL 執行個體啟動了效能結構描述,請密切注意 max_connections 參數設定。效能結構描述記憶體結構會根據伺服器組態變數自動調整大小。您設定的變數越高,效能結構描述就會使用越多的記憶體。在極端案例中,此狀況可能會導致較小的執行個體類型 (例如:T2 和 T3) 發生記憶體不足的問題。如果您使用的是效能結構描述,那麼最佳實務是將 max_connections 設定保留為預設值。如果您打算大幅增加 max_connections 值 (高於預設值),請考慮停用效能結構描述。
    **注意:**若您啟動 Amazon RDS for MySQL 資料庫執行個體的績效詳情,則效能結構描述也會自動啟動。
  • 對於 RDS for MySQL 執行個體,當您調整 max_connect 參數時,請務必檢閱下列 MySQL 連線相關參數:**wait_timeout:**服務器在關閉連線之前等待非互動式 TCP/IP 或 Unix 檔案連線上的活動秒數
    **Interactive_timeout:**伺服器在關閉連線前等待互動式連線上的活動秒數
    **net_read_timeout:**在刪除讀取活動之前等待更多來自 TCP/IP 連線資料的秒數
    **net_write_timeout:**在刪除寫入活動之前等待 TCP/IP 連線上寫入區塊的秒數
    **max_execution_time:**SELECT 陳述式的執行逾時,以毫秒為單位
    **max_connect_errors:**若中斷連線數目超過此值,主機將遭封鎖而無法再次連線
    **max_user_connections:**任何給定 MySQL 帳戶所允許的同時連線最大數量
  • 對於 RDS for PostgreSQL 執行個體,當您調整 max_connections 參數時,請務必同時檢閱下列 PostgreSQL 連線相關參數:
    **idle_in_transaction_session_timeout:**使用閒置時間超過指定持續時間 (毫秒) 的開啟交易終止任何工作階段。此可釋放該工作階段所保留的任何鎖定,並重複使用連線插槽。此外,僅對此交易可見的元組進行清理。
    **tcp_keepalives_idle:**作業系統將 TCP keepalive 訊息傳送至用戶端之後的閒置秒數
    **tcp_keepalives_interval:**再次傳輸用戶端未確認之 TCP keepalive 訊息後的秒數
    tcp_keepalives_count:在伺服器與用戶端的連接被視為無效之前,可能遺失的 TCP keepalive 數量。

**注意:**本文章不包含所列參數的建議值,因為這些值會根據您的使用案例而有所不同。