`
lirig
  • 浏览: 235246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据库的读写分离

阅读更多

      随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状。读写分离现在被大量应用于很多大型网站,这个技术也不足为奇了。ebay就做得非常好。ebay用的是oracle,听说是用Quest Share Plex 来实现主从复制数据。

     读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。Quest SharePlex就是比较牛的同步数据工具,听说比oracle本身的流复制还好,mysql也有自己的同步数据技术。mysql只要是通过二进制日志来复制数据。通过日志在从数据库重复主数据库的操作达到复制数据目的。这个复制比较好的就是通过异步方法,把数据同步到从数据库。

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


ebay的读写分离(网上找到就拿来用了)



 mysql的读写分离
       上面说的数据库同步复制,都是在从同一种数据库中,如果我要把oracle的数据同步到mysql中,其实要实现这种方案的理由很简单,mysql免费,oracle太贵。好像Quest SharePlex也实现不了改功能吧。好像现在市面还没有这个工具吧。那样应该怎么实现数据同步?其实我们可以考虑自己开发一套同步数据组件,通过消息,实现异步复制数据。其实这个实现起来要考虑很多方面问题,高并发的问题,失败记录等。其实这种方法也可以同步数据到memcache中。听说oracle的Stream也能实现,不过没有试过。


 

  • 大小: 24.3 KB
  • 大小: 21 KB
15
1
分享到:
评论
9 楼 lisanshao 2015-05-14  
lirig 写道
davos 写道
其实我想知道的是我们的应用程序应该如何连接这主从数据库呢?

连接很简单的,如果是mysql和原来一样,f5也一样。网上很多资料。有问题单独找我。

这个就是胡说了!如何访主库、从库,这个要在应用上做处理。主从分离的数据起码存在2个数据源。因此,可以通过自己封装对数据库的操作,提供统一的数据库入口。比如,所有查询的请求,提供一个接口请求从库.;所有增删改的请求,提供一个接口请求主库。
8 楼 lirig 2010-04-12  
davos 写道
其实我想知道的是我们的应用程序应该如何连接这主从数据库呢?

连接很简单的,如果是mysql和原来一样,f5也一样。网上很多资料。有问题单独找我。
7 楼 lirig 2010-04-12  
pekkle 写道
很多应用要考虑延时的问题,订单进去了,去历史查看,没看到数据,客服座机每天忙死。宁愿采用分布式分解压力

这个和读写分离没有多大关系,可以单独用服务器来保存历史数据,数据延迟时间要根据业务来定。
6 楼 魔力猫咪 2010-04-09  
pekkle 写道
很多应用要考虑延时的问题,订单进去了,去历史查看,没看到数据,客服座机每天忙死。宁愿采用分布式分解压力

一定需要马上看到吗?你们的系统不会提交一个订单1-2个小时看不到吧。
其实延时数秒对提交非实时订单之类的应用并没什么关系。比如你去网站买书。你提交订单后系统只是告诉你订单已经被提交,正在处理。初步处理后可以在历史记录里看到。那么你看这条信息的时间就有好几秒。那么后台异步只要在这几秒后能让你看到,对你来说没有任何延时。
不同系统对延时的要求是不同的,有些要求非常快的系统对存储速度的要求非常高,但是这些系统毕竟是少数。觉大多数系统对一定的系统延迟都是可以接受的。而且mysql可以通过SemiSyncReplicationDesign补丁支持半同步复制。
5 楼 pekkle 2010-04-09  
很多应用要考虑延时的问题,订单进去了,去历史查看,没看到数据,客服座机每天忙死。宁愿采用分布式分解压力
4 楼 seu_yong 2010-04-04  
做读写分离的时候,延迟的想象肯定是存在的,并且有时候还会出现同步失败,需要通过补偿机制来保证数据的完整性,这个时候延迟就更明显了,所以一般实际应用过程中,对于数据的实时性和正确性要求很强的业务点,写库应该同时作为数据基准库,直接从写库读取数据,而读库的职责只是分担大部分的实时性要求不高的业务点的读操作而已吧?
3 楼 davos 2010-04-02  
其实我想知道的是我们的应用程序应该如何连接这主从数据库呢?
2 楼 魔力猫咪 2010-03-31  
所谓的日志复制就是告诉读服务器主服务器做了哪些操作。然后读服务器按照日志也做一遍。延迟是肯定的。属数据库同步无论如何快,也有一个过程。只要这个延迟在可以接受的范围之内就可以。
“假如往主数据库删除数据时再返回记录列表,会不会存在从用来读的数据库数据还没有删除的情况?”
这种情况就是在一个服务器上也会出现的。除非你把事务等级调整到串行读。
1 楼 flyer2010 2010-03-31  
问老大一个问题:mysql怎么样通过二进制日志来复制数据,同步数据的? 假如往主数据库删除数据时再返回记录列表,会不会存在从用来读的数据库数据还没有删除的情况?

相关推荐

Global site tag (gtag.js) - Google Analytics