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!

相关文章
相关标签/搜索