数据库中间件简述
为什么需要数据库中间件
普通应用程序和数据库的访问如下图:
当出现下列问题时:
- 数据库存储的量不是很大,但是并发的读写操作都很大时,超过数据库的处理能力了。
- 应用的业务模块很多,总的数据量很大,并发的处理操作均超过单个数据库服务器的处理能力。
- 如果单个表的数据量很大,超过了单表的存储上限,如商品表、订单表等。
为了解决数据存储、访问性能我们需要用到数据库中间件。数据库中间件可以让我们在应用程序中快速的应用读写分离、分库分表,并且如果要是想让我们写代码时不需要关注数据库是不是进行了读写分离,所以需要隔离这些下端的数据库读写分离带来的变化屏蔽掉对上端的影响,就需要加数据库访问模块即数据库中间件。
数据库中间件设计要点
- 要能解析SQL
- 能支持读写分离
- 能支持从库读的负载均衡
- 支持分库操作
- 支持分表操作
- 支持跨库关联查询
- 对事务处理的支持
- 主键ID生成
- 数据源管理
数据库的拆分
数据库拆分主要分为垂直拆分、水平拆分
垂直拆分
按业务模块进行垂直拆分
优点:
- 拆分之后业务清晰,拆分规则明确
- 系统之间整合和扩展容易
- 数据维护简单
缺点:
- 部分业务表无法jion,只能通过接口方式解决,提高了系统的复杂度
- 每种业务不同的限制存在单库性能瓶颈,不易数据库的扩展和性能提高
- 事务处理复杂
水平拆分
对海量数据进行分库分表的存储
优点:
- 拆分规则抽象好,join操作基本可以数据库做
- 不存在单库数据量大,高并发的性能瓶颈
- 应用端改造少
- 提高了系统的稳定性跟负载能力
缺点:
- 拆分规则难以抽象
- 分片事务一致性难以解决
- 数据库多次扩张跟维护量极大
- 跨库join性能较差
水平对数据进行拆分最重要的是分片规则 – 拆分规则
可以如何来进行拆分?
- 范围:时间、数值
- 列表:按地域、按组织、分类
- 散列:hash(某个字段)%分片数、一致性hash
- 复合多种方式
分库分表的技术难点
无论是垂直拆分、水平拆分都有共同的技术难点:
- 引入分布式事务的问题
- 跨节点join问题
- 跨节点和平排序分页的问题
- 多数据源管理的问题
这将是我们考量数据库中间件需要关心的主要问题。
数据库中间件的两种实现模式
客户端模式
客户端模式是在应用程序中集成数据库中间件模块,通过该模块来配置管理应用需要的一个(或者多个)数据源,以及访问各个数据源,在模块内完成数据整合。(在小的系统中可以使用该模式,当系统过于庞大时尽量避开该模式,因为每个程序都要配置中间件模块难以进行管理并且繁琐)
服务端模式
服务端代理模式,通过中间件代理层来统一管理所有的数据源,后端数据库集群对前端应用完全程序透明,同时易于数据库扩展。独立的服务能提供更强大的处理能力.适用于大型复杂的系统。