cassandra权威指南读书笔记--Cassandra架构(1)
结构
集群-->数据中心-->机架-->节点。
cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心。
为了去中心化和分区容错性,使用gossip协议。允许各个节点跟踪其他节点的状态信息。
cassandra gossip详情可以参考:
https://blog.csdn.net/weixin_38916872/article/details/81334014
https://zhaoyanblog.com/archives/1017.html
Gossip
gossip就像流行病一样,相互传输,最终达到一致。初始,每个节点都通过配置知道种子节点,和种子交互,然后还有选一个不可达的节点交互。每个节点都这么做,最终达成一致。每秒交互一次,每次交互全量的节点信息,一段时间后,获取全部集群节点信息。
故障检测
cassandra节点判断是否down的方案是使用Phi Accrual Failure Detection。不是传统的心跳,传统的心跳就是收到就认为活着,没收到就认为是死掉。
Phi的方式是使用累计故障的检测方式,具体可以参考:
https://www.cnblogs.com/yuhan-TB/p/4746510.html
Phi Accrual Failure Detection的论文。
简单来说,就是通过历史的心跳采样数据,制作泊松分布, 或者指数分布。带入上一次拿到那个节点的心跳时间,计算概率,再通过转换,如果算出来的值大于phi_convict_threshold,就是down,否则就是live。所以phi_convict_threshold越小越灵敏。
snitch(告密者)感应策略
snitch的任务是确定一个集群中各个节点的相对主机远近程度,这可以用来确定要读写哪些节点。snitch会收集网络拓扑的有关信息,使cassandra能够高效地路由请求。snitch可以确定节点相对其他节点的位置。
cassandra查询是先获取大多数副本的Hash摘要,如果Hash摘要一致,选择一个副本来获取整个对象。snitch的作用就是帮助识别能最快返回的副本,从而向这个副本查询完整数据。默认snitch与拓扑无关,不适合多数据中心部署。cassandra为不同的云环境提供多个snitch,可插拔,包括Amazon EC2,Google cloud,apache cloudstack。org.apache.cassandra.locator找到。
还有动态snitch,用来优化读写操作的路由。DynamicEndpointSnitch,从所选的snitch得到基本的拓扑信息,然后检测节点请求性能(包括合并数据),用来为每个查询提供最合适的副本。
动态snitch有个badness threshold配置,用来确定一个优先节点必须比表现最好的节点糟糕多少才会失去其优先地位。每个节点的表现会定期重置。