关系型数据库横向扩展的三种方法

本文是 Oracle Coherence 3.5一书,第一章: Achieving Performance, Scalability, and Availability Objectives,第二节:Achieving scalability中,数据库横向扩展部分的读书笔记。

传统的关系型数据库很难扩展,通常是纵向扩展,但到达一定程度时只能横向扩展。

数据库的横向扩展支持三种方法,即主从复制,集群和分片(sharding)。

主从复制

主从复制(Master-slave replication),最易配置,对应用改动最小,并可以减轻主库的负担。

主数据库可以读写,从数据库只读。最常用的场景就是实现读写分离,或业务分离,即运行报表,备份,数据仓库等应用。

这种方法的问题是主与从之间数据非完全同步,可能会读到两个不同的版本。另一个问题是,如果只有主库接受读写,那么主库迟早会过载,因此不算是真正的scale out。

不过主从库数据的延迟,有的业务是可以接受的。另外,利用一些实时复制的工具如GoldenGate,从库也是可以写的,这时可以利用从库做其它的业务,从而达到横向扩展的目的。这也算是主从复制的一个新趋势。

集群(Clustering)

集群也称为shared everything或shared disk架构。最知名的就是Oracle RAC。

1个数据库可以有多个实例,来访问共享存储上的数据库。

每一个节点都可以读写,从应用角度来看,代码无需改变。负载均衡也是自动的。

集群存在的问题包括:

* 写数据时需要内存中数据的同步,数据加速带来竞争,影响扩展性

* 难以设置和管理

* 由于存储是共享的,读操作也不能无限扩展

集群适合于读密集的应用,如数据仓库和BI。

分片(Sharding)

分区(Partition)是库内的,分片(Sharding)是库外的,也叫分表分库, 是shared nothing的架构。

Sharding即将一个大的库拆分成很多小库。如何拆和业务规则有关,可以按用户ID拆,按业务拆。如果需要Join,相关的表需要放到一个库里,避免数据库间的通讯。

Sharding也可以有两种方法,即垂直分区和水平分区。

垂直分区是按业务分,简称为分库,即不同的业务使用不同的库,互不相干。垂直分区到一定程度,也无法扩展,这时需要水平分区。

水平分区则是将一个大表拆分为小表,每个小表位于不同的库。每一个建立相同的schema。如根据主键的hash值来分区。

sharding的不足在于:

* 加大了应用代码的复杂性,需要路由到正确的shard。

* 后期增加shard需要修改应用逻辑,并需要迁移数据

* 查询和聚集(aggregation)不再简单,需要跨库联合操作

* 主数据和参照数据需要复制到所有shard,以避免跨库操作。主数据和参照数据虽然偏静态,但一旦修改,可能会有数据一致性问题。

* 跨库修改需要分布式交易处理,会限制可扩展性。因此应尽量避免。

* 单个shard的失效可能会使整个系统不可用(其实也不一定)。因此通常需要为每个shard再配置HA方案,如主从复制。

尽管有以上不足,分片对于一些大型网站还是广泛使用,如Google, eBay, Facebook, Flickr。

When the pain is great, any medicine that reduces it is good, regardless of the side effects.

这句话有点意思。

当然,还有一些其它一些新的数据库架构可以实现横向扩展,如NoSQL对于OLTP的扩展,Hadoop对于OLAP的扩展。不过已超出本文的讨论范围了。

扩展阅读

时间: 2024-10-25 10:05:04

关系型数据库横向扩展的三种方法的相关文章

MySQL数据库的备份与恢复的三种方法

MySQL数据库的备份与恢复的三种方法 1.利用mysqldump实现从逻辑角度完全备份mysql,配合二进制日志备份实现增量备份 2.利用lvs快照从物理角度实现几乎热备的完全备份,配合二进制日志备份实现增量备份 3.利用percona公司的xrabackup实现完全热备份与增量热备份 实验环境:RHEL5.8 ,SElinux关闭,MySQL是tar包初始化安装版本5.5.28 一.测试环境准备 1.1 mysql的安装就不说了,见http://laoguang.blog.51cto.com

VS中C#读取app.config数据库配置字符串的三种方法(转)

VS中C#读取app.config数据库配置字符串的三种方法(转) http://hi.baidu.com/mindox/item/3278dc352c7ba68fb80c0389 http://www.blogjava.net/keweibo/articles/391207.html 关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDat

SQL SERVER2008及以上版本数据库自动备份的三种方法

方法一:创建一个维护计划对数据库进行备份 方法二:创建一个SQL作业对数据库进行备份 方法三:创建WINDOWS任务计划对数据库进行备份 方法一与方法二其实原理基本相同,都必需开启SQL代理服务,都会调用SQL作业. 方法二与方法三在备份方法上相同,均用到BACKUP DATABASE命令. 具体内容详见我的个人网站,请点击阅读!

Oracle数据库备份与恢复的三种方法

转自blueskys567原文Oracle数据库备份与恢复的三种方法, 2006-10. 有删改 Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份. 导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一. 导出/导入(Export/Import) 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去. 1. 简单导出数据(Export)和导入数据(Import) Oracle支持三种方式类型的

DataTable数据批量写入数据库三种方法比较

DataTable数据批量写入数据库三种方法比较 标签: it 分类: C#1)   insert循环插入:2)   sqldataadapter.update(dataset,tablename);3)   sqlbulkcopy.WriteToServer(datatable); 1.生成测试的datatable表,表结构如下:UniqueID(主键,自动增长)   |   CompanyName   |   CompanyCode   |   Address   |   Owner   |

三种方法查看MySQL数据库的版本

1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xampp\mysql\bin>mysql --version 2.使用--?参数 其实这个有三个类似的参数 --help -I(大写的i) -? 这三个都是查看帮助信息的参数 使用方法: D:\xampp\mysql\bin>mysql -? 或者 D:\xampp\mysql\bin>mysq

mysql数据库改名的三种方法

前不久去面试,被问到Innodb引擎的表如何改数据库名,当时我也只回答了MyISAM改如何操作,被一些细节问题打败,真是操蛋. 如果表示MyISAM那么可以直接去到数据库目录mv就可以. Innodb完全不行,自己测试过,会提示相关表不存在. 第一种方法: RENAME database olddbname TO newdbname 这个是5.1.7到5.1.23版本可以用的,但是官方不推荐,会有丢失数据的危险 第二种方法: 1.创建需要改成新名的数据库.2.mysqldum 导出要改名的数据库

EntityFramework 更新数据库字段的三种方法

例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public TestDbContext() : base() { } } public class Test { public long ID { get; set; } public string Name { get; set; } public string Email { get; set; } public

Mybatis+Mysql插入数据库返回自增主键id值的三种方法

一.场景: 插入数据库的值需要立即得到返回的主键id进行下一步程序操作 二.解决方法: 第一种:使用通用mapper的插入方法 Mapper.insertSelective(record): 此方法:插入一条数据,只插入不为null的字段,不会影响有默认值的字段支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长 controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用