还需要,只是变得更隐蔽了。
分库分表或者 sharding 的本质是摩尔定律的失效,单一节点的计算能力无法管理所有的应用状态。由于在多个节点上维护同一份状态并且保证彼此一致的成本太高,所以需要设计一组策略,把应用数据分成若干份,让每一份数据路由到不同的节点进行处理。
这里没有太多技巧。研究过 paxos/raft 就会知道在不同节点间维持状态一致性需要付出多大的成本。
sharding 机制引入了数据分布策略,目前的主流分布式数据库都在尝试屏蔽数据的分布,给用户访问一份完整数据的感觉。
这种处理方式实际上是一种封装。封装在什么情况下会失效?
当用户关注性能的时候。
尽管可以把 linklist 封装成 array 但是 linklist 永远无法提供与 array 相同的性能特性。
因此当应用关注性能的时候,会发现分布式数据库的 sharding 策略实际决定了不同应用场景的访问性能。这时候应用仍然需要关注 sharding,也就是关心数据在存储上是如何真正分布的。
那样我们又回到了分库分表。
你说应用不关注性能?呃,那样随便用哪一个数据库都可以,真的。