在你的Python應用程序中測試MongoDB故障轉移

(此處已添加圈子卡片,請到今日頭條客戶端查看)

Python是一種強大而靈活的編程語言,全世界有數百萬開發人員使用它來構建他們的應用程序。Python開發人員通常使用MongoDB主機(最流行的NoSQL數據庫)進行應用部署,這並不奇怪,因為它很靈活且對模式沒有要求。

那麼,在Python中使用MongoDB的最佳方式是什麼?PyMongo是一個Python發行版庫,它包含用於使用MongoDB的工具,以及推薦的PythonMongoDB驅動程序。它是一個相當成熟的驅動程序,支持數據庫的大多數常見操作,你可以查看本教程來了解PyMongo驅動程序的介紹。

在生產環境中部署時,強烈建議你使用一個MongoDB副本集配置進行設置,以便你的數據在地理上合理分佈,從而獲得高可用性。我還建議你啟用SSL連接來加密客戶機-數據庫通信。我們經常對各種MongoDB驅動程序的故障轉移特性進行測試,以使它們適用於生產用例,或者在我們的客戶向我們諮詢時。在本文中,我們將向你展示如何使用PyMongo連接到一個配置了自簽名證書且啟用了SSL的MongoDB副本集,以及如何測試代碼中的MongoDB故障轉移行為。

使用自簽名證書連接到MongoDB SSL

第一步是確保安裝了正確版本的PyMongo及其依賴項。這個指南會幫助你整理依賴性,驅動程序兼容性列表也可以在這裡找到。

為了使用自簽名證書連接到一個啟用了SSL的MongoDB端點,mongo_client.MongoClient中的ssl和ss_ca_cert參數是我們所關心的。 我們必須將ssl設置為True,並且ss_ca_cert必須指向CA證書文件。

如果你是一個ScaleGrid客戶,可以從ScaleGrid控制檯下載你的MongoDB集群的CA證書文件,如下所示:

在你的Python應用程序中測試MongoDB故障轉移

因此,一個連接片段應該是這樣的:

在你的Python應用程序中測試MongoDB故障轉移

如果你使用自己的自簽名證書,主機名驗證可能會失敗,那麼你還必須將ssl_match_hostname參數設置為False。正如驅動程序文檔所述,不建議你這樣做,因為這會使連接容易受到中間人攻擊。

測試故障轉移行為

在MongoDB部署中,故障轉移不像在傳統數據庫管理系統中那樣被認為是主要事件。儘管大多數MongoDB驅動程序都試圖抽象這個事件,但是開發人員應該理解併為這種行為設計他們的應用程序,因為應用程序應該能預料到短暫的網絡錯誤,並在滲透錯誤之前進行重試。

你可以通過在工作負載運行時誘導故障轉移來測試應用程序的彈性。誘導故障轉移最簡單的方法是運行rs.stepDown()命令:

在你的Python應用程序中測試MongoDB故障轉移

我喜歡的一個測試驅動程序的方式是通過編寫一個簡單的“永久”寫入器應用。這將是一些簡單的代碼,它會持續寫入數據庫,除非被用戶打斷,並且它會打印所有遇到的異常,來幫助我們理解驅動程序和數據庫的行為。我還對它寫入的數據進行跟蹤,以確保測試過程中沒有未報告的數據丟失。下面是測試代碼的相關部分,我們將使用它來測試我們的MongoDB的故障轉移行為:

在你的Python應用程序中測試MongoDB故障轉移

上述代碼寫入的條目看起來像這樣:

在你的Python應用程序中測試MongoDB故障轉移

處理ConnectionFailure異常

注意,我們捕獲ConnectionFailure異常來處理由於故障轉移我們可能遇到的所有與網絡相關的問題——我們打印異常並繼續嘗試寫入數據庫。驅動程序文檔建議你:

如果某個操作由於一個網絡錯誤而失敗,則會引發ConnectionFailure異常,並且客戶端會在後臺進行重新連接。應用程序代碼應該處理這個異常(認識到操作失敗),然後繼續執行。

我們來運行它,並在它執行期間執行一個數據庫故障轉移。下面是這期間發生的事情:

在你的Python應用程序中測試MongoDB故障轉移

注意,驅動程序需要大約12秒的時間來理解新拓撲,連接到新的Primary並繼續寫入。這裡捕獲的異常是errors.AutoReconnect,它是ConnectionFailure的子類。

你可以再運行幾次,看看還有哪些異常出現。例如,下面是我遇到的另一個異常跟蹤:

在你的Python應用程序中測試MongoDB故障轉移

這個異常也是ConnectionFailure的子類。

‘retryWrites’參數

測試MongoDB故障轉移行為的另一個領域是觀察其他參數變化如何影響結果。一個與之相關的參數是'retryWrites':

retryWrites:(布爾型)在MongoDB3.6+上發生網絡錯誤後,是否重試寫入在這個MongoClient中執行的操作。默認值為False。

讓我們看看這個參數在故障轉移時是如何工作的。對代碼進行的唯一更改是:

在你的Python應用程序中測試MongoDB故障轉移

讓我們現在運行它,然後執行一個數據庫系統故障轉移:

在你的Python應用程序中測試MongoDB故障轉移

請注意,雖然故障轉移後的插入大約需要12秒,但由於retryWrites參數會確保重試失敗的寫操作,所以插入成功。請記住,設置此參數並不免除您處理ConnectionFailure異常的責任—您需要擔心讀取和其他操作,因為它們的行為不受此參數影響。它不能完全解決問題,即使是對支持的操作來說——有時故障轉移可能需要很長的時間來完成,僅僅進行retryWrites是不夠的。

配置網絡超時值

rs.stepdown()會引發一個相當快的故障轉移,因為副本集的Primary會被強制變成一個Secondary,而Secondary會進行一次選舉來確定新的Primary。在生產部署中,網絡負載、分區和其他此類問題會延遲Primary服務器的不可用性檢測操作,從而延長你的故障轉移時間。你在網絡故障或故障轉移時也會經常遇到像errors.ServerSelectionTimeoutError、errors.NetworkTimeout等這類的錯誤。

如果這種情況經常發生,那你就必須調整超時參數。相關的MongoClient超時參數是serverSelectionTimeoutMS、connectTimeoutMS和socketTimeoutMS。其中,為serverSelectionTimeoutMS選擇一個較大的值通常有助於在故障轉移期間處理錯誤:

serverSelectionTimeoutMS:(整數)控制驅動程序需要等待多長時間(以毫秒為單位)以便找到一個可用且合適的服務器來執行數據庫操作;在等待期間,控制驅動程序可以執行多個服務器監視操作,每個操作由connectTimeoutMS控制。默認值為30000(30秒)。

準備好在你的Python應用程序中使用MongoDB了嗎? 請查看我們關於Python和MongoDB入門的文章,瞭解如何僅通過5個簡單的步驟來啟動和運行它們。ScaleGrid是惟一的MongoDB DBaaS提供者,它為你提供了對實例的完全SSH訪問,因此您可以在與你的MongoDB服務器相同的機器上運行Python服務器。你可以在AWS、Azure或DigitalOcean上自動化進行MongoDB雲部署,它們提供專用服務器、高可用性和災難恢復等功能,這樣你就可以專注於開發你的Python應用程序了。

英文原文:https://scalegrid.io/blog/pymongo-tutorial-testing-mongodb-failover-in-your-python-app/

譯者:測試

相關推薦

推薦中...