我对Cassandra来说是个新手,这篇文章解释了分片和复制,我被困在了一个点上-
我在本地计算机上配置了一个包含6个Cassandra节点的集群。我创建了一个新的关键字空间“TestKeyspace”,复制因子为6,并在关键字空间“Employee”中创建了一个表,主键是名为rid的自动增量数字。我无法理解这些数据将如何分区和复制。我想知道的是,既然我将复制因子保持为6,并且数据将分布在多个节点上,那么每个节点是否将拥有与其他节点完全相同的数据?
Number of nodes - 6 (n1, n2 ,n3, n4, n5 and n6).
replication_factor - 3.
PS-如果有人投票反对这个问题,请在评论中提到哪里出了问题。
我将用简单的例子来解释这一点。cassandra中的键空间相当于RDBMS中的数据库模式名。
首先创建一个keyspace--
CREATE KEYSPACE MYKEYSPACE WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 3
};
让我们创建一个简单的表-
CREATE TABLE USER_BY_USERID(
userid int,
name text,
email text,
PRIMARY KEY(userid, name)
) WITH CLUSTERING ORDER BY(name DESC);
cluster_name: 'MyCluster'
initial_token: 0
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 198.211.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
cluster_name: 'MyCluster'
initial_token: 3074457345618258602
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 192.241.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
节点2的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: 6148914691236517205
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
......Node3......Node4....
节点5的cassandra.yaml:
cluster_name: 'MyCluster'
initial_token: {some large number}
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
让我们采用以下insert语句-
INSERT INTO USER_BY_USERID VALUES(
1,
"Darth Veder",
"darthveder@star-wars.com"
);
Partitioner将计算分区键的哈希值(在上面的示例中是userid-1),并决定此行将保存在哪个节点。假设计算的哈希值为12345,该行将保存在节点0(在上面的配置中查找Node0的initial_token值)。
根据复制策略和复制因子,数据将在每个节点上复制。在创建密钥空间时,必须指定复制因子和复制策略。例如,在上面的示例中,我使用SimpleStrategy
作为复制策略。该策略适用于小型集群。对于地质分布式应用程序,可以使用NetworkTopologyStrategy
。replication_factor指定要创建多少个行的副本,在本例中,将创建每行的三个副本。通过简单的策略,cassandra将使用顺时针方向复制行。
在上面的示例中,行保存在Node0,而同一个节点复制在Node1和Node2上。再举个例子--
INSERT INTO USER_BY_USERID VALUES(
448454,
"Obi wan kenobi",
"obiwankenobi@star-wars.com"
);
对于用户ID448454,计算出的哈希值是3074457345618258609,因此该行将保存在Node2处(在上面的配置中查找Node2的initial_token值),并顺时针方向复制到Node3和Node4(记住我们指定了3的复制因子,因此只有三个副本Noe2、Node3、Node4)。
希望这能有所帮助。
问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项
问题内容: 为什么以下内容没有将文件复制到目标文件夹? 问题答案: 如果您打算将找到的文件复制到/ home / shantanu / tosend中,则可以将cp的参数顺序颠倒过来: 注意:find命令使用 {} 作为匹配文件的占位符
我已经使用Postgres/Npgsql设置了Sql复制。 我们在Ravendb中使用GUID作为ID。只要Postgres中我的id列的类型是varchar,一切都正常,但如果我将其设置为uuid,这应该是与Guid匹配的正确类型,它就会失败。 对于id以外的其他列,它也会失败。 Postgres日志给我: 运算符不存在:uuid=字符34处的文本提示:没有与给定名称和参数类型匹配的运算符。您可
与原始类型相比,对象的根本区别之一是对象是“通过引用”被存储和复制的,与原始类型值相反:字符串,数字,布尔值等 —— 始终是以“整体值”的形式被复制的。 如果我们稍微看一下复制值时发生了什么,就很容易理解了。 让我们从原始类型开始,例如一个字符串。 这里我们将 message 复制到 phrase: let message = "Hello!"; let phrase = message; 结果我
本文向大家介绍C#复制和深度复制的实现方法,包括了C#复制和深度复制的实现方法的使用技巧和注意事项,需要的朋友参考一下 深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。 运行结果: 一、List<T>对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: 二、List<T>对象中的T是引用类型的情况(例如自定义的实
问题内容: 这个问题已经在这里有了答案 : atomic / volatile / synchronized有什么区别? (7个答案) 11个月前关闭。 我知道允许可见性,允许原子性。因此,如果我使用volatile ,是否意味着我不必再使用任何同步机制了? 例如。 这是线程安全的吗? 问题答案: 我相信这实际上会 同时带来 原子性和波动性。因此,当您致电(say)时,可以保证获得 最新的 价值。