資料庫發展到今天,其高可用性已經變成了人們關心的頭等話題。一個項目(比如一個複雜的、需要頻繁讀寫各種數據的量化交易系統)的數據往往分布在不同的資料庫實例、甚至是不同的數據中心中。多資料庫節點形成的集群可以擴展更多節點,單個節點的失敗往往會導致集群需要重新配置拓撲規則。這就引出了一個問題——應用程序如何知道要訪問哪個資料庫節點?應用程序如何檢測資料庫拓撲已更改?我們如何保護應用程序免受底層資料庫架構複雜性的影響?

不知道從什麼時候開始,「中間人技術」的概念變得很流行,而資料庫環境開始集成代理。這篇文章將會討論什麼是資料庫代理,它們的用途以及如何使用現代代理構建高度可用且高度可控的資料庫環境。

一、什麼是資料庫代理?

代理是處理雙方連接通信的軟體。在資料庫的語境中,代理是位於應用程序和資料庫的中間層。應用程序連接到代理,代理將連接轉發到資料庫。讓我們嘗試分析這個模式,看看使用代理可能會有什麼好處?

對於初學者來說,一個比較大的好處是應用程序僅需要連接代理。在資料庫領域,要確定應該將連接引入何處並不容易。很多資料庫架構存在可寫主庫或是存在集群核心角色的主庫,也有隻讀副本。這種需要複製的拓撲結構不斷發展。Hardcode(「代碼寫死」) 連接模式不是一個好主意。另一方面,編寫代碼來跟蹤拓撲變化需要仔細規劃、設計和測試。這是代理的來源,通過使用代理,應用程序可以連接到它(或代理池),我們希望應用程序能將訪問流量從出現故障的資料庫路由到還正常運行的資料庫。

由於流量由代理中繼,後者(代理)也可以是流量本身的重要信息源。它可以提供有關流量的統計信息,例如每秒執行的查詢數,執行時間等,還有關於執行時間的統計數據,如95%執行時間,執行時間的最大值、最小值、平均值,所有這些統計數據都基於收集的指標給出來。

高級的代理也可以改變流量本身,當所有內容都通過它們時,這些代理可以為管理員提供對查詢的高度控制,查詢可以被緩存、重寫、重新路由、掛起或終止。這使得DBA可以立即調整流量並對問題作出反應,有時甚至不需要應用程序開發人員修改應用程序並重新部署它。

最後總結一下,資料庫代理不僅可以通過向多個資料庫路由流量來幫助維持資料庫的架構環境,還可以使用代理中創建的流量路由邏輯幫助構建分片設置。如上文所說,高級資料庫代理不僅僅是一個數據包路由設備,而且可以通過多種方式的使用,從而改進運營團隊管理資料庫層的選項。還可以使用代理中創建的流量路由邏輯幫助構建分片設置。

二、資料庫代理類型

在我們深入研究如何使用資料庫代理的細節之前,本章我們將討論代理的兩種主要類型,將介紹每種類型的示例,和它們之間的主要區別。

第4層代理模型

最初也是最古老的代理模型是工作在ISO / OSI網路模型(傳輸層)的第4層操作的代理。

這些代理在包級別上工作。它們接收TCP會話,並將流量路由到已經預定義好的後端資料庫服務。

這種模型的代理伺服器並不關心它路由的內容,它只需要將流量發送到後端並且保持負載均衡就可以了。通常情況下我們可以選擇輪詢,從一個前端服務到後端伺服器建立最少的連接。這種代理的最著名的例子是HAProxy,還有一個更出名的Nginx。

這種代理的主要問題是它們僅在網路層運行。這些代理不感知MySQL協議,也不了解MySQL或MariaDB後端所處的狀態。對於複製關係的設置來說,它只可能是主或者副本。但對於Galera集群來說,複製關係將變得更加複雜(Primary, non-Primary, donor or desynced, joining, joiner等)。必須開發外部腳本,才能使這些代理能夠理解MySQL後端的狀態。

這種腳本的一個例子是Percona的clustercheck及其所有改進版本。缺乏對MySQL協議的理解會導致與代理的連接更加複雜。正如我們前面提到的,理想情況下應用程序將連接到代理並在其中發送所有流量,代理將直接寫入單個主機並對所有MySQL後端進行擴展讀取。

不幸的是,如果代理無法理解MySQL協議,它就無法將SELECT與其他查詢區分開來,這是一個嚴重的問題。在複製環境中,通常只有一個主機將您的寫入發送給主伺服器。Galera可以在多寫入主機的設置中工作,但有時會有一些情況要求應用程序將所有寫入指向一個節點,以減少寫入之間的衝突。因此,這種設置對應用程序的透明度較低,因為應用程序必須對SELECT和其他查詢進行排序並將它們發送到代理上的正確埠(假設已定義了單獨的寫入和只讀埠)。

SQL-AWARE代理

另一種類型的代理是SQL感知代理。該軟體可以理解MySQL協議,並且通常提供與該協議相關的一系列功能。首先,這樣的代理應該能夠理解MySQL狀態。它們設計為區分主設備和從設備。其中一些人還可以跟蹤和了解Galera集群的狀態。所有這些設計都導致這種代理可以更快,更可靠地響應MySQL拓撲結構。

此外這種代理最受人歡迎的特性可能是,鑒於他們對MySQL協議的理解,代理可以執行讀寫分離。這使得實現透明代理層成為可能,並確保應用程序不必跟蹤與資料庫層相關的任何內容。它只會連接到預設好的主機和埠,這就是它需要知道的全部內容。

當然,基於代理可以處理所有通往資料庫流量,代理也可以被用於其他事情,例如流量整形(流量整形的典型作用是限制流出某一網路的某一連接的流量與突發,使這類報文以比較均勻的速度向外發送)、查詢路由、查詢阻塞等。需要注意的是,不同代理之間的特性相差很大。有些像MySQL路由器一樣可以進行查詢路由,但其他代理不具備這個特性。其他如ProxySQL或MaxScale可用於執行高級任務,並且可以幫助用戶改變流量發送到資料庫的方式。

通常,SQL感知代理不使用外部腳本來監視或跟蹤資料庫的狀態,它們依賴於內置的測試代碼來實現這個功能,ProxySQL和Galera集群監控就是一個例外。ProxySQL 2.0版本依賴於外部腳本,該腳本用來在跟蹤Galera節點的狀態。內部支持是在ProxySQL v2.0中引入的,直到本文在編寫時,它還在處在beta測試版本的狀態。

— — — — — — E N D — — — — — —

往期文章:

Numpy處理tick級別數據技巧

真正賺錢的期權策略曲線是這樣的

多品種歷史波動率計算

如何實現全市場自動盯盤

AI是怎樣看懂研報的

真格量化策略debug秘籍

真格量化對接實盤交易

常見高頻交易策略簡介

如何用撤單函數改進套利成交

Deque提高處理隊列效率

策略編程選Python還是C++

如何用Python繼承機制節約代碼量

十大機器學習演算法

如何調用策略附件數據

如何使用智能單

如何掃描全市場跨月價差

如何篩選策略最適合的品種

活用訂單類型規避頻繁撤單風險

真格量化回測撮合機制簡介

如何調用外部數據

如何處理回測與實盤差別

如何利用趨勢必然終結獲利

常見量化策略介紹

期權交易「七宗罪」

波動率交易介紹

推高波動率的因素

波動率的預測之道

趨勢交易面臨挑戰

如何構建知識圖譜

機器學習就是現代統計學

AI技術在金融行業的應用

如何避免模型過擬合

低延遲交易介紹

架構設計中的編程範式

交易所視角下的套利指令撮合

距離概念與特徵識別

氣象風險與天氣衍生品

設計量化策略的七個「大坑」

雲計算在金融行業的應用

機器學習模型評估方法

真格量化製作期權HV-IV價差

另類數據介紹

TensorFlow中的Tensor是什麼?

機器學習的經驗之談

用yfinance調用雅虎財經數據

容器技術如何改進交易系統

Python如何調用C++

真格量化可訪問:

quant.pobo.net.cn

真格量化微信公眾號,長按關註:

遇到了技術問題?歡迎加入真格量化Python技術交流QQ群 726895887


推薦閱讀:
相关文章