sharding 介绍


用sharding技术来扩展你的数据库(一)sharding 介绍

发表于:2011年10月27日  18:02 转发 19

EMC中国研究院大数据组研究员 郭小燕

​摘要:

数据库的sharding技术作为一个“新瓶装旧酒”的概念,在新的应用环境中被赋予了新的意义。随着云计算的发展,sharding在最近几年是越来越火热,越来越多的产品开始声称自己支持sharding功能。那么到底什么是sharding,sharding到底能为你的数据库应用带来哪些好处。另外最重要的,如何实现一个sharding系统,有哪些sharding算法可供选择。本文将为你解决这些问题。


 

一. 简介


 

1. 背景


 

数据库的扩展是一个永恒的话题。对于传统的关系数据库,采用的是纵向扩展(Scale Up)的方式,即买更好的机器添加更多的资源来取得更好的性能(如硬件升级、更快更多的CPU、更大的内存、更多更大的磁盘等)。而形式上采用的是并行数据库、分布式数据库的模式,具体细节依赖水平分区或者垂直分区的技术。关系数据库通过ScaleUp方式已在传统的企业应用环境中统治了将近三十多年。


 

但是近年来随着数据量的暴增尤其是云计算模式的出现,这种扩展模式对于某些应用已经不太适合,这时便出现了横向扩展(Scale Out)模式。这种方式采用一些Ad-hoc的技术,比如说对数据库进行主从配置(Master-Slave)、采用数据库复制(Replication)技术以及服务器的缓存(Server Cache)等,来将负载分布到多个物理节点上去。另外sharding技术也逐步发展,并在近年来吸引了众人的眼球。


2. 什么是Sharding


Sharding 是把数据库Scale Out到多个物理节点上的一种有效的方式。Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseShard)。将整个数据库打碎的过程就叫做sharding,可以翻译为分片。


形式上,Sharding可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个shard,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。一个shard可以包含多个表的内容甚至可以包含多个数据库实例中的内容。每个shard被放置在一个数据库服务器上。一个数据库服务器可以处理一个或多个shard的数据。系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的shard或shards节点上去执行。


用sharding技术来扩展你的数据库(一)sharding 介绍

 

3. Sharding与分区的比较


Sharding与分区有着千丝万缕的联系,它们所采取的技术本质上是类似的,可以说sharding的概念就是由分区而来。在某些情况下sharding可能指的就是水平分区。另外有些文档中使用了fragment(也是碎片的意思)的术语(在并行数据库中的这些分区称为partition,在分布式数据库中则称为fragment)。\ref footnote 1


Foot note 1:

[[

Daniel C. Zilio. Physical Database Design Decision Algorithms and ConcurrentReorganization for Parallel Database Systems. PhD thesis 1997.

M. Tamer Özsu, Patrick Valduriez. Principles ofDistributed Database Systems, Third Edition. Springer. 2011

]]


但是我们所说的sharding和分区还是有很大区别的。下面罗列一下:


(1)扩展方式不同。Sharding属于scaleout,而分区则属于scale up方式。

(2)目的不同。分区的目的是为了将一个查询进行并行处理,这样所有的节点能并行处理一个查询;而sharding是让每个节点尽量处理不同的查询。

(3)应用场景:分区适用与传统的企业应用,尤其是OLAP的应用,基本上每个查询都需要访问大部分的数据;而sharding适用于云Web应用,特征是有大量的用户和查询,但是每个查询访问到的元组是非常少的,sharding可以将负载分散到多个物理节点上。

(4)可用性:对于分布式数据库基本上每个查询都需要所有的节点参与,如果某些节点down掉后,系统会大受影响;而sharding所处理的应用一般只涉及到少数几个节点,所以可用性上sharding要好一些。另外分布式数据库需要有一个主节点来生成执行计划并协调相关节点执行等,很容易形成单点瓶颈。

(5)分割粒度:分区一般只针对于一个数据库内部进行分割;而sharding可以以数据库为粒度进行分割,因此可用来构建多租房数据库系统(multi-tenantdatabase)。


4.Sharding的优点


对于Sharding来说,主要有以下主要的优点:


(1)提高了数据库的可扩展性,可以随着应用的增长来增加更多的服务器,只需要将新增加的数据以及负载放到新加的服务器上就可以。

(2)提高了数据库的可用性。其中几个shard服务器down掉之后,并不会使整个系统对外停止服务,而只会影响到需要访问这几个shard服务器上的数据的用户。

(3)小的数据库的查询压力比较小,查询更快,性能更好。

(4)系统有更好的可管理性。对系统的升级和配置可以按照shard一个一个来做,并不会对服务产生大的影响。

 

http://qing.blog.sina.com.cn/tj/88ca09aa330004tp.html 



ShardingJDBC是一个基于Java的分库分表中间件,可以有效地实现数据的水平拆分和分布式部署。下面我们以一个简单的示例来介绍一下ShardingJDBC的用法。 首先,我们需要在pom.xml文件中添加ShardingJDBC的依赖: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>4.1.1</version> </dependency> ``` 接下来,我们需要在数据库中创建两个表user_0和user_1,并插入一些测试数据。然后,我们可以编写一个简单的Java应用来使用ShardingJDBC来操作这些数据。 ```java // 配置数据源 DataSource dataSource = // 根据具体数据库配置数据源 // 配置ShardingJDBC规则 ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(new TableRuleConfiguration("user", "ds${0..1}.user_${0..1}")); // 创建ShardingJdbcTemplate ShardingDataSource shardingDataSource = new ShardingDataSource(dataSource, shardingRuleConfig); ShardingJdbcTemplate jdbcTemplate = new ShardingJdbcTemplate(shardingDataSource); // 插入数据 jdbcTemplate.update("INSERT INTO user (id, name) VALUES (?, ?)", 1, "Alice"); // 查询数据 List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user"); // 输出查询结果 for (Map<String, Object> row : result) { System.out.println(row); } ``` 在这个示例中,我们首先配置了数据源和ShardingJDBC规则,然后使用ShardingJdbcTemplate来执行SQL操作。通过这个简单的示例,我们可以看到ShardingJDBC的用法非常简单,可以轻松地实现数据的分库分表操作。希望这个示例对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值