DC/OS 1.10 及更高版本,和包 2.0.0-x 及更高版本

如果您正在使用 DC/OS 1.10 或更高版本,并且已安装服务的版本高于 2.0.0-x,那么卸载服务很简单。

从 DC/OS CLI,输入 dcos package uninstall --app-id=<service-name> hdfs.

卸载过程

卸载服务包括以下步骤:

  1. 服务调度程序将重新启动,并且其环境变量 SDK_UNINSTALL 设置为“true”。这将使服务进入卸载模式。
  2. 服务调度程序执行卸载操作,操作如下:
  • 服务的所有运行任务均被终止。
  • 调度程序取消保留所有已保留资源。
  • 警告:在保留的磁盘资源中存储的任何数据都将无法恢复。
  • 所有已知资源都取消保留之后,调度程序的持久状态将被删除。
  1. 完成卸载过程之后,群集即会自动删除调度程序任务。

注意: 卸载操作开始后就不能取消,因为这可能使服务处于不确定的半销毁状态。

调试卸载

有些情况下,自动卸载过程需要手动干预才能完成。

僵尸服务调度程序

如果服务调度程序在其 stdout 中报告卸载完成,但调度程序未从系统中删除,您可以通过 Marathon 安全地删除它。

缺少 DC/OS 代理

如果无法取消以前保留的所有资源,服务将不会完成卸载。其常见原因是服务为其保留资源的一个 DC/OS 代理不再是 DC/OS 群集的组成部分。

  • 如果代理仅因维护而暂时离开,服务将在代理返回群集时取消保留资源。

  • 如果代理已永久删除,那么卸载将无限期挂起。防止此问题的最简单方法是:启动卸载之前在部署于缺失代理上的任何 pod 上执行 pod replace

  • 如果仅在启动卸载后发现缺少的代理,则可以使用以下过程来完成卸载。

首先确定服务等待的资源。

  • CLI:dcos hdfs --name=hdfs plan show deploy(必要时在运行 dcos package install --cli hdfs 后)
  • HTTP:https://yourcluster.com/service/hdfs/v1/plans/deploy
$ dcos hdfs --name=hdfs plan show deploy
deploy (IN_PROGRESS)
├─ kill-tasks (COMPLETE)
│  ├─ kill-task-node-0-server__1a4114bc-48bb-47f6-be99-1b5ca6d55c4e (COMPLETE)
│  ├─ kill-task-node-1-server__0c42118e-04fd-40e1-b49d-0d3f71d2d243 (COMPLETE)
│  └─ kill-task-node-2-server__e00cad38-f27f-4332-b1df-5118ca480d50 (COMPLETE)
├─ unreserve-resources (IN_PROGRESS)
│  ├─ unreserve-f41351a2-b478-4e13-a94c-705f530989ef (COMPLETE)
│  ├─ unreserve-48f64612-8427-4cde-86f4-4edeb9efff37 (COMPLETE)
│  ├─ unreserve-402d51f5-6014-4ca3-bd13-324dae62b888 (PENDING)
│  ├─ unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf (PENDING)
│  ├─ unreserve-cbd748d0-df7b-4d01-b0b7-6acf915d8f98 (COMPLETE)
│  ├─ unreserve-00ed63d6-427c-4492-9713-772390cc5241 (COMPLETE)
│  ├─ unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2 (PENDING)
│  └─ unreserve-c9915f07-f446-4e14-a6b4-12c8dd2f914b (COMPLETE)
└─ deregister-service (PENDING)
   └─ deregister (PENDING)

正如我们以上所看到的那样,一些要取消保留的资源被困在 PENDING 状态。我们可以强迫它们进入 COMPLETE 状态,从而允许调度程序完成卸载操作。这可以使用以下任一方法进行:

  • CLI:dcos hdfs --name=hdfs plan show deploy
  • HTTP:https://yourcluster.com/service/hdfs/v1/plans/deploy/forceComplete?phase=unreserve-resources&step=unreserve-<UUID>
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-402d51f5-6014-4ca3-bd13-324dae62b888
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf
$ dcos hdfs --name=hdfs plan force-complete deploy unreserve-resources unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2

此时,调度程序应显示计划中这些步骤的 COMPLETE 状态,允许其继续正常进行卸载操作:

$ dcos hdfs --name=hdfs plan show deploy
deploy (IN_PROGRESS)
├─ kill-tasks (COMPLETE)
│  ├─ kill-task-node-0-server__1a4114bc-48bb-47f6-be99-1b5ca6d55c4e (COMPLETE)
│  ├─ kill-task-node-1-server__0c42118e-04fd-40e1-b49d-0d3f71d2d243 (COMPLETE)
│  └─ kill-task-node-2-server__e00cad38-f27f-4332-b1df-5118ca480d50 (COMPLETE)
├─ unreserve-resources (COMPLETE)
│  ├─ unreserve-f41351a2-b478-4e13-a94c-705f530989ef (COMPLETE)
│  ├─ unreserve-48f64612-8427-4cde-86f4-4edeb9efff37 (COMPLETE)
│  ├─ unreserve-402d51f5-6014-4ca3-bd13-324dae62b888 (COMPLETE)
│  ├─ unreserve-cb95e869-277f-48b9-954f-08c0d7a26bcf (COMPLETE)
│  ├─ unreserve-cbd748d0-df7b-4d01-b0b7-6acf915d8f98 (COMPLETE)
│  ├─ unreserve-00ed63d6-427c-4492-9713-772390cc5241 (COMPLETE)
│  ├─ unreserve-5dd56b1d-4522-4bbd-88b5-de9fa0f181f2 (COMPLETE)
│  └─ unreserve-c9915f07-f446-4e14-a6b4-12c8dd2f914b (COMPLETE)
└─ deregister-service (PENDING)
   └─ deregister (PENDING)

注意: 由于操作员可能需要一段时间来完成这些操作,卸载完成后,服务调度程序可能会处于僵尸状态。 请参阅上面的 僵尸服务调度程序,了解如何纠正这一点。

手动卸载

如果无法以其他方式恢复,则可以手动卸载服务。

  • 从 Marathon 中删除卸载调度程序。

  • 如下使用其 UUID 从 Mesos 中取消注册服务:

    $ dcos service --inactive | grep hdfs
    hdfs     False     3    3.3  6240.0  15768.0  <UUID>
    
    $ dcos service shutdown <UUID>
    
  • 运行 janitor.py 清理剩余的保留资源,如下列 DC/OS 1.9 说明中所述。

DC/OS 1.9 及更早版本,或早于 2.0.0-x 的包

如果您正在运行 DC/OS 1.9 或更早版本,或早于 2.0.0-x 的 Apache HDFS 服务版本,请遵循以下步骤:

  1. 停止服务。从 DC/OS CLI,输入 dcos package uninstall --app-id=<service-name> hdfs.
  2. 使用框架清洁器脚本 janitor.py清理剩余的保留资源。
$ MY_SERVICE_NAME=<service-name>
$ dcos package uninstall --app-id=$MY_SERVICE_NAME hdfs`.
$ dcos node ssh --master-proxy --leader "docker run mesosphere/janitor /janitor.py \
    -r $MY_SERVICE_NAME-role \
    -p $MY_SERVICE_NAME-principal \
    -z dcos-service-$MY_SERVICE_NAME"

参见 DC/OS 文档 了解有关框架清洁器脚本的详细信息。