我会尽量用简单的方式解释
Cassandra 提供了一种简单的配置方式,所有配置都在 cassandra.yaml 中完成。您也可以通过THIS 了解集群中的分区情况。
让我们从基础开始,我们现在只使用一个节点,而不是使用三个节点。
使用 cassandra 的默认配置,我们在 cassandra.yaml 文件中得到以下值
num_tokens: 1
initial_token: 0
这意味着只有一个节点,所有分区都将驻留在这个节点上。
现在,虚拟节点的概念,简单来说就是 cassandra 将令牌划分为多个范围,即使没有物理节点。现在,如何在配置文件 cassandra.yaml 中启用虚拟节点功能。答案是 num_token 值。
num_tokens: 128
#initial_token: 0
此配置生成 128 个令牌范围,例如 0-10、11-20、20-30 等。保留 initial_token 的值注释,这意味着我们希望 cassandra 决定初始令牌的值(少了一件需要担心的事情)。
现在让我们在集群中添加另一个节点。下面是新节点的简单配置。为简单起见,将第一个节点 IP 视为 127.0.0.1,将第二个节点 IP 视为 127.0.0.2。
num_tokens: 128
#initial_token: 0
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "127.0.0.1, 127.0.0.2"
我们刚刚在集群中添加了一个新节点,node1 将作为种子节点。 num_token 值为 128,即 128 个令牌范围。 initial_token 的值被注释了,这意味着 cassandra 将决定初始令牌和范围。新节点加入集群后,数据传输将立即开始。
对于第三个节点,配置如下-
num_tokens: 128
#initial_token: 0
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "127.0.0.1, 127.0.0.2, 127.0.0.3"
所以第三个节点将共享 node1 的几个令牌范围和 node2 的几个令牌范围。
我希望,到目前为止,我们已经得到了问题 1 和问题 2 的答案。让我们转到下一个问题。
当一个节点出现故障时,提示切换帮助 Cassandra 保持一致性。剩下的 2 个节点中的任何一个都保留了应该写入已关闭节点上的数据的提示。一旦节点上线,这些提示将被重播,数据将被写入目标节点。无需进行重新分区或重新平衡这类花哨的事情。提示存储在可以在 cassandra.yaml 文件中配置的目录中。默认情况下将存储 3 小时的提示,这意味着缺陷节点应在 3 小时内出现。这个值也可以在 cassandra.yaml 文件中配置。
hinted_handoff_enabled: true
max_hint_window_in_ms: 10800000 # 3 hours
hints_directory: /home/ubuntu/node1/data/hints
Murmur3Partitioner 使用分区键列计算哈希,让我们放心吧。还有其他从业者,例如 RandomPartitioner 和 ByteOrderedPartitioner。
以下是 gossip info 的示例输出 -
您可以浏览以下协议数据中的每个字段
ubuntu@ds201-node1:~$ ./node1/bin/nodetool gossipinfo
/127.0.0.1
generation:1621506507 -- the tiem at this node is boot strapped.
heartbeat:2323
STATUS:28:NORMAL,-1316314773810616606 -----status of the node , NORMAL,LEFT,LEAVING,REMOVED,REMOVING.....
LOAD:2295:110299.0 -- Disk space usage
SCHEMA:64:c5c6bdbd-5916-347a-ab5b-21813ab9d135 -- Changes if schema changes
DC:37:Cassandra --- data center of the NODE
RACK:18:rack1 --- Rack of the within the datacenter
RELEASE_VERSION:4:4.0.0.2284
NATIVE_TRANSPORT_ADDRESS:3:127.0.0.1
X_11_PADDING:2307:{"dse_version":"6.0.0","workloads":"Cassandra","workload":"Cassandra","active":"true","server_id":"08-00-27-32-1E-DD","graph":false,"health":0.3}
NET_VERSION:1:256
HOST_ID:2:ebd0627a-2491-40d8-ba37-e82a31a95688
NATIVE_TRANSPORT_READY:66:true
NATIVE_TRANSPORT_PORT:6:9041
NATIVE_TRANSPORT_PORT_SSL:7:9041
STORAGE_PORT:8:7000
STORAGE_PORT_SSL:9:7001
JMX_PORT:10:7199
TOKENS:27:<hidden>
Gossip 是跨集群传播数据的广播协议。没有人是 cassandra 集群的主人,对等点在彼此之间传播数据,这有助于他们维护最新信息。节点使用 gossip 协议随机地相互通信(这种随机性有一些标准)。 Gossip 仅传播节点元数据,而不传播客户端数据。
希望这能消除一些疑虑。