Cassandra NoSQL数据库中,节点、集群和数据中心有何区别?

46

我想使用DataStax OpsCenter在Cassandra NoSQL数据库中复制数据,以完成学校项目。根据我的阅读,有三个关键词:cluster、node和datacenter。根据我的理解,节点中的数据可以在另一个存在于另一个集群中的节点中进行复制。所有包含相同(复制)数据的节点组成一个数据中心。这样理解对吗?

如果不是,请问有什么区别?

4个回答

90

Cassandra中元素的层次结构如下:

  • 集群
    • 数据中心
      • 机架
        • 服务器
          • 节点(更准确地说,是虚拟节点)

一个集群包含多个数据中心。

数据中心包含多个机架。

机架包含多个服务器。

每个服务器默认包含256个虚拟节点(或vnode)。

vnode是服务器内的数据存储层。

注意:服务器是Cassandra软件。该软件安装在一个机器上,这个机器可以是物理服务器、EC2实例或类似的设备。

现在来具体回答你的问题。

一组数据单元称为分区。是的,分区会在多个节点之间进行复制。每个分区的副本称为副本。

在多数据中心集群中,复制是按照数据中心进行的。例如,如果你有一个名为dc-sf的旧金山数据中心和一个名为dc-ny的纽约数据中心,那么你可以控制每个数据中心的副本数。

举个例子,你可以将dc-sf设置为3个副本,而将dc-ny设置为2个副本。

这些数字称为复制因子。你可以明确地说dc-sf的复制因子为3,dc-ny的复制因子为2。简单来说,dc-sf将在三个vnode上分布三个数据副本,而dc-ny将在两个vnode上分布两个数据副本。

虽然每台服务器默认有256个vnode,但Cassandra足够聪明,可以选择存在于不同物理服务器上的vnode。

总结:

  • 数据在多个虚拟节点之间进行复制(每个服务器默认包含256个vnode)
  • 每个数据副本称为副本
  • 数据单元称为分区
  • 复制是按照数据中心进行控制的

根据链接 - 一枚令牌环来支配它们所有,一个集群只有一个环。因此,一个完整的令牌环实际上可能存在于一个集群中,而不是数据中心。 - hkbharath
@hkbharath,那个链接已经失效了 - 你是否有缓存副本或者能否简要概括一下它的内容?我认为它可能与我现在遇到的问题相关。谢谢。 - thinkdevcode
假设您在DC1和DC2中有6个服务器,每个服务器有1个节点。DC1中的节点令牌为1(node1)、2(node2)和3(node3),DC2中的节点令牌为1(node4)、2(node5)和3(node6)。通过哈希创建分区令牌。将分区令牌与节点令牌匹配以查找主副本。如果一个分区的令牌为1,则我们知道它在DC1中的主副本为节点1,在DC2中为节点4。来自Apigee的示例:https://community.apigee.com/articles/13096/cassandra-token-distribution.html - Akbar Ahmed
对于那些卡在这些概念上的人,可以使用 nodetool ring 查看集群中节点令牌。特别是当你被互联网上的冲突信息所困惑时,它会让这些概念变得更加清晰。 - Akbar Ahmed
一个节点或服务器可以是多个数据中心的成员吗? - Hossein

29
一个节点是运行Cassandra的单个机器。拥有相似数据的节点集合被分组在所谓的“环”或群集中。有时,如果您有大量数据,或者如果您正在不同地理区域提供数据,则将群集节点分组到不同的数据中心是有意义的。这样做的一个很好的用例是电子商务网站,它可能在东海岸和西海岸拥有许多经常访问的客户。这样,您在东海岸的客户连接到东海岸数据中心(以获得更快的性能),但最终可以访问与西海岸客户相同的数据集(两个数据中心都在同一群集中)。关于此的更多信息可以在这里找到:About Apache Cassandra- How does Cassandra work? 引用: “所有包含相同(重复)数据的节点都构成了一个数据中心,对吗?” 不完全正确。您的数据复制级别由每个keyspace上设置的副本因子决定。例如,假设我在单个DC中有3个节点,全部存储600GB的产品数据。我的products keyspace定义可能如下:
CREATE KEYSPACE products
WITH replication = {'class': 'NetworkTopologyStrategy', 'MyDC': '3'};

这将确保我的产品数据被同等地复制到所有3个节点。我的总数据集大小为600GB,全部复制到3个节点上。

但是,假设我们正在推出一个相当大的新产品系列,并且我估计我们还会有另外300GB的数据要到来,这可能会开始推动我们硬盘的最大容量。如果我们现在无法承担升级所有硬盘的费用,我可以像这样更改复制因子:

CREATE KEYSPACE products
WITH replication = {'class': 'NetworkTopologyStrategy', 'MyDC': '2'};
这将创建我们所有数据的两个副本,并将其存储在当前由3个节点组成的群集中。我们的数据集大小现在为900GB,但由于只有两个副本(每个节点实际上负责2/3的数据),因此我们的磁盘大小仍为600GB。这里的缺点是(假设我以ONE的一致性级别读取和写入),我只能承受1个节点的损失。而对于3个节点和RF为3(再次以ONE的一致性级别读写),我可以失去2个节点并仍然提供服务。
快速说明:server == node 就针对集群中的节点发起请求而言,该行为事实上是由应用程序端的驱动程序所决定的。实际上,驱动程序会维护当前网络拓扑的一个副本,因为它类似于节点一样读取集群流言协议。
在应用层面上,您可以设置负载均衡策略。具体来说,TokenAwareLoadBalancingPolicy类将检查每个请求的分区键,找出哪个节点具有数据,并直接将请求发送到那里。
对于其他负载均衡策略或无法确定单个分区键的查询,请求将被发送到单个节点。该节点将充当"协调器"。选定的节点将处理将请求路由到负责它们的节点以及编译/返回任何结果集。

我是一名iOS开发者,正在努力理解这些内容。对我来说,所有东西都是与服务器通信,即它发出一个网络“请求”并获得一个“响应”。当我发出一个网络请求时,我是针对服务器还是节点进行请求的?或者我向服务器发出请求,然后它会“路由”并从节点中读取或其他什么东西吗?您能否添加一张图片? - mfaani
@Honey,编辑已完成。 - Aaron
你是指环形数据结构还是其他的? - pentanol
@pentanol 不是。有时候“环”被用来指代一组多个节点(机器)的集群。 - Aaron

12

节点(Node):

存储整个数据库部分数据的机器。其中可能包括从另一个节点复制的数据以及其自己的数据。它负责哪些数据由其令牌范围和持有数据的键空间的复制策略来确定。

数据中心(Datacenter):

节点的逻辑分组,可以与其他节点分开。常见的用例是AWS-EAST与AWS-WEST。使用NetworkTopologyStrategy来指定任何给定数据中心应存在整个键空间的副本数量。这是Cassandra用户实现跨数据中心复制的方式。此外,还有一些一致性级别策略,只需要在协调者所在数据中心内进行确认(LOCAL_*

集群(Cluster)

数据库中所有机器的总和,包括所有数据中心。没有跨集群复制。


6
我们在相互回答时相差30秒,而且都使用东/西海岸数据中心的例子。这种情况的概率有多大?哈哈。 - Aaron
6
哈,Cassandra 有时候感觉就像是一个小地方 :) - RussS
如果一个集群是所有机器的总和,那么这是否意味着只有一个集群?当人们提到多个集群时,他们是什么意思? - ziggy
1
多个集群将是多个完全独立的数据库。它们不会相互通信。 - RussS
我是一名iOS开发者,正在努力理解这些。对我来说,所有东西都是与服务器进行通信,即进行网络请求并获得响应。当我发起网络请求时,我是针对服务器还是节点进行请求?或者我向服务器发出请求,它会将其路由并从节点中读取或者其他一些操作吗?能否添加一张图片? - mfaani
节点就是服务器。当你(驱动程序)发出请求时,你会将其发送到任意一个节点/服务器,然后该节点/服务器会将其转发到拥有所请求数据的节点/服务器。 - RussS

0
根据以下文档: https://docs.datastax.com/en/archived/cassandra/3.0/cassandra/architecture/archIntro.html 节点 存储数据的位置。它是Cassandra的基础架构组件。 数据中心 相关节点的集合。数据中心可以是物理数据中心或虚拟数据中心。不同的工作负载应该使用单独的数据中心,无论是物理的还是虚拟的。复制由数据中心设置。使用单独的数据中心可以防止Cassandra事务受到其他工作负载的影响,并使请求保持接近以降低延迟。根据复制因子,数据可以写入多个数据中心。数据中心绝不能跨越物理位置。 集群 一个集群包含一个或多个数据中心。它可以跨越物理位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接