数据库的可伸缩性的探索

来源:互联网 发布:云南移动软件下载 编辑:程序博客网 时间:2024/04/27 13:33

数据库的可伸缩性的探索

Authorskate

Time2009-5-30


 

 

 

数据库在当今社会越来越重要,尤其对于一个发展迅速的企业,其数据是爆炸式的发展,为了适应其数据的发展,对数据库的架构体系设计要求也越来越高,它要可以方便的线形扩展

 

对于数据库的一般优化思路:

 

1.       优化前端的逻辑,把一些不必要的产品功能去掉,并加上一些限制,从而可以空值不必要的数据增长

2.       通过在数据库层面观察sql,可有优化一些性能低效的sql,以达到减少对iops的冲击

3.       对适当的业务点加上cache,以减少对数据库访问

4.       如果以上三种方式还不能解决,那就要考虑数据库的并行,例如oracle RAC,可能通过增加硬件服务器来进一步解决数据库的压力问题。但这种方式有个特点,就是采用共享存储,不是无限制的增加服务器就可以缓解数据库的压力(数据库的存储也是有限制的)

 

通过以上方式的修改,可以缓解数据库的压力,其实所谓数据库的压力,主要是在磁盘读取上(磁盘的性能发展要比cpu,内存等慢很多)

 

当数据库的存储成为瓶颈的时候,就要考虑进一步的优化方法:

1.       更换更快的存储(最好用内存支撑iops),以达到提高磁盘iops性能

2.       库的读写分离,可能让我们可以有针对性的优化,因为写操作会对数据产生排他锁阻塞其他回话的读;我可以在读操作前端加上cache,这样用户的读操作的响应时间会大大提高

3.       采用分库的方法,可以把一个库的压力分担在若干不同的库上;这种方法很适用数据爆增的系统,只需要增加硬件就可以线性的解决性能和存储的问题;如果考虑以后增长会很快,可在在分库中增加分表;在分库的基础上可以在按功能或其他方式在分库

 

 

分库的几个原则:

 

#1:按功能分割

#2:水平切分

#3:避免分布式事务

#4:用异步策略解耦程序

#5:将过程转变为异步的流

#6:虚拟化所有层次

#7:适当地使用缓存

 

 

分库有个问题

 

1.       如何分库,按这什么规则什么标准分

2.       分库之间如何保证数据的一致性

3.       如何跨库meragesort

4.       如何做数据修正

5.       如何保证分库之间的数据唯一

 

 

blog为例

 

要把数据库表按着publicprivate区分,按用户说,哪个是用户私有的,哪些是用户共享的

 

方法一:

1.       如果public的表单独放在一个库里

2.       private按用户id分,如每100万用户为一个分库

优点:对于public的相关数据的修正维护很方便,

缺点:会增加分布式的事务,增加跨库操作,而且库之间的耦合度也会增加

 

方法二:

publicprivate和表都分别放在分库中,public的表通过触发器等方法同步

 

有单独的一个库用于触发维护其他的分库;假如有个分库的public数据变化,就会触发维护库来更新其他所有的库,这就可以保证数据的一致性

 

还要有一个配置库(路由库):用以判断选在哪个库的哪个表,配置库要有配置表,用于配置分库,分表的规则和查询路由;这个也可以放在中间件里,让中间件判断选择使用哪个库,哪个表

 

 

 

以上是个人的一点看法,希望能和这方面大师请教!!

 

参考文档:

 

http://rdc.taobao.com/blog/dba/html/266_mysql_fenbu_architecture.html

 

http://www.infoq.com/cn/articles/ebay-scalability-best-practices

----end-----

原创粉丝点击