OpenStack的Trove元件詳解

萌萌哥的春天發表於2020-05-28

一:簡介

    一、背景

       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的叢集支援。

 

三:常用操作

    一、例項、資料庫、資料庫使用者管理

        

 

    二、備份和叢集管理

          

 

相關文章