Trove架構
- API Server
- Message Bus
- Task Manager
- Guest Agent
- Conductor
API Server
API endpoint(trove-api)本質上是一個HTTP的Web服務,具備處理鑒權、授權、與數據存儲相關的基本命令和控制功能。根據數據庫不同,API還有一些不同的擴展。
API Server與兩個系統溝通——與Task Manager溝通,來處理復雜的異步任務;直接與Guest Agent溝通來處理簡單的任務比如獲取MySQL用戶列表等,這部分操作均是同步的。API Server不做任何重大/復雜的事情,它的任務就是接收請求,將其轉化為消息,校驗它們,并將這些消息轉發到任務管理器(Task Manager)和訪客代理(Guest Agent)。
- 一個RESTful風格的組件
- 入口 -
Trove/bin/trove-api - 使用WSGI launcher,由
Trove/etc/trove/api-paste.ini配置- 定義了過濾器管道、令牌認證、速率限制等
- 定義了app_factory為
trove.common.api:app_factory提供給trove應用
- API 類(WSGI Router)將REST路徑連接到相應的Controller上
- Controller的實現在相關的模塊下(如versions/instance/flavor/limits)的
service.py中
- Controller的實現在相關的模塊下(如versions/instance/flavor/limits)的
- Controller通常將實現重定向到
models.py中的一個類 - 另一些組件(Task Manager,Guest Agent)的api模塊通過RabbitMQ發送請求
Message Bus
這部分組件仿照了Nova架構。Message Bus其實就是一個消息隊列。
一個典型的消息傳遞事件從API服務器接收到用戶的請求開始。API服務器認證用戶確保用戶具備執行響應命令的權限。對請求中涉及到的對象的可用性進行評估,如果可用,將請求路由到相關Worker的排隊引擎。Workers不斷根據自己的角色監聽消息隊列,當這種監聽產生一個工作請求時,Worker將對該任務進行任務分配并開始執行。完成任務后,Worker將響應發送到消息隊列,由API服務器接受并中繼到始發用戶的隊列。在整個過程中,數據庫記錄根據需要會被查詢、添加或者刪除。
Task Manager
Task Manager(trove-taskmanager)就是干粗活累活的家伙,比如配置一臺實例,管理實例生命周期和在實例上進行操作。任務管理器接收來自API Server的消息,通過同意消息進行響應,并開始執行任務。有幾個復雜的任務,比如重新分配數據庫規格和創建實例等,他們均需要通過HTTP請求調用OpenStack的服務,同時也需要輪詢服務,知道實例變為活動狀態,并且還向客戶代理發送消息。任務管理器處理在多個分布式系統中發生的進程流。
任務管理器是有狀態的,它在其系統內部運行復雜的流程。如果在狀態處理期間任務管理器節點脫機,則操作將失敗。任務流系統將最終實現為長時間運行運行的任務。(The Task Flow system will be eventually implemented for long running tasks.)
- 這是一個監聽RabbitMQ topic的服務
- 入口 -
Trove/bin/trove-taskmanager - 作為一個RpcService運行,通過
Trove/etc/trove/trove-taskmanager.conf.sample配置文件進行配置,定義了trove.taskmanager.manager.Manager作為manager,基本上這是通過隊列到達的請求的入口點 - 如上所述,使用TaskManager的api模塊,使用
_cast()或者_call()(同步/異步)將對該組件的請求從另一個組件推送到MQ中,并放置方法命作為一個參數 Trove/openstack/common/rpc/dispatcher.py中的RpcDispatcher.dispatch()通過反射的方式調用Manager中合適的方法- 然后,Manager將該處理重定向到
models.py模塊中的一個對象,它使用context和instance_id從相關類加載一個對象 - 實際的處理一般在
models.py中完成
Guest Agent
客戶代理(Guest Agent,trove-guestagent)運行在客戶實例內部,負責管理和執行數據存儲本身的操作。它負責使數據存儲在線,這可能是一個復雜的任務。熱支持(Heat support)將來將成為Trove的默認配置和儀器引擎,從而減少了將數據存儲庫聯機的任務。Guest Agent還通過Conductor(指揮器)向API Server發送心跳信息。
每個數據存儲器都實現有一個客戶端代理,負責為該數據存儲器執行特定人物。比如Redis的客戶代理行為與MySQL的客戶代理行為就會不同。不過他們必須履行諸如創建和調整規格的基礎操作。
- 與Task Manager類似,服務運行起來監聽RabbitMQ topic
- Guest Agent在每個數據庫實例中運行,所以使用專有的RabbitMQ topic(通過實例ID來標識)
- 入口 -
Trove/bin/trove-guestagent - 作為一個RpcService運行,通過
Trove/etc/trove/trove-guestagent.conf.sample配置文件進行配置,定義了trove.guestagent.manager.Manager作為manager,基本上這是通過隊列到達的請求的入口點 - 如上所述,使用Guest Agent的api模塊,使用
_cast()或者_call()(同步/異步)將對該組件的請求從另一個組件推送到MQ中,并放置方法命作為一個參數 Trove/openstack/common/rpc/dispatcher.py中的RpcDispatcher.dispatch()通過反射的方式調用Manager中合適的方法- 然后,Manager將對對象的處理重定向到
dbaas.py中 - 實際處理一般在
dbaas.py中完成
Conductor
指揮器(Conductor)是運行在宿主機上的餓一個服務,負責接收客戶實例中的消息,并在宿主機上更新信息,比如,實例的狀態和當前備份的狀態。有了指揮器,用戶的實例不需要直接連接到宿主機的數據庫。指揮器通過Message Bus監聽RPC消息,并執行相關的操作。指揮器與客戶代理有些類似,因為它是一個監聽RabbitMQ主題的服務,不同的是Conductor運行在宿主機上,而非客戶實例內部。客戶代理通過將消息放入配置的消息隊列——conductor_queue,默認為trove-conductor——來與指揮器進行信息交互。
- 入口 -
Trove/bin/trove-conductor - 作為一個RpcService運行,通過
Trove/etc/trove/trove-conductor.conf.sample配置文件進行配置,定義了trove.conductor.manager.Manager作為Manager - 如上面的客戶代理類似,請求通過其他組件使用_cast()(異步的)推送到消息隊列。一般來講,消息格式為
{"method": "<method_name>", "args": {<arguments>}} - 實際的數據庫更新操作由
trove/conductor/manager.py完成 - “heartbeat”操作更新實例的狀態,通常由Guest Agent來報告實例狀態,如從NEW到BUILDING到ACTIVE等等
- “update_backup”方法修改備份的詳情,包括它的當前狀態、備份大小、類型和校驗碼(checksum)
代碼倉庫
- Trove Server (//github.com/openstack/trove)
- Trove Integration (//github.com/openstack/trove-integration)
- Trove Client (//github.com/openstack/python-troveclient)
安裝部署
- How to install trove as part of devstack: trove/installation
- How to use trove-integration: trove/trove-integration
- How to set up unit tests to run with tox: trove/unit-testing
- How to set up a testing environment and run redstack tests after installation: trove/integration-testing
- How to set up your Mac dev environment to debug: trove/dev-env
- Releasing python-troveclient trove/release-python-troveclient
- Creating release notes with Reno trove/create-release-notes-with-reno
說明
翻譯自Trove wiki