(免责声明:我是 Scylla 的员工)
当您在节点上启动 Cassandra / Scylla 时,它们会联系种子节点(您在 yaml 文件中为所有 4 个节点定义)以获取有关环、令牌范围和环中其他成员(其他节点)。
Bootstrap 控制集群中数据在插入新节点时自动重新分配的能力。加入集群的新节点定义为没有系统表或数据的空节点。
- 联系种子节点以了解八卦状态。
- 转换到 Up 和 Joining 状态(表示它正在加入集群;用 表示
UJ
)nodetool status
。
- 联系种子节点以确保模式一致。
- 计算它将负责的令牌。
- 从前所有者那里流式传输与其负责的令牌相关联的副本数据。
- 流式传输完成后转换为 Up 和 Normal 状态(表明它现在是集群的一部分;
UN
在 中
表示nodetool status
)。
您可以在此处阅读有关引导的更多信息:http: //thelastpickle.com/blog/2017/05/23/auto-bootstrapping-part1.html
gossip 协议确保系统中的每个节点最终都知道有关每个其他节点状态的重要信息,包括在发生任何给定状态更改时无法访问或尚未在集群中的那些信息。Gossip timer 任务每秒运行一次。在每次运行期间,节点都会根据以下规则发起八卦交换:
- 八卦到随机实时端点(如果有)
- 根据不可达节点和活动节点的数量,以一定的概率向随机不可达端点发送消息
- 如果在 (1) 处闲聊到的节点不是种子,或者活动节点的数量少于种子的数量,则根据不可达、种子和活动节点的数量,以一定的概率向随机种子发送消息。
这些规则确保如果网络启动,所有节点最终都会知道所有其他节点。(显然,如果每个节点只联系一个种子,然后只向它知道的随机节点发送消息,那么当有多个种子时,您可以进行分区——每个种子只会知道集群中节点的一个子集。步骤 3 避免这个和更微妙的问题。)
这样一个节点每轮都会与一到三个节点发起八卦交换(如果它单独在集群中,则为零)
您可以在此处阅读有关 gossip 高级架构的更多信息:https ://wiki.apache.org/cassandra/ArchitectureGossip
您可以在此处阅读有关 Scylla gossip 实现的更多信息:
https ://github.com/scylladb/scylla/wiki/Gossip