Please enable JavaScript.
Coggle requires JavaScript to display documents.
为什么不能保证 Exactly-once, 熔断机制的关键点, 为什么需要限流, 限流算法, 大数据分析场景的数据处理一般有以下的特点,…
-
-
-
限流算法
-
滑动窗口
固定窗口就是定义一个“固定”的统计周期,比如 10 秒、30 秒或者 1 分钟,然后在每个周期里,统计当前周期中被接收到的请求数量,经过计数器累加后,如果超过设定的阈值就触发限流,直到进入下一个周期后,计数器清零,流量接收再恢复正常状态
问题
如果上一个统计周期的流量集中在最后 10 ms ,而现在这个统计周期的流量集中在前 10 ms ,那么这 20 ms 的时间内会出现 200 次调用,这就超过了我们预期的 2 秒内不能超过 100 次请求的目的了。这时候,我们就需要使用“滑动窗口”算法来改善这个问题了。
由于流量突增使请求超过预期,导致流量可能在一个统计周期的前 10 ms 内就达到了 100 次,给服务的处理能力造成一定压力,同时后面的 1990 ms 将会触发限流。这个问题虽然可以通过减小统计周期来改善,但是因为统计周期变小,每个周期的阈值也会变小,一个小的流量抖动就会导致限流的发生,所以系统的抗抖动能力就变得更差了。
漏桶
相对于滑动窗口和固定窗口来说,漏桶有两个改进点,第一,增加了一个桶来缓存请求,在流量突增的时候,可以先缓存起来,直到超过桶的容量才触发限流;第二,对出口的流量上限做了限制,使上游流量的抖动不会扩散到下游服务。这两个改进大大提高了系统的抗抖动能力,使漏桶有了流量整形的能力。
-
令牌桶
令牌桶算法的核心是固定“进口”速率,限流器在一个一定容量的桶内,按照一定的速率放入 Token ,然后在处理程序去处理请求的时候,需要拿到 Token 才能处理;如果拿不到,就进行限流。因此,当大量的流量进入时,只要令牌的生成速度大于等于请求被处理的速度,那么此时系统处理能力就是极限的。
-
-
-
制的粒度变小一点的方法,可以带来一些显著优点
-
-
但是,当主从复制的副本数量不再和机器数量强绑定,比如指定副本数量为 3 个,那么我们需要同步的从副本数量就是 2 个,不论集群的机器的数量如何增加,副本的数量都不会改变,这样我们就可以通过增加机器,来提升整个系统整体的读写性能。
-
-
分布式限流
-
其次,另一个方案是将分布式限流进行本地化处理
限流器在获得一个服务限额的总阈值后,将这个总阈值按一定的策略分配给服务的实例,每一个实例依据分配的阈值进行单节点限流。这里要注意的是,如果服务实例的性能不一样,在负载均衡层面,我们会考虑性能差异进行流量分配。在限流层面,我们也需要考虑这个问题,性能不同的实例,限流的阈值也不一样,性能好的节点,限流的阈值会更高。
最后,我们来讨论一个折中的方案,这个方案建立在集中式限流的基础上,为了解决每次请求都需要,通过网络访问限流器获取令牌的问题,客户端只有在令牌数不足时,才会通过限流器获取令牌,并且一次获取一批令牌。这个方案的令牌是由集中式限流器来生成的,但是具体限流是在本地化处理的,所以在限流的性能和精确性之间,就有了一个比较好的平衡
-
-
-
-
-
-
降级机制的关键问题
熔断、限流和降级之间的关系
首先,因为熔断机制是系统稳定性保障的最后一道防线,并且它是自适应的,所以我们应该在系统全局默认启用;其次,限流是用来保障被限流服务稳定性的,所以我们建议,一般在系统的核心链路和核心服务上,默认启用限流机制;最后,降级是通过牺牲被降级的接口或者服务,来保障其他的接口和服务正常运行的,所以我们可以通过降级直接停用非核心服务,然后对于核心接口和服务,在必要的时候,可以提供一个“ B 计划”。
-
-
-
-
-
混合分片策略
垂直水平分片策略
先进行垂直分片,再进行水平分片
垂直水平分片策略就是垂直分片策略的水平扩容版本。对于水平分片策略,我们通常会选择主键进行水平分片,这样主键的列在整个存储系统中是有序的,垂直水平分片策略的数据分布特性和优缺点,与垂直分片策略完全相同,这里就不再重复讨论了。
-
-
-
-
-
-
-
-
数据划分
数据划分要解决的问题是,将整个数据空间划分为多个分片空间,它主要有两种方式,基于模运算划分和基于范围划分。基于模运算的划分,在“负载均衡”篇中 Hash 负载均衡策略的部分充分介绍过了,这里不再重复。下面我们重点介绍基于范围的划分,如下图所示,它分为基于关键词划分和基于关键词的 Hash 值划分两种方式
这两种划分方式都是给每一个分片,分配一个确定的数据范围,在这个数据范围内的所有数据,都属于这个分片。基于关键词划分和基于关键词的 Hash 值划分,二者唯一的区别在于,前者是直接利用关键词进行划分,而后者是利用关键词的 Hash 值进行划分
-
数据平衡
根据数据分片是否支持动态的分裂与合并,我们可以将水平分片的数据平衡方式分为静态分片和动态分片。其中静态分片是指在系统设计之初,数据分片的数目和区间就预估好了,数据划分后不能再变化,而动态分片则可以在运行时,根据分片的负载和容量做调整。
对于静态分片,由于分片区间在运行时不能再调整,所以数据划分时一定要谨慎考虑。如果我们对数据的分布有足够的了解,并且数据的分布是比较稳定的,就可以采用基于关键词的方式,通过选择合适的关键词对数据进行划分。例如上文中提到的中国公民数据库的例子中,对于中国各省市的人口分布,因为我们有统计数据支撑,并且人口分布的数据非常稳定,所以就可以基于地址信息,并且结合数据的分布进行划分了
在我们对数据的分布不了解,或者数据的分布不稳定的情况下,如果要采用静态分片的话,比较稳妥的方式是,采用基于关键词的 Hash 值的方式对数据进行划分,通过 Hash 算法解决数据分布和访问的热度不均匀的问题
对于动态分片,因为在运行时,分片区间是可以进行分裂和合并的,所以我们不用担心不了解数据分布,而导致分片区间划分不合理的情况,也不用担心在分片区间划分后,数据的分布发生变化,使分片区间不合适的问题。总而言之,动态分片与基于关键词的划分,往往是一个比较好的组合方式,它避免了基于关键词划分的问题,还保留了数据基于关键词有序的优点。
在基于关键词的划分中,基于自增 ID 或者时间戳等原因,导致的访问冷热不均匀的问题,即使是在动态分片中也不能很好地解决,因为数据的热点往往集中在最新的一个分片区间上。而基于关键词的 Hash 值划分的方式,则可以很方便地将最新的热点数据分布到多个分片上,很好地解决这个问题
-
-
-
-
首先,数据复制导致的相关硬件成本是成倍增长的。其次,由于数据是持续变化的,导致复制操作不能一次完成,我们必须持续将这些变化复制到它所有的节点上,这就给分布式存储带来一个非常大的麻烦:在数据复制的过程中,由于节点可用性和网络中断等各种原因,可能会导致不同节点的数据不完全相同,这就是数据的一致性问题。
-
-
-
-