IBM「認知課堂」如何使用Docker服務於超百萬學者

「認知課堂(Cognitive Class)」是IBM面向全球技術人員提供的高質量課程學習平臺,課程主題包括人工智能(AI)、機器學習、數據科學、大數據、分析和數據庫等,前身爲IBM Big Data University。自發布以來,「認知課堂」跨過了一項又一項里程碑,現在已擁有超過100萬名學習者。mysql

這篇文章中將分享IBM「認知課堂」在技術方面的里程碑和演變,特別是平臺是如何從一個靜態基礎架構轉變到如今使用Docker、運行着數十個Open edX實例的動態+可擴展部署的。nginx

OPEN EDX 101redis

Open edX是edx.org提供的開源代碼。它由幾個存儲庫組成,edx-platform是其主要存儲庫。若是想要部署Open edX實例,官方的方法是使用配置好的repo,經過Ansible playbooks自動安裝。這種方式須要訪問正在運行Ansible playbook的服務器。在這些完成以後,你將得到一個全新的Open edX部署。sql

IBM也是這樣運營cognitiveclass.ai(咱們的對外網站)的,從2015年開始IBM將「認知課堂」從Moodle部署轉移到了Open edX上。Open edX提供了很好的服務,使得咱們天天能夠爲數百名併發學習者提供超過70門課程。數據庫

但咱們仍然面臨着一些挑戰:安全

  • Open edX主要針對的是Amazon的AWS服務,但咱們要在IBM Cloud上運行咱們的基礎架構。服務器

  • 須要建立虛擬機來部署新實例。網絡

  • Open edX從存儲在服務器中的JSON文件中讀取配置信息,每一個實例必須保持這些文件同步。架構

雖然咱們可以在大型的單一部署中克服這些問題,但對於咱們的新目標對象,Cognitive Class Private Portals來講它們會變得很難管理。併發

商業用途的「認知課堂」

在向其餘公司介紹時,咱們常常會聽到一樣的問題:「我怎麼樣才能讓個人員工明白並使用這些內容呢?」,這也是咱們爲「認知課堂」創立「專屬門戶(Private Portals)」的動機所在。

「專屬門戶」是一個專門爲客戶建立的專用部署,用戶能夠獨享專屬於他的「認知課堂「,能夠建立自定義學習路徑、自行定製課程、追蹤學習進度、設置訪問限制、創立競賽等等。「專屬門戶」服務是IBM爲團隊、部門、小型企業、大型企業、學術機構和培訓提供商等推出的。從技術角度來看,這就要求咱們可以快速按需推出新的部署。咱們回到前文提到的幾點挑戰,隨着部署數量的增加,第二點和第三點尤爲具備挑戰性。

爲每一個部署建立和配置新的虛擬機是一個緩慢並且昂貴的過程。若是某個Portals超出了它的資源,咱們不得不須要找到一種方法來擴展它,而且在多個虛擬機中管理它的配置。

使用Docker

與此同時,咱們在Virtual Labs(供課程用戶進行實踐操做的環境)的基礎設施中遇到了相似的需求,數百個虛擬機的使用讓管理很是混亂。因而IBM的Virtual Labs團隊開始研究而且實現基於Docker的解決方案。

對咱們來講,Docker的主要好處有兩個:

  • 提升服務器的使用密度;

  • 隔離服務進程以及文件。

這些好處是密切相關的:由於每一個容器管理本身runtime和文件,咱們可以在同一個服務器上輕鬆運行不一樣的軟件,而不會相互干擾。與虛擬機相比,咱們這樣作的開銷要低不少,由於Docker在它們之間提供了輕量級的隔離。

經過提升使用密度,咱們可以在少許大型服務器中運行數千個容器,這些服務器能夠提早進行配置,而不須要去管理數千個較小的實例。

對於IBM的「認知課堂-專屬門戶「網站來講,這意味着咱們能夠在幾分鐘內準備好使用新部署。底層的基礎設施已經就位,因此咱們只須要啓動一些容器便可。

使用Rancher管理容器

Docker自己就是一項出色的技術,但面對高度可擴展的分佈式生產環境,咱們仍須要藉助其餘工具或平臺來管理容器的生命週期。在「認知課堂」平臺中,咱們決定使用Rancher,它可以讓咱們將基礎設施抽象出來,只需專一於應用程序自己。

簡而言之,Rancher將容器組織成服務,接着服務被分組到stack中。把stack部署到環境中,而環境由主機控制,主機是最終啓動容器的底層服務器。Rancher負責在全部主機上建立專用網絡,以便他們能夠相互安全地進行通訊。

讓一切運行起來

咱們的網站採用微服務架構,都在Rancher中以stack的形式組合在一塊兒。Open edX是主要組成部分,它能夠分爲較小的服務。除了Open edX以外,咱們還有其餘幾個組件能夠爲咱們的產品提供額外的功能。下圖是咱們的Rancher界面示例:

這裏有很是多的內容,因此咱們來快速解釋一下這些內容:

Open edX

  • lms:這是學生訪問課程內容的地方

  • cms:用於創做課程

  • forum:處理課程討論

  • nginx:提供靜態資源

  • rabbitmq:消息隊列系統

    附加組件

  • glados:管理員用戶界面,用於控制和自定義Protal

  • companion-cube:用於開放Open edX額外功能的API

  • compete:運行數據黑客馬拉松的服務

  • learner-support:內置的學習者支持系統

  • lp-certs:爲完成多門課程的學生頒發證書

    支持服務

  • cms-workers和lms-workers:執行lms和cms的後臺任務

  • glados-worker:執行glados的後臺任務

  • letsencrypt:使用Let的加密自動管理SSL證書

  • load-balancer:根據請求主機名控制路由到服務的流量

  • mailer:代理SMTP請求到外部服務器或者以其餘方式發送電子郵件

  • ops:用於運行特定任務的容器組

  • rancher-cron:按照相似cron的計劃啓動容器

    數據存儲

  • elasticsearch

  • memcached

  • mongo

  • mysql

  • redis

其中ops服務的行爲和其餘服務的行爲有所不一樣,所以咱們深刻研究一下:

這裏咱們能夠看到在ops中有幾個容器,一般狀況下它們是不運行的。某些容器(如edxapp-migrations)會在部署Portal時運行,但除非在特殊狀況下(例如數據庫架構更改),不然不會再次啓動。而其餘容器,如backup,由rancher-cron按期啓動,一旦完成就中止。

在這兩種狀況下,咱們均可以經過單擊啓動按鈕來觸發手動啓動。這樣咱們可以輕鬆地按需運行重要的操做任務,而不須要使用SSH進入特定服務器,肯定要運行的腳原本執行。

操做文件

Docker的一個關鍵特性是每一個容器的文件系統都是隔離開的。這意味着,若是沒有適當注意,在容器死亡的時候您可能會丟失重要的文件。處理這種狀況的方法,是使用Docker的卷將本地文件系統路徑掛載進容器。

此外,當您有多個主機時,最好有一個共享數據層,以免在容器和服務器之間建立隱式調度依賴關係。換句話說,您但願容器可以訪問相同的文件,而不管它們運行在哪一個主機上。

在咱們的基礎架構中,咱們使用IBM Cloud NFS驅動器,它安裝在全部主機的相同路徑下。NFS負責存儲Portal生成的任何持久化數據,從數據庫文件到已編譯的靜態資源,好比鏡像、CSS和JavaScript文件。

每一個Portal在NFS驅動器中都有本身的目錄,容器會掛載該特定Portal的目錄。所以,一個Portal沒法訪問另外一個Portal的文件。

其中一個最重要的文件是ansible_overrides.yml。正如咱們在文章開頭所提到的,Open edX是由進程啓動時所讀取到的JSON文件配置的。Ansible playbook在執行時生成這些JSON文件。

爲了把Portal管理員對glados所作的更改應用到Open edX的lms和cms,咱們將ansible_overrides.yml掛載到容器中。當某些內容發生變化時,glados能夠將新值寫入此文件,lms和cms能夠讀取它們。

接着咱們從新啓動lms和cms容器,經過這些容器來運行Ansible playbook,在啓動時從新生成JSON文件。ansible_overrides.yml做爲變量文件傳遞給Ansible,這樣在那裏聲明的任何值均可以覆蓋Open edX的默認值。

有了這個共享數據層,咱們沒必要再擔憂容器會被從新分配到另外一個主機上了,咱們確信Docker可以找到正確的路徑,並將所須要的卷掛載進容器中。

結 論

經過在IBM認知課堂平臺的發展過程當中,依靠學到的經驗教訓以及使用最新的技術,咱們可以構建出快速、可靠和可擴展的解決方案,爲認知課堂的學生和客戶提供更好的學習體驗。這篇文章中介紹了不少內容,但願能讓您有所收穫。Happy learning!

相關文章
相關標籤/搜索