实现 Vertica 集群配置

https://blueprints.launchpad.net/trove/+spec/implement-vertica-cluster

问题描述

通过 Trove 集群 API 提供 HP Vertica CE 集群。

提议的变更

Trove 提供了一个设计良好的框架,用于实现不同数据存储的集群。Vertica 数据存储需要额外的努力才能完成集群配置。

HP Vertica CE 需要至少 3 个节点才能实现容错。

开发计划

  • API 策略,用于处理 Vertica 的集群请求。

  • 任务管理器策略,用于处理 Vertica 的集群配置。

  • Guestagent 策略,用于处理任务管理器到客户实例的 RPC API 调用。

  • 单元测试和集成测试。

  • 集群将返回其节点的 IP 地址。这样做是为了使集群能够用于多写和多读。

  • 每个实例的名称将自动生成,格式为 <cluster_name>-member-<instance_num>。

  • 由于 CE 版本最多支持 3 个节点,并且 2 个节点的 HP Vertica 集群无法容错,因此集群将没有增长/缩减功能。

如何部署 HP Vertica 集群

要将多个实例绑定到 Vertica 集群,请使用每个节点 IP 运行“install_vertica”命令。接下来,运行 admintools 在集群中包含的所有节点上创建一个数据库。

集群配置分步指南

  • 启动 N 个实例。

  • 一旦 N 个实例启动并运行,收集它们的 IP 地址。

  • 通过将公钥复制到 authorized_keys,为 root 和 dbadmin 用户启用成员实例之间的无密码 ssh。

  • 将其中一个节点分类为第一个节点(first-node 对于 trove 来说只是逻辑上的,Vertica 没有这样的偏好)。

  • 从第一个节点,使用所有 IP 地址运行 install_vertica,将所有节点缝合到 vertica 集群中。

  • 从第一个节点,运行 admintools 创建一个包含集群中所有节点的数据库。

配置

Vertica 数据存储需要新的配置选项来启用集群。

cluster_support - 描述集群功能的可用性。

类型:布尔值

api_strategy - API 策略实现的全限定类名。

类型:字符串

taskmanager_strategy - 任务管理器实现的全限定类名。

类型:字符串

guestagent_strategy - Guestagent 实现的全限定类名。

类型:字符串

数据库

此实现将利用现有的集群数据库模式。

公共 API

创建/删除集群的 API 请求将保持不变。但是,响应会有一些细微的差异。Vertica 集群将返回其所有节点的 IP 地址。这将用于希望扩展读/写操作的用户。

创建集群

请求

POST /v1.0/<tenant_id>/clusters
{
  "cluster": {
    "name": "vertica-clstr",
    "datastore": {
      "type": "vertica",
      "version": "7.1"
    },
    "instances": [
      {
        "flavorRef": "2",
        "volume": {
          "size": 2
        }
      },
      {
        "flavorRef": "2",
        "volume": {
          "size": 2
        }
      },
      {
        "flavorRef": "2",
        "volume": {
          "size": 2
        }
      }
    ]
  }
}

响应

{
  "cluster": {
    "id": "edaac9ca-b5e1-4028-adb7-fa7653e11224",
    "task": {
      "id": 2,
      "name": "BUILDING",
      "description": "Building the initial cluster."
    },
    "name": "vertica-clstr",
    "created": "2015-01-29T20:19:23",
    "updated": "2015-01-29T20:19:23",
    "links": [{...}],
    "datastore": {
      "type": "vertica",
      "version": "7.1"
    },
    "ip": [],
    "instances": [
      {
        "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1",
        "name": "vertica-clstr-member-1",
        "status": "BUILD",
        "ip": [],
        "links": [{...}],
        "flavor": {
          "id": "2",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        }
      },
      {
        "id": "965ef811-7c1d-47fc-89f2-a89dfdd23ef2",
        "name": "vertica-clstr-member-2",
        "status": "BUILD",
        "ip": [],
        "links": [{...}],
        "flavor": {
          "id": "2",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        }
      },
      {
        "id": "3642f41c-e8ad-4164-a089-3891bf7f2d2b",
        "name": "vertica-clstr-member-3",
        "status": "BUILD",
        "ip": [],
        "links": [{...}],
        "flavor": {
          "id": "2",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        }
      }
    ]
  }
}

HTTP 状态码

202 - Accepted.
400 - BadRequest. Local storage not specified in flavor ID: <ID>.
400 - BadRequest. The number of instances for your cluster must be 3.
400 - BadRequest. A volume size is required for each instance in the cluster.
400 - BadRequest. A flavor is required for each instance in the cluster.
404 - Not Found. Flavor not found.

显示集群

请求

GET /v1.0/<tenant_id>/clusters/edaac9ca-b5e1-4028-adb7-fa7653e11224

响应

{
  "cluster": {
    "id": "edaac9ca-b5e1-4028-adb7-fa7653e11224",
    "task": {
      "id": 1,
      "name": "NONE",
      "description": "No tasks for the cluster."
    },
    "name": "vertica-clstr",
    "created": "2015-01-29T20:19:23",
    "updated": "2015-01-29T20:19:23",
    "links": [{...}],
    "datastore": {
      "type": "vertica",
      "version": "7.1"
    },
    "ip": ["10.0.0.1", "10.0.0.2", "10.0.0.3",],
    "instances": [
      {
        "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1",
        "name": "vertica-clstr-member-1",
        "status": "ACTIVE",
        "ip": ["10.0.0.1"],
        "links": [{...}],
        "flavor": {
          "id": "7",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        },
      }
      {
        "id": "965ef811-7c1d-47fc-89f2-a89dfdd23ef2",
        "name": "vertica-clstr-member-2",
        "status": "ACTIVE",
        "links": [{...}],
        "flavor": {
        "ip": ["10.0.0.2"],
          "id": "7",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        },
      },
      {
        "id": "3642f41c-e8ad-4164-a089-3891bf7f2d2b",
        "name": "vertica-clstr-member-3",
        "status": "BUILD",
        "ip": ["10.0.0.3"],
        "links": [{...}],
        "flavor": {
          "id": "7",
          "links": [{...}]
        },
        "volume": {
          "size": 2
        },
      }
    ]
  }
}

HTTP 状态码

200 - OK.
404 - Not Found. Cluster not found.

显示实例

请求

GET /v1.0/<tenant_id>/clusters/edaac9ca-b5e1-4028-adb7-fa7653e11224/instances/416b0b16-ba55-4302-bbd3-ff566032e1c1

响应

{
  "instance": {
    "status": "ACTIVE",
    "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1",
    "cluster_id": "edaac9ca-b5e1-4028-adb7-fa7653e11224",
    "name": "vertica-clstr-member-1",
    "created": "2015-01-29T20:19:23",
    "updated": "2015-01-29T20:19:23",
    "links": [{...}],
    "datastore": {
      "type": "vertica",
      "version": "7.1"
    },
    "ip": ["10.0.0.1"],
    "flavor": {
      "id": "7",
      "links": [{...}],
    },
    "volume": {
      "size": 2,
      "used": 0.17
    }
  }
}

HTTP 状态码

200 - OK.
404 - Not Found. Cluster not found.
404 - Not Found. Instance not found.

列出集群

请求

GET /v1.0/<tenant_id>/clusters

响应

{
  "clusters": [
    {
      "id": "edaac9ca-b5e1-4028-adb7-fa7653e11224",
      "task": {
        "id": 1,
        "name": "NONE",
        "description": "No tasks for the cluster."
      },
      "name": "vertica-clstr",
      "created": "2015-01-29T20:19:23",
      "updated": "2015-01-29T20:19:23",
      "links": [{...}],
      "datastore": {
        "type": "vertica",
        "version": "7.1"
      },
      "instances": [
        {
          "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1",
          "name": "vertica-clstr-member-1",
          "links": [{...}],
        }
        {
          "id": "965ef811-7c1d-47fc-89f2-a89dfdd23ef2",
          "name": "vertica-clstr-member-2",
          "links": [{...}],
        },
        {
          "id": "3642f41c-e8ad-4164-a089-3891bf7f2d2b",
          "name": "vertica-clstr-member-3",
          "links": [{...}],
        }
      ]
    },
    ...
  ]
}

HTTP 状态码

200 - OK.

删除集群

HTTP 方法

DELETE

路由

/v1.0/<tenant_id>/clusters/<cluster_id>

请求

{

}

响应

{

}

HTTP 代码

202 - Accepted.

集群操作

没有集群操作。

内部 API

从 API 服务到任务管理器服务

  • create_cluster

    • 检查所有实例是否处于 BUILDING 状态。

    • 将其中一个实例指定为第一个实例。

    • 调用 guest “get_keys” 以从所有成员实例接收公钥。

    • 调用 guest “authorize_keys” 将一组公钥注册到所有成员实例。

    • 调用 guest “install_cluster” 将所有节点绑定到具有数据库的集群。

    • 调用 guest “cluster_complete” 到所有节点以完成活动。

    • 检查所有实例是否处于 ACTIVE 状态。

Guest Agent

为了完成 Vertica 数据存储的集群配置,根据新的 guestagent 策略,需要更多的 RPC API。

实现

负责人

主要负责人

里程碑

“Kilo-3”

工作项

  • 实现 API 策略。

  • 实现任务管理器策略。

  • 实现 Guestagent 策略。

  • 单元和集成测试

依赖项

首先将单个实例 Vertica 数据存储合并到 Trove 中。

测试

将对策略中的每个组件进行单元测试。将测试集群功能的集成测试。

文档影响

文档需要更新

  • Trove 对 Vertica 集群的功能。

  • Vertica 集群创建方法。

  • 由于 HP Vertica 集群的性质,现有响应的修改。