天天看點

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

最近一段時間以來,微服務架構和docker成為了技術社群的“網紅”。其背後的原因是将微服務與docker的結合在一起對現有的軟體生命周期從架構設計、開發測試到運維疊代構成了一種“颠覆性”的力量:微服務鼓勵開發者将整個軟體解構為較小的功能元件;每個元件能夠獨立開發、運維、伸縮和容錯;元件之間通過标準的服務接口進行通信,而元件可以選擇最适合的技術棧來實作。而容器技術進一步拓展了這種解耦性,它能夠将軟體與其部署環境分離,利用容器靈活和可移植的使得容器化的元件可以更快地進行建立,在軟體流水線不同階段使用完全相同的鏡像部署,不但能夠更好的確定軟體品質并且更易于維護。

大家在實踐中會發現:docker容器非常适用于無狀态的應用,比如web應用,計算任務等等;利用容器技術,這些應用可以彈性擴充,可以快速部署和回退;然而很多開發者遇到的一個重要的挑戰就是:如何對待有狀态的服務?這裡是指服務本身需要持久化儲存某些資料(即狀态),不能随便丢棄這些資料。比如,資料庫伺服器、消息隊列、檔案存儲等等。對于無狀态應用,開發者可以像對待牛群(cattle)那樣,可以随時建立、抛棄或替換;而對于持久化服務,很多需要我們像愛護寵物(pets)那樣,精心調優,維護,備份恢複。

當然利用統一的技術解決不同類型工作負載的部署和運維是我們的理想,而且docker在支援持久化服務的上面已經有了很大進步;比如利用volume插件和分布式存儲技術,docker容器和它依賴的持久化資料可以更加簡單的在不同主控端節點上遷移。但是在容器環境中對持久化服務進行運維,依然還有很長的道路要走,需要服務的提供商針對容器化部署運維做出調整和簡化,才能被社群所接受。

對于開發者而言,他們非常願意在開發和測試環境中利用docker容器來建立持久化服務,比如應用中所使用的mysql資料庫,redis緩存等等。這樣的好處是:可以快速建構開發環境,在開發團隊中保持一緻。然而在生産環境中,他們仍然希望引用外部獨立部署的持久化服務,來保證服務品質,采用更加成熟的方式對持久化服務進行運維,比如使用阿裡雲關系資料庫服務(rds)。

是否有一種方法能夠讓應用在不同的環境中輕松切換來自不同實作的服務,而且保持行為一緻?這樣才能夠平衡使用者對開發和運維不同需求的沖突。

在阿裡雲容器服務中,容器編排模闆中不但支援容器的連結(container linking),也非常友善的支援容器到外部服務的連結。這樣我們可以在一個應用模闆中,輕松地将mysql容器替換為rds執行個體的引用,無需修改任何應用代碼。

我們将用之前介紹的ghost部落格應用來完成本次試驗。

上文中,我們介紹了一個利用ghost, mysql的容器編排模闆來部署一個高可用的ghost部落格叢集。其compose模闆如下,

注意:

使用者需要指定正确的oss bucket和access key資訊才能夠利用,oss提供的對象存儲在不同的ghost應用直接共享圖檔和上傳的檔案

對于<code>ghost_url</code>環境變量需要和<code>aliyun.routing</code>标簽定義的路由資訊向比對,除了上文提供的自定義域名的方式,使用者還可以通過叢集服務提供的二級域名來進行測試;通路位址格式如下,更多資訊可參見幫助文檔

<code>&lt;虛拟主機&gt;.&lt;叢集id&gt;.&lt;叢集域名&gt;.alicontainer.com</code>

在compose模闆中,ghost應用利用容器連接配接的方法引用mysql容器提供的資料庫服務。通過<code>db:mysql</code>定義的連接配接,ghost容器中程序可以利用<code>mysql</code>作為host别名和引用<code>db</code>容器的環境變量,比如<code>mysql_user</code>,<code>mysql_password</code>等,這樣就可以實作與資料庫的綁定。

首先我們需要使用阿裡雲rds建立一個mysql資料庫,或使用一個已有的rds執行個體。

下圖在北京域建立一個mysql 5.6資料庫,并選擇與容器叢集一緻的網絡類型(經典網絡或vpc),這樣使得北京域的部署的docker應用可以通過内網通路rds執行個體。

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

建立資料庫使用者“ghost”,資料庫“blog”并授權。具體操作請參見rds幫助文檔

配置完成後,需要配置rds對容器叢集的通路白名單,建立一個白名單分組“acscluster”并把叢集服務中所有ecs節點添加到清單中,這樣就可以在叢集中任何一個節點應用通路rds執行個體了。

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

完成白名單配置之後,就可以從界面獲得rds的連結資訊

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

現在我們就修改上文的docker compose模闆來引用所建立的rds執行個體了,修改結果如下

我們采用external來定義一個外部服務的引用,我們需要指定它的主機位址(host)和端口清單(ports),之後我們還是像原來的mysql容器一樣利用環境變量提供通路資料庫的連接配接資訊。這樣當部署之後,容器服務可以讓ghost應用通過容器連接配接通路rds執行個體,而其表現行為和連接配接mysql容器完全一緻,無需修改任何代碼就可以讓容器應用享受到專業化的資料服務了。這是不是很簡單呢?:-)

注:使用者需要根據實際情況確定db中host, mysql_password等值與rds配置保持一緻

利用容器服務,我們可以友善的部署一個compose模闆, 詳見上文,來建立一個利用rds實作資料庫通路的高可用ghost叢集。

通路容器應用中ghost服務提供的通路端點,會打開ghost部落格界面

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

一個嶄新的部落格就建立出來了!

當Docker遇到資料庫:在阿裡雲容器服務中使用RDS

目前對持久化服務的容器化部署和運維依然是富有挑戰性的工作。在現階段,比較現實的方法是将成熟的雲服務,比如阿裡雲rds,mongodb,redis服務,和容器化應用結合在一起來簡化使用并提高服務品質。

根據12-factor應用的建議:将應用邏輯和所依賴的服務解耦;将外部服務配置存儲于環境變量中。這樣可以友善地讓應用在不同的部署間切換不同服務實作,無需改動一行代碼。

在之前的文章裡,我們為您提供了一些建議,可以建構出符合12-factor原則的雲原生容器應用,友善的通過容器連結建立對其他容器的綁定。而阿裡雲容器服務可以讓容器應用統一地使用連結的方式通路容器或外部服務;這個能力可以讓使用者針對不同場景選擇最合适的持久化服務實作。