kongzhongqijing

数据库优化方法

一、主从复制

  Mysql主从复制是一台服务器充当主服务器,另一台或多台服务器充当从服务器,主机自动复制到从机。对于多级复制,数据服务器即可充当主机,也可充当从机。Mysql复制的基础是主服务器对数据库修改记录二进制日志binlog,从服务器通过主服务器的binlog自动执行更新。

  为何会出现主从分离?为了满足特定业务的特点,如主库集中写、从库零散读,实现了请求的读写分离。将读写拆分后效率肯定比在一台机器上读写效率要高。

Mysql主从复制配置

mysql主从复制

 

二、读写分离(集中写、零散读)

  读写分离(Read/Write Splitting)”,基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提 供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。mysql只要是通过二进制日志来复制数据。通过日志在从数据库重复主数据库的操作达到复制数据目的。这个复制比较好的就是通过异步方法,把数据同步到从数据库。

      主数据库同步到从数据库后,从数据库一般由多台数据库组成这样才能达到减轻压力的目的。读的操作怎么样分配到从数据库上?应该根据服务器的压力把读的操作分配到服务器,而不是简单的随机分配。mysql提供了MySQL-Proxy实现读写分离操作。不过MySQL-Proxy好像很久不更新了。oracle可以通过F5有效分配读从数据库的压力。Quest SharePlex就是比较牛的同步数据工具,听说比oracle本身的流复制还好。

    读写分离现在被大量应用于很多大型网站,这个技术也不足为奇了。ebay就做得非常好。ebay用的是oracle,听说是用Quest Share Plex 来实现主从复制数据。

 

为什么需要读写分离?

简单来说 数据访问量大,读写都在一个库时,当执行写操作时,会把记录锁定,行在读时会被锁定。

定义一个主库 负责写操作(CUD),而其他从库负责(Read) 操作。

注意事项一:

对每次的sql语句检查下是select 还是 Insertupdate,Delete操作 ,根据操作性质按照负载均衡算法选择 适合的数据库连接字符串。

注意事项二:

多个只读从库,在接收到大量读操作时,需要使用算法,把这些读负载均分到各个只读库上。

1 平均负载算法:( 把读操作平均分到每个只读库上去)

2 权重轮询调度算法:使用了权重的方法来让性能优良的机器分到更多的任务来均衡整个方案的性能,即权重轮询调度算法。

3 其他算法。

不论使用什么算法,其目的就是一个:把查询请求分散到多个只读库上去。

注意事项三:

当用户向主库写入数据时,数据保存成功后,还没分发复制到从库时,需要有一个保障机制:即当用户在查看刚才操作的数据时,能正常访问,而不是找不到数据。

比如:1 刚保存了一条记录,可以延时2秒,然后再查询这记录(保证这条记录被分发到只读从库时再查询)。

     2 保存了记录后,在N秒内先查主库,如果超过N秒,就从丛库里查询。

总之: 不论是主库还是从库,必须保证数据有时,查询才有效。

注意事项四:

SqlServer: 数据库可以采用发布者-订阅模式  来实现主库的数据分发到只读从库。

MySQL:  据说可以使用Mysql代理

Oracle :

注意事项五:

做好读写分离开关,确保在需要时才启用读写分离。

读写分离好处: 降低了数据库访问负载压力。

坏处:  需要很多资源;主从数据库数据的一致性问题;

 

数据库读写分离

数据库读写分离的性能分析

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践(转)

 

三、分库分表

分库分表是分散数据库压力的好方法。分表,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。

集中写,零散读后,集中写后写的压力仍很大,则需要进一步进行优化,可使用分库分表。拆分表主要目的就是要将其放在不同的数据库上。因此,分库的前提是分表。

分库分表后,就可实现真正意义上的读写分离。

 
1,分表的分类
1>纵向分表
将本来可以在同一个表的内容,人为划分为多个表。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的。)
分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的)
案例:
对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。
这样纵向分表后:
首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
其次,对冷数据进行更多的从库配置,因为更多的操作时查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。
2>横向分表
字面意思,就可以看出来,是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2 等。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。
分表理由:根据数据量的规模来划分,保证单表的容量不会太大,从而来保证单表的查询等处理能力。
案例:同上面的例子,博客系统。当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。

 

从向分表与横向分表,就是指的分库分表。

 

数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器

分库分表

淘宝下单高并发解决方案 

分库分表带来的完整性和一致性问题

 

四、参数优化

在my.cnf文件中对各参数优化。常见优化参数如下:

key_buffer_size、table_open_cache、read_buffer_size、read_rnd_buffer_size、

Innodb_buffer_pool_size、Innodb_log_buffer_size、Innodb_flush_log_at_trx_commit、Innodb_log_file_size、

query_cache

查看参数时命令如show variables like \'%query_cache%\';

 

五、数据分离

数据分离,定时任务提取。

数据统计平台(比如大社交网站进行日活跃用户数进行统计功能的功能),它可以作为专门的数据统计数据库。实现方式是:从业务库定时抽出数据至数据统计库,查询统计时不查询业务库只查询统计库,并非直接使用查询语句进行查询。最终实现数据分离。

 

有数据库瓶颈时,处理方案有:

1)主从,集群(http://www.cnblogs.com/zhouyz/articles/2151429.html)。

2)增加cache(memcached),如:手机之家新系统介绍及架构分享(http://ordier.iteye.com/blog/145598) 就是在cache层做优化

3)分库分表,又拍网架构(http://www.cnblogs.com/yukaizhao/archive/2012/04/23/taobao_order_design.html) 是以增加数据库,分表分库的方法解决。

4)数据库设计及应用层面上的数据库优化(http://edu.gamfe.com/tutor/d/25957.html

 

 

参考资料

数据库读写分离

数据库读写分离的性能分析 

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践(转)

分类:

技术点:

相关文章: