实现 Couchbase 集群配置

实现 Couchbase 集群配置。

Launchpad 蓝图: https://blueprints.launchpad.net/trove/+spec/couchbase-cluster-support

问题描述

Couchbase 本质上是一种分布式数据库。文档会根据文档键的哈希值在所有节点之间均匀分布。它不像其他一些数据库(MongoDB)那样具有查询路由器或配置服务器。每个文档除了活动副本外,还可以有最多三个副本。这意味着集群内将存在该数据的三个额外副本。Couchbase 客户端会收到更新的“集群映射”,它们使用该映射来查找数据。

当将节点添加到集群时,现有的文档会在集群内逐步重新分布(该过程也称为重新平衡)。更新的集群映射会持续提供给客户端。在此过程中,任何活动的客户端连接都不应中断。

当从集群中删除节点时,其他节点上的副本会被提升为活动状态,并且集群映射会更新,以便客户端可以继续提供请求。然后,提升的文档会在剩余节点内重新复制(重新平衡)。

有关更多详细信息,请参阅 参考文献 部分。

提议的变更

本规范提出了以下与集群相关的操作

  • 创建

  • 扩容

  • 缩容

  • 删除

  • 升级

Couchbase 对集群施加了内存的集群范围配额,该配额在节点服务之间均匀分布。所有节点(包括未来的节点)都需要能够容纳此配额。因此,我们需要集群是同构的。配额大小可以通过 Trove 配置中的‘cluster_ramsize_pc’进行配置,作为节点总 RAM 的百分比。

创建集群

  • 配置请求数量的实例,同时将它们初始化为 Couchbase 节点(所有节点都从 API 接收相同的随机生成的管理凭据)。

  • 等待实例变为活动状态。

  • 在第一个节点(协调器)上执行集群初始化。

  • 通过协调器节点将剩余节点添加到集群。

  • 等待集群重新平衡完成。

扩展集群

  • 从现有集群的第一个节点(协调器)检索当前的管理员凭据。

  • 使用当前凭据(上述)配置并初始化请求数量的实例为 Couchbase 节点。

  • 等待实例变为活动状态。

  • 通过协调器节点将新节点添加到集群。

  • 等待集群重新平衡完成。

缩减集群

  • 加载移除的实例。

  • 选择剩余节点中的一个,并将其用作协调器。

  • 通过协调器从集群中删除节点。

  • 等待集群重新平衡完成。

  • 删除停用实例。

配置

以下配置值将在 Couchbase 配置组中实现

cfg.BoolOpt('cluster_support', default=True,
            help='Enable clusters to be created and managed.'),
cfg.StrOpt('api_strategy',
           default='trove.common.strategies.cluster.experimental.'
           'couchbase.api.CouchbaseAPIStrategy',
           help='Class that implements datastore-specific API logic.'),
cfg.StrOpt('taskmanager_strategy',
           default='trove.common.strategies.cluster.experimental'
           '.couchbase.taskmanager.CouchbaseTaskManagerStrategy',
           help='Class that implements datastore-specific task manager '
                'logic.'),
cfg.StrOpt('guestagent_strategy',
           default='trove.common.strategies.cluster.experimental'
           '.couchbase.guestagent.CouchbaseGuestAgentStrategy',
           help='Class that implements datastore-specific Guest Agent API '
                'logic.'),
cfg.IntOpt('cluster_ramsize_pc', default=80, min=0, max=80,
           help='Per node RAM quota in for the Data service expressed as a'
           ' percentage of the available memory.'
           ' Minimum of 256MB will be used if the given percentage amounts'
           ' for less.'),

数据库

公共 API

公共 API 安全

Python API

CLI (python-troveclient)

内部 API

Guest Agent

这项工作需要在 guest manager 中进行一些初步的重构。这可能还包括以下任务:

  • 提供一个通用的框架来执行 Couchbase CLI 调用。guest-agent 当前仅执行硬编码在‘system.py’文件中的两个 CLI 命令。我们需要执行更多种类的命令。这将包括 CouchbaseAdmin 以通用方式执行 CLI 调用并处理结果。它还将促进减少‘system.py’,我们一直在其他 guest 中远离它。

  • 使 ramsize 配额相对于节点的总 RAM。Couchbase 3 需要 cluster-init 的参数是 RAMSIZE 配额。有效值介于 256MB 和可用 RAM 的 80% 之间。将默认百分比设置为 Trove 变量。

  • 使用适当的 guestagent 模型来处理 Couchbase 管理员用户。Couchbase 应该使用它自己的用户模型,而不是依赖于通用的 MySQL 对象。

以下方法将在 CouchbaseGuestAgentAPI 中实现

def initialize_cluster(self):
    LOG.debug("Configuring cluster parameters via node: %s" % self.id)
    self._call("initialize_cluster",
               guest_api.AGENT_HIGH_TIMEOUT, self.version_cap)

def get_cluster_password(self):
    LOG.debug("Retrieving cluster password from node: %s" % self.id)
    return self._call("get_cluster_password",
                      guest_api.AGENT_LOW_TIMEOUT, self.version_cap)

def get_cluster_rebalance_status(self):
    LOG.debug("Retrieving status of current cluster rebalance via node: %s"
              % self.id)
    return self._call("get_cluster_rebalance_status",
                      guest_api.AGENT_LOW_TIMEOUT, self.version_cap)

def add_nodes(self, nodes):
    LOG.debug("Adding nodes to the cluster: %s" % self.id)
    self._cast('add_nodes', self.version_cap, nodes=nodes)

def remove_nodes(self, nodes):
    LOG.debug("Removing nodes from the cluster: %s" % self.id)
    self._cast('remove_nodes', self.version_cap, nodes=nodes)

def cluster_complete(self):
    LOG.debug("Sending a setup completion notification for node: %s"
              % self.id)
    return self._call("cluster_complete", guest_api.AGENT_HIGH_TIMEOUT,
                      self.version_cap)

备选方案

Dashboard 影响 (UX)

需要启用 Couchbase 作为集群数据存储。

实现

负责人

主要负责人

Petr Malik <pmalik@tesora.com>

里程碑

Ocata

工作项

guest manager 和集群策略本身中的初步工作可以分两个提交交付,如果它能促进更流畅的审查过程。

升级影响

依赖项

测试

  • 将根据需要添加管理器单元测试。

  • 场景测试已经涵盖了已实现的功能。

文档影响

需要更新 Couchbase 的数据存储文档,以反映集群支持。

附录