2年前,趨勢科技開始將資安服務所用的資料庫平臺,從MySQL延伸到NoSQL類型的資料庫,在正式環境中實際部署了包括MongoDB與Cassandra等分散式資料庫平臺。為了打造能管理10萬臺行動裝置的雲端服務MDM,趨勢科技使用MongoDB來儲存這些裝置所產生的各項管理記錄。
當初,趨勢科技會考慮使用MongoDB,主要是因為MDM雲端服務更新資料的速度非常頻繁,應用特性與關聯式資料庫的使用型態完全不同,趨勢科技研究開發部技術經理于慶源解釋,關聯式資料庫的設計,原本就是以讀取資料的應用型態為主,而MDM雲端服務的特性,除了必須考量資料讀取之外,更重要的是有大量資料寫入需求。MDM雲端服務是提供給企業管理行動裝置的服務,因此,當多間企業同時啟用時,從帳號註冊到後續追蹤行動裝置所產生的資料訊息,可能會有上萬筆資料同時寫入資料庫的需求。為了因應這種寫入需求,趨勢科技決定採用MongoDB。
于慶源表示,趨勢科技過去也是用MySQL資料庫來做產品服務,直到兩年前開始關注NoSQL,當時,MongoDB是相對成熟的分散式資料庫,而MongoDB正是因應大量資料寫入需求而產生,完全符合趨勢科技MDM雲端服務的營運要求。
未來,趨勢科技對外提供雲端服務的資料庫架構,將會以MongoDB為核心,目前除了MDM雲端服務之外,另一個中小企業資安服務平臺Worry Free Business Security雲端服務,也同樣部署在MongoDB平臺上。
MongoDB是文件導向型資料庫,不需要明確定義資料欄位,資料表(Collection)中可儲存長度不定、欄位數量不限的資料,而且每個欄位還可以再切分成多個子欄位,例如:HTML網頁裡有Head與Body結構,Body元素中可能會有多個段落,段落中會有文字、圖片、連結等,MongoDB的資料結構是比較鬆散的樹狀結構。
相較於關聯式資料庫,MongoDB有幾個特色,除了能因應資料大量讀寫的需求,最重要的是,MongoDB還具有Auto-sharding(資料自動切割)的功能,可以自動切割資料來橫向資料庫的容量,而且具有自動容錯移轉(Auto Failover)機制。使用者只要事先設定標準,當資料量達到預設標準值,MongoDB的Auto-sharding功能就會自動進行資料切割,並且將資料平均分配到不同主機(Shard)。
關聯式資料庫的資料庫越來越大後,存取效能會降低,一般作法上,會透過資料表切割的方式,將原有的資料分散到不同的資料表或資料庫上,來提高存取效能。但是一份資料切割成多份後,不但資料彙整的複雜性增加,應用程式也需要能夠辨認出不同資料的所在位置,往往需要修改現有應用程式或另外客製開發處理,這就是手動式的資料分割作法,相當麻煩也費時,才能讓資料庫做到垂直擴充(scale up)或是橫向擴充(scale out)。而MongoDB就是在資料庫中內建了資料分割機制,企業就不用再自行處理資料切割的工作。
MongoDB應用特性
特性1 原生的高可用性叢集架構
MongoDB的運作機制,採取Master/Slave架構,必須部署在叢集環境中,而不是單臺機器上,通常是由3臺伺服器組成一個叢集,並且互相備援、容錯,來達到MongoDB的高可用性。
MongoDB叢集中包括了3種角色,分別是Shard、Config Server、Routing Process Server(稱為mongos)。一個叢集中會有多個儲存資料的Shard,每一個Shard內,1份資料會複製成3份,每一份資料是儲存在1個Mongod中,同一個Shard的3個Mongod共同組成1套可相互複製儲存資料的Replica Set。
Config Server則是用來儲存所有Shard節點的配置資訊,包括用來索引切割範圍和資料分布用的Shard Key鍵值(類似於Index索引鍵)。Routing Process負責與使用者互動,接收來自使用者端的查詢與資料更新,當使用者端程式提出資料庫的存取請求後,這些請求指令經由Routing Process來詢問Config Server,得知要到哪一個Shard查詢或儲存資料後,資料庫就直接對這個Shard執行存取指令,並將結果回傳給使用者端。
MongoDB原生就具備了這樣的叢集架構,不但能切割資料來具備擴充性,也因為資料原生多重副本而能提供高可用性和容錯的效果。
特性2 可以自動切割資料實現快速擴充
以往,資料庫大多是垂直擴充架構,也許一開始效能都很穩定,但是,資料量大到一定程度後,效能就變得非常差,系統回應時間也會開始變慢,最後只好升級記憶體和處理器,甚至得整臺設備換新,才能提高效能,擴充不易。
于慶源表示,MongoDB的設計是Scale Out架構,所以是多臺伺服器同時運作,因為資料量平均分散在不同伺服器上執行,所以每一臺伺服器的運作都能維持一定效能,不會因為資料量而拖慢效能,當效能出現瓶頸時,也可以使用Auto-sharding功能,快速增加一臺伺服器,把資料平均分散在每一臺伺服器上,讓效能維持在最佳狀態。
一般來說,Auto-sharding的做法,會依據不同的服務需求,預先設定一個標準值,當資料量達到這個預設標準值,MongoDB就會啟動Auto-sharding機制。如果這個預設值太小,Auto-sharding的頻率就會比較高。由於Auto-sharding的資料移動過程,會影響到資料庫效能,所以,次數應該盡量減少。趨勢科技的做法,則是根據系統效能來判斷是否需要做Auto-sharding。此外,MongoDB的官方網站與社群討論版都釋出Auto-sharding預設值的設定建議。
Auto-sharding主要涉及兩個層面,其中一個是Shard之間的資料切割方式,包括One range per shard與Multi range per shard兩種,兩者的差異在於是否直接設定資料切割範圍;另一個是資料如何平均分配(Balancing),也就是資料切割、移動、合併的過程,主要目的除了保持Shard之間的資料量平衡之外,更重要的是,藉此降低Balancing的次數,進而減少Chunk在Shards之間的傳輸,最後不僅可以達到橫向擴充的目的,同時也能讓系統的負載平衡(Load Balance)維持在最佳狀態。
Shard Key鍵值是MongoDB能夠切割資料的關鍵。MongoDB最小的資料單位,稱為Document,可對映於關聯式資料庫中的行(Row)。多個Document共同組成一個Collection,也就是關係式資料庫中的資料表(Table),每個Document可包含多個資料屬性(fields),例如:姓名、地址、電話等。
MongoDB可以指定一個欄位(Document)的值當作Key,這個Key就叫做Shard Key,可以是一個欄位或多個欄位,也是資料切割的依據。每當新增資料時,MongoDB會去分析Shard Key,然後再決定這筆資料應該儲存在哪一個Shard。
特性3 可用Shard Key執行目標查詢提高檢索效率
Shard Key可以用於資料切割,也可以用來提高MongoDB查詢資料的效率。因為資料分散在不同的Shard上,當使用者要查詢資料時,一種作法是對每一個Shard都執行查詢指令,最後再彙整出查詢結果。另一種作法是查詢指令也包含Shard Key鍵值,就可進行目標查詢(Targeted Query),直接到Shard Key所對應的Shard中查詢,而不需要對每一個Shard執行這個查詢指令,可以提高查詢效率。
于慶源表示,只要有使用Auto-sharding功能,通常都會採用目標查詢模式,一方面是因為目標查詢是比較有效率的做法,另一方面則是基於Auto-sharding必須根據Shard Key來切割資料,所以,資料儲存結構的設計,就必須建立Shard Key,使用Shard Key不需要額外增加更多工作。
特性4 資料欄位不用事先定義,資料儲存更有彈性
關聯式資料庫因為需要事先定義資料欄位(Schema),往往需要很多時間才能更改資料欄位,MongoDB的資料儲存結構設計,因為不需要事先定義(Schema-free),所以,不論新增或調整部分服務功能,都不需要去調整原本的資料欄位就能完成。
對於一個還在發展中的服務而言,通常會有比較多的服務調整需求,于慶源認為,MongoDB不需要事先定義的資料儲存彈性,不僅讓調整的過程變得比較簡單,而且還能加速推出新的服務。這一點,對於趨勢科技來說,也是採用MongoDB的重要考量,因為新開發的產品,通常會有比較頻繁的資料欄位修改,如果每一次都要重新定義資料欄位,當資料量大的時候,要付出的代價也會相對增加。
舉例來說,如果新的服務功能,需要每一位用戶的電子郵件資料,而這個欄位是過去所沒有的,MongoDB的資料儲存結構,因為不需要明確的資料欄位定義,所以,可以在不更動原有資料欄位架構的情況下,新增電子郵件資料欄位。以往關聯式資料庫的做法,則必須重新修改所有的資料表,才能新增電子郵件資料欄位。這種新增資料的彈性,讓趨勢科技的MDM服務可以在營運狀態完成資料欄位調整。
MongoDB秘技大公開
秘技1 讓MongoDB與MySQL同時並存,解決資料關聯問題
由於MongoDB的資料儲存結構設計,沒有關聯式資料庫的概念,例如,關聯式資料庫最擅長的資料合併(Join)以及交易(Transaction)等,MongoDB通通沒有。所以,在MongoDB的架構下,趨勢科技沒有辦法執行跨資料表(Collection)的合併查詢。然而,趨勢科技所推出的行動裝置管理服務MDM,是根據所管理的行動裝置數量來提供不同的收費級距,這樣的前提下,行動裝置數量增減的資料統計就變得非常重要。
因應這類極為重要的資料,趨勢科技另外開發程式去做程式邏輯確認,此外,也搭配使用MongoDB所提供的API,以類似Transaction的概念,確保資料寫入時,不會同時有其他資料寫入。
于慶源表示, MongoDB與MySQL不是全有全無,而是可以互補,依據資料庫本身的特性與資料屬性重新配置。例如:更新頻繁的資料如Log等就使用MongoDB,其他需要跨資料表合併的資料則儲存在MySQL。所以,趨勢科技最近開始將小部分具有關聯性的資料轉移到MySQL。
趨勢科技最近開始嘗試把一小部分具有關聯的資料轉移到MySQL。長期來說,趨勢科技的策略是採取多種資料庫並存模式,讓資料能夠依據應用屬性,透過不同資料庫平臺的特性來發揮。
秘技2 用雙層架構讓MySQL也能自動資料切割
趨勢科技決定部分資料轉移到MySQL的同時,也決定把MongoDB的Auto-sharding機制延伸到MySQL。
由於MySQL並沒有Sharding的運作機制,趨勢科技的目標是要把MongoDB的Auto-sharding機制,延伸到MySQL平臺使用,這個期望變成了新的挑戰。
趨勢科技為了在MySQL環境,建構Auto-sharding機制,另外用其他開放原始碼工具來強化資料複寫功能,並且把MySQL切成雙層架構。對程式開發人員來說,面對的資料庫環境就是MySQL,而且只需要在上層建立資料表時,也同時建立Shard Key,後續的資料處理全部由底層接手,底層是真正執行Auto-sharding的關鍵,包括資料如何儲存、資料平均分配、資料複寫機制以及高可用性等。
把MySQL切成雙層架構的做法,讓MySQL更能符合趨勢科技的需求,當資料量不斷增加,資料庫效能變慢時,能夠經由Auto-sharding機制來做到橫向擴充,在此同時,經由資料複寫機制來達到高可用性。
相關報導請參考「開源資料庫的新價值」