实现 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 的数据存储文档,以反映集群支持。
参考资料¶
Couchbase 集群管理: http://docs.couchbase.com/admin/admin/Tasks/cluster-management.html
Couchbase CLI 参考: http://developer.couchbase.com/documentation/server/4.0/cli/cli-intro.html
Couchbase 集群 API: http://docs.couchbase.com/admin/admin/REST/rest-cluster-intro.html
附录¶
无