数据分库
场景问题
当系统的访问量达到上百万用户时,系统的性能达到了上限,系统已经做了一轮轮优化:
(1)应用集群
(2)程序优化
(3)数据库优化(SQL优化、集群)
(4)数据缓存
(5)网络优化(加大带宽、多个网卡)
(6)操作系统优化
但是,系统到了又一个瓶颈,在怎么优化都没有什么效果了。通过性能跟踪,发现是数据库的数据量太大了(几张表都达到了10亿条数据了),而且随着系统的用户访问数据是不停的往上增加。SQL无论怎么优化,数据操作的时间已经达到了一个极限了。
发现数据库服务器的CPU和IO已经都达到了100%,可见,当前机器的硬件情况已经到达了极限,接下来怎么办呢?有人说,把机器换成一台更加强大的机器,磁盘做磁盘阵列。没错,这些做完后,缓解了性能的瓶颈,但是,随着数据量的增加,性能瓶颈又一次出现了。机器又达到极限了。再换更强大的机器,以此类推。机器真的能无止境的变强下去吗?
我们看到了应用可以集群,那么数据为什么不能集群呢?了解后才发现,数据的集群不是那么回事,虽然访问的是多台机器了,但数据还是同一份。最终IO的瓶颈还是会出现。
能不能仿照应用集群那样,有一个HTTP服务器和多个应用服务器。数据也有一个总控制器和多个数据服务器?那就需要将数据进行切分成一块块的,分布在不同的机器上。这样我们可以无限制的进行数据切分,无限制的增加数据服务器。
这个时候我们又遇到新的问题:怎么切分才是合理的?怎么才能找到对应的数据块呢?下面我们介绍怎么通过数据分库来解决以上的问题。
数据分库:基于性能考虑,将数据存放到不同的数据库服务器中,一般可以按两个纬度来拆分数据:
垂直拆分:是指按功能模块拆分,比如CRM可以将客户信息、订单信息、产品信息存放在不同的数据库中,这种方式多个数据库之间的表结构不同。
水平拆分:而水平拆分是将同一个表的数据进行分块保存到不同的数据库中,比如:可以将客户信息按照不同市分别存放在不同的数据库中,这些数据库中的表结构完全相同。