shardingsphere(https://github.com/apache/shardingsphere)是一套开源的分布式数据中间件,可以在JDBC层, Proxy层进行SQL路由。 可以完成数据库读写分离, 数据分片等。
数据库库中间件一般会在两个地方:
1. 项目的JDBC层:对项目浸入较小,但是要有对应的SDK, 如果公司项目语言比较多,就需要开发对应的SDK。 因为直通数据库层,所以性能损失小。
2. Proxy:独立部署,对项目完全没有影响,只需要把项目中的DB URL, 改为proxy地址即可,跨语言,但是相比之前要多一次序列化,所以对性能有些损耗,而且Proxy需要做高可用, 部署上会有一些复杂。
shardingsphere对上面两项都支持。作为一个数据库中间件,核心就是SQL路由,同时要考虑的问题其实也很多。
1. 对于JDBC层的中间件,如何对项目低侵入。
2. SQL解析的性能。
3. 批量SQL
4. 如果没有命中分片,如何处理? 结果合并。
5. 事务。
上面的一些问题在shardingsphere中都有体现,具体可以参考源码。
这里多说两句:
1. 读写分离并不能完全按照sql语句的类型进行分离,因为主从数据库之间会有延迟,所以还要有预留扩展可以人为指定路由到哪个数据库。
2. 为了解决单表数据量大和访问压力的问题,我们将数据改为分表分库模式, 分表分库的确可以解决当下的问题,但不是最终的银弹,它也遗留了一些问题,比如当数据量再次达到单表阈值的时候, 我们就要再次扩展。 如果流量暴增,分表分库也出现压力的时候,并没有很好的方式来快速解决问题。业务站点因为无状态,所以很容易做扩展 ,但是数据库上存储数据,并不能很好扩展,而且即使有迁移方案,因为数据量大,迁移速度也并不快。 目前在找一种方案,能够对数据做平滑扩展,能够对数据做rebalance, 目前正在研究TiDB。