数据库结构演变

来源:互联网 发布:php 5.3.28.tar.gz 编辑:程序博客网 时间:2024/06/15 18:43

传统单机数据库面临的挑战

以电商网站为例,在网站创建之初,日均访问量可能只有几百到几千人,这时整个业务后台可能就一个数据库,所有业务表都放在这个数据库中,一台普通的服务器就可以支撑,而且这种架构对业务开发人员也非常友好,因为所有的表都在一个库中,这样查询语句就可以灵活关联了,使用起来很便捷。


图1 所有业务表都在一个数据库中

但是随着业务的不断发展,每天访问网站的人越来越多,数据库的压力也越来越大。通过分析发现,所有的访问流量中,80%以上都是读流量,只有20%左右的写流量,这时可以通过读写分离来缓解数据库的访问压力。


图2 读写分离

由于网站的访问量越来越大,尽管采取了读写分离的方式,但随着数据库的压力继续增加,数据库的瓶颈越来越突出。这时我们发现,我们的网站演进到现在,交易、商品、用户的数据都还在同一个数据库中。然而在这个巨大而且臃肿的数据库中,表和表之间的数据很多是没有关系的,也不需要JOIN操作,理论上就应该把它们分别放到不同的服务器,即垂直分库。


图3 垂直分库

随着业务的不断增长,我们发现交易、商品、用户这些库都变得巨大无比,单机数据库已经无法满足业务的继续增长,这时可以考虑对这些表进行水平拆分,即同一个表中的数据拆分到两个甚至多个数据库中。以用户表为例,数据可以根据userid的奇偶来确定数据的划分。把id为奇数的放到DB1,为偶数的放DB2。



图4 水平分表



开源中间件解决方案及其存在的问题

读写分离、垂直拆库、水平分表作为大型网站后台的刚需,市面上有很多中间件可以满足,比较有代表性的有:阿里巴巴的Cobar、MyCAT。然而这些开源中间件都存在以下缺点:

配置复杂

  1. 基于开源中间件对一张大表进行水平拆分需要以下六步操作:
  2. 部署数据库节点
  3. 安装和部署中间件软件(多个)
  4. 登录到各数据库节点,创建子表
  5. 把子表的信息,配置到每个中间件的配置文件,然后启动
  6. 用HAProxy等负载均衡收敛中间件IP,对外提供一个IP
  7. 业务正式访问

运维极其不便

基于开源中间件对系统进行扩容需要进行以下几步:


图5 开源中间件系统扩容

开源中间件使用和运维的复杂性给业务发展造成了非常大的压力,无形中为企业发展带来了很大的负担。

0 0
原创粉丝点击