Trove系列(一)—入門篇


概述
DBaaS是目前雲計算服務的重要部分,數據庫作為一種特殊的應用程序,在應用中普遍存在。而其獨特性不僅在於普遍性,而且其性能對應用的表現是至關重要的。數據庫的通用性和重要性使得維護一個健壯的數據庫實例變得極為復雜和繁瑣,DBaaS服務旨在解決讓用戶能夠在雲中輕松設置、操作和擴展關系數據庫。 在承擔耗時的數據庫管理任務的同時,又可提供經濟高效的可調容量,使您能夠騰出時間專注於應用程序和業務。
Trove是OpenStack實現Database as a Service(DBaaS)的項目,(他的前身是Rackspace的reddwarf)為要能夠給用戶提供可擴展和高可靠性的雲數據庫,並作為一個基本服務可以同時支持關系和非關系型數據庫。Trove目前還只是一個 OpenStack 孵化器項目,現在致力於提供高性能前提下的資源隔離,並且提供自動化的復雜管理任務包括部署、配置、打補丁、備份、恢復和監控。
Trove作為OpenStack中提供關系型數據庫、非關系型數據庫等Database服務的項目,目前由Trove-api、Trove-taskmanager、Trove-conductor、Trove-guestagent四個組件組成。Trove的數據庫引擎運行於雲主機,與Nova、Cinder、Swift、Glance、Keystone、Neutron(Nova-network)等組件緊密相連。OpenStack的第十個版本—Juno版已經問世,在該版本中,增加了一些數據庫服務的新功能。數據庫服務(Trove)允許用戶對關系型數據庫進行管理,實現了Mysql實例的異步復制(主-從復制)和提供PostgreSQL數據庫的實例。非關系數據庫的管理也得到了增強,引入新的集群API,首次支持MongoDB集群;支持Couchbase的備份和恢復。支持可選擇強制使用Cinder作為Trove卷的后端;支持使用Neutron網絡的OpenStack解決方案部署Trove;支持在Trove數據庫中使用自定義的數據存儲配置參數;能夠獲取所有數據的存儲類型和版本;其他的改進包括在Trove中增加日志審計來優化日志級別、加入stevedore來優化擴展加載的機制等。
基本概念1UserUser即用戶,他們代表可以通過keystone進行訪問的人或程序。Users通過認證信息(credentials,如密碼、API Keys等)進行驗證。
2TenantTenant即租戶,又稱為project(H\I版本都使用Project來代替),它是各個服務中的一些可以訪問的資源集合。例如,在Nova中一個tenant可以是一些機器,在Swift和Glance中一個tenant可以是一些鏡像存儲,在neutron中一個tenant可以是一些網絡資源。Users默認的總是綁定到某些tenant上,用戶訪問租戶的資源前,必須與該租戶關聯,並且指定該用戶在該租戶下的角色。
3RoleRole即角色,Roles代表一組用戶可以訪問的資源權限,例如Nova中的虛擬機、Glance中的鏡像。Users可以被添加到任意一個全局的或租戶內的角色中。在全局的role中,用戶的role權限作用於所有的租戶,即可以對所有的租戶執行role規定的權限;在租戶內的role中,用戶僅能在當前租戶內執行role規定的權限。
4ServiceService即服務,如Nova、Glance、Swift。根據前三個概念(User,Tenant和Role),一個服務可以確認當前用戶是否具有訪問其資源的權限。但是當一個user嘗試着訪問其租戶內的service時,他必須知道這個service是否存在以及如何訪問這個service,這里通常使用一些不同的名稱表示不同的服務。在上文中談到的Role,實際上也是可以綁定到某個service的。例如,當swift需要一個管理員權限的訪問進行對象創建時,對於相同的role我們並不一定也需要對nova進行管理員權限的訪問。為了實現這個目標,我們應該創建兩個獨立的管理員role,一個綁定到swift,另一個綁定到nova,從而實現對swift進行管理員權限訪問不會影響到Nova或其他服務。
5EndpointEndpoint,翻譯為“端點”,我們可以理解它是一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道他的endpoint。因此,在keystone中包含一個endpoint模板(endpoint template,在安裝keystone的時候我們可以在conf文件夾下看到這個文件),這個模板提供了所有存在的服務endpoints信息。一個endpoint template包含一個URLs列表,列表中的每個URL都對應一個服務實例的訪問地址,並且具有public、private和admin這三種權限。public url可以被全局訪問(如http://compute.example.com),private url只能被局域網訪問(如http://compute.example.local),admin url被從常規的訪問中分離。
6TokenToken即是信物、令牌,用戶通過用戶名和密碼獲取在某個租戶下的token,通過token,可以實現單點登錄。7Credentials與user關聯的認證憑據。一個user可能有一個或多個credential,一個credential與某一個project關聯。該術語可以簡單的理解為用戶和密碼。
8Domains表示一組tenants和users的集合。每一個tenant或user只能屬於一個domain,但user可以屬於多個tenants。domain有命名空間的概念,即在一個命名空間內的名稱是否是全局唯一。
9Datastore存儲數據的數據庫管理程序。例如trove現在支持的數據庫管理程序有MySQL、cassandra、mongodb。
10datastore_version存儲數據的數據庫管理程序的版本, datastore_version是指這些數據庫管理程序的版本,例如5.1,還是5.5之類的。11Replica Setmongodb高可用性架構—Replica Set副本集。Replica Set使用的是n個mongod節點,構建具備自動的容錯功能(auto-failover),自動恢復的(auto-recovery)的高可用方案。mongodb使用Replica Set來實現讀寫分離。
12swiftswift是object storage(對象存儲),將object(可以理解為文件)存儲到bucket(可以理解為文件夾)里,你可以用swift創建container,然后上傳文件,例如視頻,照片,這些文件會被replication到不同服務器上以保證可靠性,swift可以不依靠虛擬機工作。所謂的雲存儲,OpenStack就是用swift實現的,類似於Amazon AWS S3(Simple Storage Service)。
13cindercinder是block storage(塊存儲),你可以把cinder當做優盤管理程序來理解。你可以用cinder創建volume,然后將它接到(attach)虛擬機上去,這個volume就像虛擬機的一個存儲分區一樣工作。如果你把這個虛擬機terminate了,這個volume和里邊的數據依然還在,你還可以把它接到其他虛擬機上繼續使用里邊的數據。cinder創建的volume必須被接到虛擬機上才能工作。類似於Amazon AWS EBS(Elastic Block Storage)。
架構介紹整個Trove由四大部分構成,虛擬機服務、trove-api、trove-taskmanager、trove-guestagent,其中虛擬機服務包括compute和volume服務,至於compute服務具體是由kvm、lxc、xen等哪個來提供,trove並不關心,當用戶請求創建一個數據庫實例時,虛擬機只要能提供運行數據庫服務的環境即可。trove-api接收用戶的各種請求(數據庫實例創建、刪除、備份、重啟等),通過rpc消息隊列與trove-taskmanager服務通信(這一點與OpenStack的其它系統一樣)。trove-taskmanager是實際的服務管理器,負責管理一個請求任務整個過程,主要是與nova-compute通信創建compute、與cinder-volume通信創建volume、與trove-guestagent通信在虛擬機內完成包括啟動數據庫服務/創建用戶/初始化數據庫/備份數據庫服務/重啟數據庫服務等等操作。trove-guestagent是運行與虛擬機內完成數據庫操作的“機器人”(具體任務由trove-taskmanager下達)。
1與其他組件的關系Trove與其他組件之間的關系,即表結構如下圖所示:2組件構成Trove 與nova一樣是一個無共享信息系統(share nothing messaging system)。它的所有組件通過信息總線互相通訊,而且可以運行在不同的服務器上。與nova類似,Trove通過 http 發送消息,消息通過消息總線發送並翻譯並得到同步響應。目前主要包括以下主要的組件:
1Trove-Api Server(Trove API服務器) API server用來控制客戶端和數據庫。 API端點是一些基本的 http web 服務,這些服務處理 鑒權,授權 以及基本的與數據庫相關的命令和控制功能。API server目前與兩類系統通訊。 它與Trove Task Manager通訊來處理復雜的異步任務。 它也直接與Trove Guest Agent通訊來處理簡單的任務(例如:獲取MySQL 用戶的列表),這些任務都是同步任務。API不處理任何負荷,它們的工作只是產生請求,並將請求轉化為消息,並將消息發送到Trove Task Manager 和 Trove Guest Agent上去。
2Trove-TaskManager主要完成具體的繁重的工作,如部署數據庫實例,管理實例的生命周期,完成對數據庫實例的操作等等。它主要監聽RabbitMQ 消息隊列來得到請求。 Task Manager接受從API Server發出的消息,並根據消息的內容進行反饋和開啟任務。其中一些復雜的任務包括改變數據庫flavor(套餐)的大小以及創建實例。這些任務都需要 HTTP調用OpenStack的服務,並輪詢這些服務直到實例激活為止並發送消息到Trove Guest Agent。
在多用戶的分布式系統中,Task Manager處理這些復雜的流程。它是有狀態的。在它的系統中包含了復雜的流程圖。如果在狀態遷移過程中Task Manager離線了,則操作會失敗。
3Trove-GuestAgent Task-GuestAgent: 是一種運行在客戶端實例上的服務,主要提供具體數據庫的運行和管理,並且對數據庫本身進行操作。guestagent同樣監聽RabbitMQ消息隊列c來得到請求,並且運行在每一個數據庫實例上。每一種數據庫都需要一個自己的guestagent實現,目前只有MySQL agent。GuestAgent 主要負責將datastore上電等復雜的任務。Guest Agent也通過conductor 給API 發送心跳消息。GuestAgent 運行在每一個數據庫實例上,並通過RabbitMQ消息隊列 進行消息監聽( 通過實例ID進行識別)。
4Trove Conductor Trove Conductor是一種運行在主機上的服務。主要負責接受客戶機實例的消息從而更新主機上的對應信息(例如:實例狀態和一個備份的當前狀態)。有了Trove Conductor,客戶機實例不再需要直接訪問主機上的數據庫。Trove Conductor隱藏了DB的實現,從而更方便升級且更安全。
Trove Conductor監聽message bus 上的 RPC消息並做相關的操作。Trove Conductor與GuestAgent 一樣監聽RabbitMQ消息隊列。 兩者區別在於conductor駐留在主機上而不在客戶機上。Guest agents與conductor通訊,該消息配置在conductor_queue中定義,缺省值為trove-conductor。
5Trove Message Bus Trove Message Bus 是一種消息隊列,主要負責API 端點, Trove Task Manager 和 Trove Guest Agent 之間的消息交互。從雲控制器往來的消息是從多個API發來的HTTP請求消息。
一個典型的消息傳送例子:API server 從一個用戶接受到一個請求。 API server 對該用戶進行鑒權以確保該用戶允許提交該命令。在請求消息中的對象的可用性也被 API server 進行評估。如果對象可用,該請求被路由到相關處理者的隊列引擎中。處理者持續監聽消息隊列。當監聽到一個任務請求,則處理者開始接受任務並執行任務。當任務結束時,一個消息被發送到API server 的消息隊列中並返回給發起的用戶。在整個過程中,按照需求,數據庫條目被查詢,添加或者刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM