实现 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。
依赖项¶
首先将单个实例 Vertica 数据存储合并到 Trove 中。
测试¶
将对策略中的每个组件进行单元测试。将测试集群功能的集成测试。