cassandra的各个节点通过gossip协议了解彼此的状态。
每个节点每隔1秒钟与其它节点交换消息,每个节点每次与不超过3个邻居节点交换消息,每个消息除了包含自己的状态信息外还包含自己知道的其它节点的状态。每个消息都有一个版本号,这样旧的消息就会被更新。
当一个节点初次启动时,它会通过cassandra.yaml配置文件知道自己所加入的集群的名字,并得到一个种子(seed)节点列表,种子节点列表中的每个节点都是有代表性的节点(例如多个数据中心情况下每个数据中心都要有一个节点作为种子。)通过与种子节点通讯,新加入的节点可以迅速了解到整个集群的结构和状态。
要注意配置文件的num_tokens字段是1.2新增的,initial_token字段不再使用。
当节点重新启动时,之前的gossip信息都保存在本地,因此无需长时间的等待就可以迅速加入集群。如果需要其丢弃之前的gossip信息(例如ip地址改变),只需在cassandra-env.sh文件中加入以下一行即可:
-Dcassandra.load_ring_state=false