数据库优化方法
一、主从复制
Mysql主从复制是一台服务器充当主服务器,另一台或多台服务器充当从服务器,主机自动复制到从机。对于多级复制,数据服务器即可充当主机,也可充当从机。Mysql复制的基础是主服务器对数据库修改记录二进制日志binlog,从服务器通过主服务器的binlog自动执行更新。
为何会出现主从分离?为了满足特定业务的特点,如主库集中写、从库零散读,实现了请求的读写分离。将读写拆分后效率肯定比在一台机器上读写效率要高。
二、读写分离(集中写、零散读)
读写分离(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 还是 Insert,update,Delete操作 ,根据操作性质按照负载均衡算法选择 适合的数据库连接字符串。 注意事项二: 多个只读从库,在接收到大量读操作时,需要使用算法,把这些读负载均分到各个只读库上。 1 平均负载算法:( 把读操作平均分到每个只读库上去) 2 权重轮询调度算法:使用了权重的方法来让性能优良的机器分到更多的任务来均衡整个方案的性能,即权重轮询调度算法。 3 其他算法。 不论使用什么算法,其目的就是一个:把查询请求分散到多个只读库上去。 注意事项三: 当用户向主库写入数据时,数据保存成功后,还没分发复制到从库时,需要有一个保障机制:即当用户在查看刚才操作的数据时,能正常访问,而不是找不到数据。 比如:1 刚保存了一条记录,可以延时2秒,然后再查询这记录(保证这条记录被分发到只读从库时再查询)。 2 保存了记录后,在N秒内先查主库,如果超过N秒,就从丛库里查询。 总之: 不论是主库还是从库,必须保证数据有时,查询才有效。 注意事项四: SqlServer: 数据库可以采用发布者-订阅模式 来实现主库的数据分发到只读从库。 MySQL: 据说可以使用Mysql代理 Oracle : 注意事项五: 做好读写分离开关,确保在需要时才启用读写分离。 读写分离好处: 降低了数据库访问负载压力。 坏处: 需要很多资源;主从数据库数据的一致性问题;
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践(转)
三、分库分表
分库分表是分散数据库压力的好方法。分表,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。
集中写,零散读后,集中写后写的压力仍很大,则需要进一步进行优化,可使用分库分表。拆分表主要目的就是要将其放在不同的数据库上。因此,分库的前提是分表。
分库分表后,就可实现真正意义上的读写分离。
从向分表与横向分表,就是指的分库分表。
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
四、参数优化
在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)
参考资料