简介
分片是最常见的策略,数据根据逻辑分布到各分区。为了处理分区透明性,文章提到了分片、复制、位置和逻辑透明性。
然而,分区也带来挑战,如数据分区决策、故障处理、查询复杂性和数据一致性。
为应对这些问题,本文提及了布隆过滤器防止缓存穿透,随机过期策略缓解缓存雪崩,以及控制热点key更新以确保数据一致性。
1 如何对redis缓存进行分区?
一般不会在应用程序中执行分区,而是在分布式数据库中做透明化处理。
对缓存进行分区涉及在多台计算机上拆分缓存。
与使用单个缓存服务器相比,此结构具有多个优势,包括:
创建比单个服务器上可以存储的缓存大得多的缓存。跨服务器分发数据,提高可用性。
如果一台服务器发生故障或变得不可访问,则它保存的数据不可用,但仍可以访问其余服务器上的数据。
对于缓存,这并不重要,因为缓存的数据只是数据库中保存的数据的临时副本。无法访问的服务器上的缓存数据可以改为缓存在其他服务器上。
将负载分散到服务器之间,从而提高性能和可伸缩性。
将数据地理定位到靠近访问它的用户的位置,从而减少延迟。
对于缓存,最常见的分区形式是分片。在此策略中,每个分区(或分片)本身就是一个 Redis 缓存。
数据通过使用分片逻辑定向到特定分区,分片逻辑可以使用多种方法来分发数据。
2 处理分区透明性的方式
分片模式提供了有关实现分片的更多信息。
分片透明:
用户不必知道关系数据是如何分片的,它们对数据的操作在全局关系上进行,
即关系如何分片对用户是透明的。
复制透明:
用户不用关心数据库在网络中各个节点的复制情况,被复制的数据的更新都由系统自动完成
位置透明:
用户不必知道所操作的数据放在何处,即数据分配到哪个或哪些站点存储对用户是透明的。
逻辑透明:
是最低层次的透明性,该透明性提供数据到局部数据库的映像
即用户不必关心局部DBMs支持哪种数据模型、使用哪种数据操纵语言,
数据模型和操纵语言的转换是由系统完成的。
数据分布(也称分片)技术,主要用于构建数据索引,是实现“导航”功能的关键技术。
数据分布的本质是,将原数据集划分为多个数据子集,以存储到不同的地方,在一定程度上体现了数据的可用性和可靠性(一个存储节点故障,只影响该存储节点的数据)。
在实际情况下,仅考虑数据分片,其实是无法真正应用到生产环境的。
因为,故障导致数据丢失和不可用是很常见的情况。
因此,在进行分布式数据存储设计时,通常会考虑对数据进行备份,以提高数据的可用性和可靠性,而实现数据备份的关键技术就是“数据复制技术”。
3 数据库分片后也带来一些挑战
分片带来了许多挑战:
数据分区:决定如何跨多个分片对数据进行分区可能是一个挑战,因为它需要在数据接近度和数据均匀分布之间找到平衡以避免某一片太热,其他分片无流量。
故障处理:如果关键节点发生故障并且没有足够的分片来承载负载,如何在不停机的情况下在新节点上获取数据?
查询复杂性:应用程序代码与数据分片逻辑耦合,需要来自多个节点的数据的查询需要重新联接。
数据一致性:确保跨多个分片的数据一致性可能是一个挑战,因为它需要协调跨分片的数据更新。
当同时进行更新时,这可能特别困难,因为可能需要解决不同写入之间的冲突。
弹性可扩展性:随着数据量或查询数量的增加,可能需要向数据库添加其他分片。
这可能是一个复杂的过程,不可避免地会出现停机,需要手动过程在所有分片之间均匀地重新定位数据。
4 小结
常见问题规避
缓存穿透 大量访问redis不存在的key
布隆过滤器
缓存雪崩 大量key之前存在,但是同时失效了
增加随机过期策略,不要同时过期
缓存击穿 一些热点key失效了
热点key需要永久有效,如果需要重新设置热点key,只允许一个数据库连接去操作数据库,其他的等待完成后再进行操作
技术大多是一把双刃剑,有优势的时候,通常也意味着有其劣势。
了解这种情况,并在适当的场景使用对应的技术,才能真正的解决问题。