2017-05-17 74 views
1

我們正在使用MariaDB JDBC連接器Aurora特定功能測試故障轉移行爲。在MariaDB連接器中設置極光之後數據庫連接數增加

,我們設置了JDBC URL作爲the documentation suggest

jdbc:mysql:aurora://cluster.cluster-xxxx.us-east-1.rds.amazonaws.com/db 

的問題是,當我們在URL模式添加aurora:部分,我們可以看到數據庫作家的增加連接直到我們必須回滾更改(甚至達到3.000個連接)。

版本:

配置:

master { 
    profile = "slick.jdbc.MySQLProfile$" 
    db { 
    driver = "org.mariadb.jdbc.Driver" 
    url = "jdbc:mysql:aurora://cluster-name.cluster-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&rewriteBatchedStatements=true&usePipelineAuth=false" 
    user = "rw_user" 
    password = "rw_user_pass" 
    numThreads = 20 
    queueSize = 1000000 
    } 
} 
slaves = [ 
    { 
    profile = "slick.jdbc.MySQLProfile$" 
    db { 
     driver = "org.mariadb.jdbc.Driver" 
     url = "jdbc:mysql:aurora://cluster-name.cluster-ro-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&usePipelineAuth=false" 
     user = "ro_user" 
     password = "ro_user_pass" 
     numThreads = 20 
     queueSize = 1000000 
    } 
    } 
] 

我們會嘗試升級MariaDB的連接器版本後添加aurora:部分的JDBC URL模式,但在閱讀器連接的數量開始再次增加:

如果我們運行一個show processlist在只讀端點上,我們可以看到所有打開的連接都處於「清理」狀態,而「睡眠」命令。

我們已經從只讀端點刪除了aurora:部分,只是爲了穩定連接的數量。驅動程序是否有可能在打開連接時搜索集羣主節點?這將解釋這種行爲。

+0

(Mariadb跟蹤鏈接是https://jira.mariadb.org/projects/CONJ/issues/) –

+0

您可以執行「show processlist」來列出這些多個連接及其狀態嗎? –

+0

@DiegoDupin,感謝您的幫助。我編輯了這個問題,提供了有關該問題的更多詳細信息,包括連接狀態。 –

回答

2

當使用「極光」關鍵字,驅動程序,在引擎蓋下,創建2個連接:

  • 到主服務器的連接,
  • 到副本如果任何之一的連接。

目標總是在主服務器上節省資源。通常,只配置一個池。驅動程序然後根據[Connection.setReadOnly] [1]使用到主/副本的連接。

當您有單獨的「寫入」/「讀取」池時,使用配置「故障轉移」將解決您的問題:驅動程序將只使用一個實際連接。 這樣,就不會有「浪費」的連接。

然後故障轉移將以不同方式處理,但具有相同的結果(例如,不在要發送到剛剛崩潰的副本的事務中的查詢不會直接使用主連接,因爲在使用「極光「配置,在執行查詢之前,驅動程序將重新創建到另一個副本的新連接)。

+0

1.根據您的評論,那麼它不會太有意義有多個Aurora Reader實例,是嗎?我的意思是,如果驅動程序只會選擇其中一個讀取器副本,則不會在不同副本之間分配負載。它只在副本故障轉移的情況下有用:S 2.根據您的建議,我們應該將master的URL模式設置爲'jdbc:mysql:aurora://',將slave作爲' jdbc:mysql:failover://'([full example](https://pastebin.com/ieyn5fkH)),我理解你了嗎? 謝謝! –

+0

如果你只使用「master」池配置來連接master,那麼永遠不要使用connection.setReadOnly()或者像Spring @Transaction(readonly = true)那樣的組件來切換連接,那麼你可以使用「jdbc: MySQL的:故障轉移://」。這將避免爲每個與主機的連接創建一個從機連接。 –

+0

複製連接在有效主機中隨機選擇。之後,所有語句都將在該數據庫服務器上運行,直至連接關閉(或失敗)。因此,通過60個連接到3個副本的副本的副本,他們將大致20個連接到每個副本 –

1

一旦你通過幾十個活動連接,數據庫就開始絆倒自己。最好限制客戶端的連接,而不是假設您有無限的帶寬來接受Aurora中的連接。

+0

當然:) 問題是,如果我沒有將'aurora:'部分添加到JDBC URL模式,HikariCP(數據庫連接池)就可以正確管理客戶端中的連接數。但是,一旦我添加「極光:」部分,它就不會這樣做。 如果這是一個錯誤,我如何將它報告給MariaDB JDBC連接器?他們沒有在他們的回購中啓用GitHub「問題」:/ https://github.com/MariaDB/mariadb-connector-j/ –