在我们的应用里,有一张业务数据表,目前数据量大概在2-3亿,放在oracle的一张表里,并且一般是每年会翻倍,以前一直在同一张表里,前不久我们将他拆分为16个小的数据库(实际上目前只是在同一服务器的不同schema)里,见链接
。因为数据是和会员相关的,因此拆分规则很简单,根据会员计算hash值,然后确定数据拆分到哪一个数据库,这个业务从本上上是没问题的。
在我们的计划里,接下来是要将这张表的数据拆分到64个mysql数据库中去,按照预估,再怎么也能撑几年了,做到这份上,也差不多了,谁让这个世界变化太快呢?
因为采用的是开源的amoeba
方案,对于应用来说,很简单,直接将jdbc驱动换成mysql,链接地址修改一下就ok了,到目前为止非常完美。这是amoeba这个方案带来的好处,就是对应用透明。
但是,在考虑接下来的工作的时候,碰到一些麻烦。主要问题有几点:
*路由的规则是在amoeba服务器上,和业务完全隔离
一开始看来问题不大的,但是和其他团队的交流来看,有时候是需要业务逻辑来参与这个路由的过程的,在amoeba上实现感觉不是很干净
*由于整个表的数据量特别大,往mysql转换的时候时间太长
目前主表大概100多G,往mysql里转的时候由于没有合适的工具,估计只能由应用来做,这个过程比较漫长,这是一个线上的应用,停机去做代价太大了,不停机的话,也比较麻烦,估计只能先把大部分线下转换掉,然后切换的时候短暂停机,做增量的同步,不过这个增量也不小的,还需要仔细评估
因此,我们需要考虑oracle和mysql并存的可行性,这样就可以小部分小部分的转,不管怎样都可以减小风险,但是就目前看来,因为应用里使用到的sql有挺多oracle相关的语法,例如sequence啊,三层嵌套的分页查询之类的,这样看来,对应用透明的oracle/mysql并存方案不大可行
* 我们的应用规模这么大,迟早要服务化,现在的情况是 application -> amoeba -> db,如果再加上一个服务层,就变成了 application -> service -> amoeba -> db,又多了一层,虽然和服务化带来的好处来说,多一层的性能消耗是可以接受的,但是总是不爽
废话了这么多,不得不提一下当时我对拆分这张表的打算:
* 收拢所有访问这张表的DAO API,集中统一管理(这个做了,而且现在也享受到了)
* 将这张表的DAO先做成服务,远程对应用服务,就是 application->service->db
* 在service这一层处理数据拆分的逻辑,为此我还开发了一个原型ibatis-sharding
,基于ibatis提供数据库的sharding方案,理念类似hibernate-shards
在服务这一层来提供数据库拆分方案,和amoeba的方案来说,对比如下:
ibatis-sharding与amoeba解决数据库拆分的对比
feature |
ibatis-sharding |
amoeba |
能实现数据库拆分 |
Y |
Y |
拆分逻辑对应用透明 |
半透明(Service) |
Y |
拆分逻辑的灵活性 |
好 |
一般 |
能方便实现不同数据库并存 |
通过ibatis改进来实现 |
目前无法实现
|
(晕,这个表格怎么没法修改啊,想加一行都不行)
另外,从性能上对比,在服务化的情景下,amoeba是 : application -> service -> amoeba -> dbs,而使用ibatis-sharding,由于ibatis-sharding只是一个类库,是和service部署在一起的,因此是: application->service->dbs,这样反而是使用ibatis-sharding的方案更省一些,而且还能享受到路由规则贴近应用的好处,方便啊,灵活啊,呵呵
总的说来,大部分情况下使用amoeba是第一选择,因为透明,简单,而且性能好,不过在有些场景下,比如路由规则太复杂,需要不同数据库并存,或者是有service层的架构,使用应用层的实现方案可能会更好
分享到:
相关推荐
分库是指将一个大型数据库拆分成多个小型数据库,每个小型数据库负责一部分数据存储,以减少单个数据库的压力。分表则是将一张大表按照一定的规则(如范围、哈希等)拆分成多张小表,分散在不同的数据库或同一个...
数据库分片是将一个大型数据库拆分为多个较小的部分,这些部分称为“分片”,每个分片都驻留在单独的服务器上。这样做的目的是提高查询性能,通过并行处理来分散负载,同时也能在一定程度上提升数据的安全性。Simple...
- 早期互联网公司经历的数据库拆分过程,从单一数据库发展到多主从数据库架构,再到基于区域或哈希的表水平拆分。 7. 其他相关技术: - 数据库复制技术,用于在主数据库和从数据库之间同步数据。 综上所述,...
数据库分片是将大型单一数据库拆分为多个较小、独立的数据库,每个数据库(称为分片)都存储一部分数据。这种方法可以分散负载,提高查询速度,同时允许在不同的硬件上扩展存储和处理能力。Go-PG-Sharding项目正是...
数据库分片是一种水平扩展方法,它将单一数据库拆分为多个较小的、相互独立的部分,称为“分片”或“切片”。每个分片存储一部分数据,并有自己的独立数据库实例。这种方法可以提高读写性能、增加可用性和可伸缩性,...
1. 数据库切分: Database Sharding 是一种将大型数据库拆分成多个小的逻辑数据库的技术,以便提高数据库的性能和可扩展性。 2. Hibernate Shards:Hibernate Shards 是一个基于 Java 的开源框架,用于实现数据库...
1. **分库(Database Sharding)**:将整个数据库中的表按照一定的规则拆分成多个子集,并将这些子集分别存储在不同的数据库中。 2. **分表(Table Sharding)**:在同一数据库内部,将一张大表按照一定的规则拆分成...
此时,分库(database sharding)和分表(table sharding)成为有效的解决方案。分库是将数据分散到多个数据库中,而分表则是将一个大表拆分成多个小表,通常在相同的数据库内进行。 在"sharding_demo-master"这个...
- 使用AWS的RDS、Google Cloud SQL或Azure SQL Database等云数据库服务,简化管理和扩展性。 10. **数据库架构演进**: - 微服务架构下,考虑使用数据库连接池和服务间的数据同步策略。 通过对以上知识点的深入...
ShardingSphere 学习...分片是 ShardingSphere 中的一种核心概念,它可以将大型数据库拆分成多个小型数据库,以提高数据库的性能和可扩展性。分片可以根据不同的策略来进行,例如基于时间的分片、基于范围的分片等。
数据库分片是将一个大型数据库拆分为多个小型数据库,每个部分(或“分片”)都存储在不同的服务器上。这样做的好处包括: 1. **负载分散**:每个服务器只需要处理一部分数据,从而减轻单个数据库的压力。 2. **...
**分布式关系型数据库服务DRDS**(Distributed Relational Database Service)是一款由阿里巴巴集团自主研发的分布式数据库产品,其核心技术基础为Sharding on MySQL。DRDS旨在解决传统单机关系型数据库在扩展性和...
1. **分库**:即将一个大数据库拆分成多个小数据库,每个数据库负责一部分数据的存储和管理。这可以有效缓解单个数据库的压力,避免成为整个系统的瓶颈。分库可以通过按业务模块、地理位置或者用户范围等进行划分。 ...
阿里云分布式关系型数据库DRDS(Distributed Relational Database Service)是一种专为大规模并发访问设计的数据库服务,它基于MySQL数据库引擎,旨在解决单机数据库在高并发、大数据量场景下的性能瓶颈问题。...
数据库切分(Database Sharding)作为一种重要的技术手段,被广泛应用于大数据量场景下,其目的是通过将一个大型数据库分割成多个较小的部分来提高系统的可扩展性和性能。 **数据库切分**主要是指将一个大的数据库...
1. **分库(Database Sharding)**:将一个大数据库拆分成多个小数据库,每个数据库负责一部分业务数据。这样可以降低单一数据库的压力,提高读写性能,同时有利于实现高可用性和灾难恢复。 2. **分表(Table ...
##### 3.2 数据库拆分与扩展 - **水平扩展**:DRDS支持通过数据分片(Sharding)技术来实现水平扩展,即数据被均匀分布到多个数据库实例上,从而提高系统的整体处理能力。 - **分库分表**:这是DRDS中的一个重要...
在分布式架构中,MySQL 通过数据拆分(Sharding)技术可以有效地处理海量数据,并实现水平扩展,适用于读写分离和高并发场景。而Oracle 通常用于保存核心数据,提供稳定、可靠的服务,尤其在需要强一致性和高可用性...
1. **数据库分片**:数据库分片是一种将大型数据库拆分为多个较小、更易管理的部分(称为分片)的技术。每个分片可以独立运行,分布在不同的服务器上,从而提高并发处理能力,提升读写速度,降低单点故障风险。 2. ...
数据分片是将大型数据库拆分为多个较小、更易管理的部分,称为“片”或“分片”。在Android应用中,如果一个单一的数据库文件变得非常大,读写操作可能会变得缓慢。通过将数据分布到多个数据库文件或表中,可以提高...