作者回复: 加一颗星:),能否容忍的可能的短暂的一致性延迟,是关键。
作者回复: 网络分区是指因为网络故障导致网络不连通,不同节点分布在不同的子网络中,各个子网络内网络正常。其实,你可以这么理解,节点之间的网络通讯出现了消息丢失、高延迟的问题。
作者回复: 加一颗星:)
作者回复: 可以这么理解,分布式系统是必须要考虑分区容错性的,也就是说,出现分区错误时,比如节点间通讯丢消息了,系统要能运行,那么,这时候如何运行呢?是选择一致性呢,还是选择可用性呢。
作者回复: 前半部分的容忍性,其实指的的是可用性,做法是分区部署、增加数据缓存,提升可用性。分区容错性是一种行为,指的是分区错误发生时,系统依然能提高服务,这时可以提供的服务,有两种,一致性和可用性,需要注意的是,有些服务是要求一致性的,也就是说,增加集群副本数,是不能解决问题的。可用性,就比较好理解了,但在实际中,仅仅增加副本数或缓存是不够的,还需要全方位的监控能力、高灵敏的故障检测能力、全网的调度能力,等等。
作者回复: 加一颗星:)。这里是简化表示,比如你可以理解成二阶段提交的事务。关于第一个“如果”,多节点的副本是无法做到完全同时完成提交的,但能保证写完成后,读取都是一致的;如果需要实现读取的严格一致性,比如,可以通过实现“Master-Slave”模型,读写只访问Master节点,实现读取的严格一致性;第二个“如果”,就是常见事务型系统的缺点。
作者回复: 加一颗星:)
作者回复: 加一颗星:)
作者回复: 加一颗星:),是写请求,相比Raft,Multi-Raft是有改进的,但和最终一致性的方案相比,还是有差距。其实,Raft不适合时序数据场景,比如,如果即使采用multi-raft,因为时序数据,有时需要拉取一批数据,这时需要在外围,再实现分布式迭代器,工作量,还是蛮大的;另外,在Raft中,uncommitted的log,可能被丢弃了,也可能在后面被提交了,也就是说,当Raft返回给客户端超时错误时,数据是否会被提交,是个不确定状态,如果这时,客户端不重试,可能会丢数据,如果客户端重试,对于没有带时间戳的时序数据,会导致数据重复,当然,我们可以通过重新约定InfluxDB行为、实现冥等操作等,来解决这个问题,但这样做,不仅增加工作量和系统复杂度,还影响用户的体验;还有最后一点,也就是最最重要的,高性能的背后,是成本,是钱,这个经济效益,会在海量数据场景,被放大,性能是最核心的一个考虑因素。
作者回复: Raft是具有容错能力的共识算法,可以用来实现一致性,比如,类似Google Chubby,读写操作都在领导者节点上执行。 可以这么理解,分布式事务实现的是一致性,不能容忍任何节点出问题;只要集群中有一个节点,都能继续提供服务,可以把这个理解为可用性。而Raft等共识算法,能容忍少数节点的故障,但通过读写操作都在领导者节点上执行,也能为业务提供一致性的数据服务,可以将共识算法理解为对分布式事务型算法的改进,既有容错能力,又能提供一致性。