OpenStack的Trove組件詳解

一:簡介

    一、背景

       1. 對於公有雲計算平台來說,只有計算、網路與存儲這三大服務往往是不太夠的,在目前互聯網應用百花齊放的背景下,幾乎所有應用都使用到資料庫,而資料庫承載的往往是應用最核心的數據。此外,在大數據分析越來越盛行的背景下,對資料庫的可靠便捷管理也變得更為重要。因此,DBase as a Service(DBaaS,資料庫服務)也就順理成章地成為了雲計算平台為用戶創造價值的一個重要服務。

       2. 對比Amazon AWS中各種關於數據的服務,其中最著名的是RDS(SQL-base)和DynamoDB(NoSQL),除了實現了基本的數據管理能力,還具備良好的伸縮能力、容災能力和不同規格的性能表現。因此,對於最炙手可熱的開源雲計算平台Openstack來說,也從Icehouse版加入了DBaaS服務,代號Trove。直到去年底發布的Openstack Liberty版本,Trove已經經過了4個版本的迭代發布,目前已經成為Openstack官方可選的核心服務之一。本文將深入介紹Trove的原理、架構與功能,並通過實踐來展示Trove的應用。

    二、設計目標

       1. Trove is Database as a Service for OpenStack. It』s designed to run entirely on OpenStack, with the goal of allowing users to quickly and easily utilize the features of a relational or non-relational database without the burden of handling complex administrative tasks. 」這是Trove在官方首頁上對這個項目的說明,有兩個關鍵點。一個是從產品設計上說,它定位不僅僅是關係型資料庫,而且還涵蓋非關係資料庫的服務。另一個是從產品實現上說,它是完全基於Openstack的。

       2. 從第一點可以看出Trove解決問題的高度已經超越了同類產品。因為我們從其他雲計算平台對比去看,關係型和非關係型資料庫都是由不同的服務去提供(比如AWS的RDS和DynamoDB),而且實現上也往往互相獨立的系統,不僅UI不同,API也不一樣。而Trove的目標是抽象儘可能多的東西,對外提供統一的UI和API,盡量減少冗餘實現,提昇平台內聚。只要具備了實例、資料庫、用戶、配置、備份、集群、主從複製這些概念,不管是關係型還是非關係型資料庫,都能統一管理起來。從最新的Liberty版本發布的情況下,目前開源的主流關係型和非關係型資料庫也得到了支援,比如Mysql(包括Percona和MariaDB分支)、Postgresql、Redis、MongoDB、CouchDB、Cassandra等等。不過根據官方的介紹,目前只有Mysql是得到了充分的生產性測試,其他的還處於實驗性階段。

       3. 而第二點完全基於Openstack的,可以說是一個較大的創新。試想,假設你是一個雲計算服務商,如果現在要提供資料庫服務,只需要在原有平台軟體上升級與配置一下就行,其他什麼都不需要,不需要採購資料庫伺服器硬體,不需要規劃網路,不需要規劃IDC,這是一種什麼樣的感覺?Trove完全構建於Openstack原有的幾大基礎服務之上。打個比喻類似於Google著名的Bigtable服務是構建於GFS、Borg、Chubby等幾個基礎服務之上。所以,Trove實際上擁有了雲平台的一些基礎特性,比如容災隔離、動態調度、快速響應等能力,而且從研發的角度看,也大大減少了重複造輪子的現象。

 

    三、基本概念

       1. 資料庫實例(Instance):包含資料庫程式的openstack虛擬機,如果用戶創建了一個資料庫實例,那麼他其實就創建了一台openstack虛擬機,並在該虛擬機上啟動了資料庫服務。

       2. Datastore:用來表示和存儲資料庫的類型、版本、虛擬機鏡像等資訊。當用戶創建一個資料庫實例時需要指定Datastore.

       3. 配置組(Configuration Group):資料庫參數組成的集合。用戶可以將配置組應用到一個或多個資料庫實例上,因而避免了大量的重複操作。

 

    四、特點

       1. “按需”獲得資料庫伺服器,配置所獲得的資料庫伺服器或者資料庫伺服器集群

       2. 自動化操作,自動的增、刪、改、備。

       3. 更好的資源利用,你可以根據業務量,自由的對資料庫實例進行伸縮。

 

二:架構

    一、核心架構

            

 

    二、組件詳解
       

       1. trove-api:用於操作請求的接收和分發操作提供 REST 風格的 API,同時與 trove-conductor 和 trove-taskmanager 通訊,一些輕量級的請求,比如獲取實例狀態,實例數量等操作都是自身直接處理或訪問 trove。trove-conductor 和 trove-taskmanager處理比較重量級的操作。比如創建資料庫,創建備份等操作都是通過rpc傳遞給 trove-taskmanager,然後通過調用 nova、swift、neutron、cinder等組件來完成操作。

       2. trove-conductor:將 vm 內 trove-guestagent 發送的狀態資訊保存到資料庫,與 trove-guestagent 的通訊是通過rpc來實現的,trove-conductor 這個組件的目的是為了避免創建的資料庫的實例直接訪問資料庫,它是做為一個 trove-guestagent 將昨天寫入資料庫的中間件。

       3. trove-taskmanager:執行 trove 中大部分複雜的操作,請求者發送消息到 trove-taskmanager,trove-taskmanager 在請求者的上下文中調用相應的程式執行這些請求。taskmanager 處理一些操作,包括實例的創建、刪除,與其他服務如Nova、Cinder、Swift等的交互,一些更複雜的Trove操作如複製和集群,以及對實例的整個生命周期的管理。trov-taskmanager就像是其他openstak服務的客戶端,如nova,swift,cinder等,當要創建資料庫實例時就將請求發送給nova,讓nova去創建個實例,要備份的話就調用swift介面上傳備份。

       4. trove-guestagent:集成在vm鏡像裡面,通過監聽rpc裡面task manager發過來的指令,並在本地執行程式碼完成資料庫任務,taskmanager將消息發送到guest agent,guest agent通過調用相應的程式執行這些請求。

 

   三、功能

     

       1. 動態resize能力:分為instance-resize和volume-resize,前者主要是實例運行的記憶體大小和cpu核數,後者主要是指資料庫分區對應的硬碟卷的大小。由於實例是跑在vm上的,而vm的cpu和memory的規格可以通過Nova來進行動態調整,所以調整是非常方便快捷的。另外硬碟卷也是由Cinder提供的動態擴展功能來實現resize。resize過程中服務會有短暫的中斷,是由於mysqld重啟導致的。

       2. 全量與增量備份:目前mysql的實現中,備份是由實例vm上的guestagent運行xtrabackup工具進行備份,且備份後的文件會存儲在Swift對象存儲中。從備份創建實例的過程則相反。由於xtrabackup強大的備份功能,所以Trove要做的只是做一些粘膠水的工作。

       3. 動態配置更新:目前支援實例的自定義配置,可以創建配置組應該到一組實例上,且動態attach到運行中的實例中生效。

       4. 一主多從的一鍵創建:在創建資料庫實例的API中,支援批量創建多個從實例,並以指定的實例做主進行同步複製。這樣就方便了從一個已有實例創建多個從實例的操作。而且mysql5.6版本之後的同步複製支援GTID二進位日誌,使得主從實例之間關係的建立更加可靠和靈活,在failover處理上也更加快速。

       5. 集群創建與管理(percona/mariadb支援):Cluster 功能目前在 mysql原生版本暫時不支援,但是其兩個分支版本 percona和 mariadb基於 Galera庫實現的集群複製技術是支援的。另外Liberty版本的Trove也提供了對mongodb的集群支援。

 

三:常用操作

    一、實例、資料庫、資料庫用戶管理

        

 

    二、備份和集群管理