`
uule
  • 浏览: 6358403 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

读写分离

 
阅读更多

百度百科-读写分离

数据库的读写分离(注意评论)

数据库的读写分离-CSDN

主从复制中不可避免的由于延迟导致的业务逻辑问题,如何处理?

 

Mysql数据库读写分离数据同步配置 

MySQL数据库读写分离配置

 

 

双机热备

为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改查业务的生产服务器;第二台数据库服务器,仅仅接收来自第一台服务器的备份数据

 

读写分离:

主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),从数据库处理SELECT查询操作。

数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

 

简单的说就是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性

 

读写分离诞生原因:

1、为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改查业务的生产服务器;第二台数据库服务器,仅仅接收来自第一台服务器的备份数据意,不同数据库产品,第一台数据库服务器,向第二台数据库服务器发送备份数据的方式不同。当第一台数据库崩溃后,第二台数据库服务器,可以立即上线来代替第一台数据库服务器,并且,在第一台数据库服务器崩溃后,宝贵的数据,依然会存在于第二台数据库服务器里(根据目前业界的备份数据发送方式来看,当第一台数据库崩溃后,第一台数据库里的仍然会有少量的新数据,没能来得及被发送到第二台数据库服务器,所以,这部分数据就丢失了)。

2、 一般来说,为了配置方便,以及稳定性,这两台数据库服务器,都用的是相同的配置(思考一下,如果两台服务器的配置不同,会导致什么结果)。

3、从上文的描述中,大家能看到,在实际运行中,第一台数据库服务器的压力,远远大于第二台数据库服务器。因此,很多人希望合理利用第二台数据库服务器的空闲资源。那么,第二台数据库服务器能做些什么事情呢?

4、从数据库的基本业务来看,数据库的操作无非就是增删改查这4个操作。但对于“增删改”这三个操作,如果是双机热备的环境中做,一台机器做了这三个操作的某一个之后,需要立即将这个操作,同步到另一台服务器上。单向的同步,不复杂。但如果两台机器都需要向对方进行同步,那逻辑就非常复杂,而且还会大大降低性能。(从保证ACID特性的角度,思考一下为什么双向同步会非常复杂且低性能?而单向同步却不会?)出于这个原因,第二台备用的服务器,就只做了查询操作。进一步,为了降低第一台服务器的压力,干脆就把查询操作全部丢给第二台数据库服务器去做,第一台数据库服务器就只做增删改了。

5、到这一步,就实现了所谓的读写分离。这样做,缺点也非常明显了。本来第二台数据库服务器,是用来做热备的,它就应该在一个压力非常小的环境下,保证运行的稳定性而读写分离,却增加了它的压力,也就增加了不稳定性因此,读写分离,实质上是一个在资金比较缺乏,但又需要保证数据安全的需求下,在双机热备方案上,做出的一种折中的扩展方案。

 

 优缺点

  (1)数据的实时性差 : 数据不是实时同步到自读服务器上的,当数据写入主服务器后,要在下次同步后才能查询到(负载均衡集群是实时同步的,集群的同步过程是在事务环境下并发完成的)

  (2)数据量大时同步效率差单表数据量过大时插入和更新因索引,磁盘IO等问题,性能会变的很差。

  (3)同时连接多个(至少两个)数据库:至少要连接到两个数据数据库,实际的读写操作是在程序代码中完成的,容易引起混乱

  (4)读具有高性能高可靠性和可伸缩:只读服务器,因为没有写操作,会大大减轻磁盘IO等性能问题,大大提高效率;

只读服务器可以采用负载均衡,主数据库发布到多个只读服务器上实现读操作的可伸缩性。

 

 

(注意,不同数据库产品,第一台数据库服务器,向第二台数据库服务器发送备份数据的方式不同

mysql只要是通过二进制日志来复制数据。通过日志在从数据库重复主数据库的操作达到复制数据目的。这个复制比较好的就是通过异步方法,把数据同步到从数据库。

show master STATUS

 

show slave STATUS

 

 

问题1:

mysql怎么样通过二进制日志来复制数据,同步数据的? 假如往主数据库删除数据时再返回记录列表,会不会存在从用来读的数据库数据还没有删除的情况?

 

答:

所谓的日志复制就是告诉读服务器主服务器做了哪些操作。然后读服务器按照日志也做一遍。延迟是肯定的。属数据库同步无论如何快,也有一个过程。只要这个延迟在可以接受的范围之内就可以。

“假如往主数据库删除数据时再返回记录列表,会不会存在从用来读的数据库数据还没有删除的情况?”

这种情况就是在一个服务器上也会出现的。除非你把事务等级调整到串行读。

 

做读写分离的时候,延迟的想象肯定是存在的,并且有时候还会出现同步失败,需要通过补偿机制来保证数据的完整性,这个时候延迟就更明显了,所以一般实际应用过程中,对于数据的实时性和正确性要求很强的业务点,写库应该同时作为数据基准库,直接从写库读取数据,而读库的职责只是分担大部分的实时性要求不高的业务点的读操作而已吧?

 

其实延时数秒对提交非实时订单之类的应用并没什么关系。比如你去网站买书。你提交订单后系统只是告诉你订单已经被提交,正在处理。初步处理后可以在历史记录里看到。那么你看这条信息的时间就有好几秒。那么后台异步只要在这几秒后能让你看到,对你来说没有任何延时。

不同系统对延时的要求是不同的,有些要求非常快的系统对存储速度的要求非常高,但是这些系统毕竟是少数。觉大多数系统对一定的系统延迟都是可以接受的。

 

问题2:

主从复制中不可避免的由于延迟导致的业务逻辑问题,如何处理?

答:

如果比较着急的地方可以直接读主库,不着急的地方读从库

 

由于主从复制的局限性,你可以死命的提高从的性能,无限扩展从的配置,但也不能做到一点都不延迟。能不能在业务层面上想想办法,比如两次交易的时间差有个限制啥的。

 

实时性强的不应该用主从,应该是集群

 

实时性要求不是那么严格的时候,复制完全可以满足要求。通常在网络环境和事务大小都比较好的情况下,复制的延时是完全感觉不到的。

可以在SHOW SLAVE STATUS里面查看主从的延时

 

比如你在CSDN上面发了个帖子,3秒后转到本帖子。这样的情况各大论坛都这样的。3秒,足够把主的数据写到从上面了

在机房的服务器都是1000M以上带宽,网络不存在延时,把从机器的硬件配置加上去,CPU和内存也不存在延时。

 

1) 关键业务查主机(你要求的转入帖子查看页面)

2) 分布数据库解决查主机引起的性能下降

 

 

 

 

 

分享到:
评论

相关推荐

    oracle读写分离(中间键Mycat)

    Oracle数据库的读写分离是一种优化策略,用于提升大型系统中数据处理能力,通过将读操作与写操作分离到不同的数据库实例上,实现高并发场景下的性能优化。在本配置文档中,我们将关注如何利用Mycat中间键实现Oracle ...

    C# Redis数据库读写分离

    在IT行业中,数据库读写分离是一种常见的优化策略,主要用于提高系统的并发处理能力和数据读取效率。Redis作为一款高性能的键值存储系统,被广泛应用于缓存、消息队列等场景。在C#环境下,我们可以利用各种客户端库...

    mysql与mycat的读写分离

    ### MySQL与Mycat的读写分离 #### 一、MySQL主从配置 在了解如何实现MySQL与Mycat的读写分离之前,首先要掌握如何配置MySQL的主从复制。这是实现读写分离的基础。 ##### 开启MySQL主从数据复制 主从数据复制通过...

    springboot实现mysql的读写分离的案例源码

    读写分离就是对于一条SQL该选择哪一个数据库去执行,至于谁来做选择数据库这件事,有两个,要么使用中间件帮我们做,要么程序自己做。一般来说,读写分离有两种实现方式。第一种是依靠中间件MyCat,也就是说应用程序...

    springBoot+mybatis读写分离(AOP)

    在IT行业中,数据库读写分离是一种常见的优化策略,特别是在高并发场景下,它能有效提升系统的性能和稳定性。本文将详细讲解如何利用Spring Boot、MyBatis和AOP(面向切面编程)来实现这一技术。 首先,让我们理解...

    mysql_双主+keepalived读写分离.docx

    MySQL 双主 + Keepalived 读写分离解决方案 MySQL 双主 + Keepalived 读写分离是一种高可用性解决方案,旨在解决 MySQL 单点故障问题。该方案通过双主 MySQL 实现高可用性,并使用 Keepalived 实现虚拟 IP(VIP)...

    springboot+mysql读写分离

    springboot结合mysql主从来实现读写分离 一、实现的功能 1、基于springboot框架,application.yml配置多个数据源,使用AOP以及AbstractRootingDataSource、ThreadLocal来实现多数据源切换,以实现读写分离。mysql...

    【ASP.NET编程知识】.NET Core实现分表分库、读写分离的通用 Repository功能.docx

    .NET Core 实现分表分库、读写分离的通用 Repository 功能 .NET Core 实现分表分库、读写分离的通用 Repository 功能是指使用 FreeSql.Repository 库来实现通用的仓储层功能,实现了基础的仓储层(CURD),并且支持...

    spring mysql 读写分离

    在企业级应用中,数据库的读写分离是一种常见的优化策略,它可以提高系统的并发处理能力,减轻主数据库的压力,确保数据的稳定性和可用性。Spring框架提供了对MySQL数据库读写分离的良好支持,使得开发者能够轻松地...

    使用sharding-jdbc快速实现自动读写分离-demo源码

    在IT行业中,数据库读写分离是一种常见的优化策略,它能够有效地提高系统的并发处理能力和响应速度。Sharding-JDBC是阿里巴巴开源的一款轻量级Java框架,它可以在不改变业务代码的前提下,帮助我们快速实现数据库的...

    MyBatis做读写分离

    ### MyBatis 实现读写分离 #### 一、读写分离的概念与优势 在数据库设计与应用领域,“读写分离”是一种常见的架构模式,它通过将数据读取操作和写入操作分配到不同的数据库服务器上来提高系统的整体性能。这种...

    mycat 读写分离 优化

    ### MyCAT 读写分离优化详解 #### 一、前言 ##### 1.1 编写目的 本文档旨在探讨MyCAT读写分离模式下的智能优化方案,并分享实际应用场景中的经验教训。随着数据量的增长及业务复杂度的提升,单一数据库往往难以...

    数据库双活容灾和读写分离典型方案

    数据库双活容灾和读写分离是一种数据库架构设计,旨在提供数据高可用性、灾难恢复能力和高效的数据库访问性能。SQL SERVER数据库作为常见的商业关系型数据库管理系统,其双活容灾和读写分离方案具备以下关键知识点:...

    服务读写分离架构

    ### 服务读写分离架构分析 #### 一、引言 在互联网架构设计中,针对高并发场景,读写分离是一种常见的策略。该策略旨在通过将读操作与写操作分离来提高系统的整体性能和可用性。然而,并非所有的场景都适合采用...

    mysql 读写分离软件

    MySQL 读写分离是数据库架构优化中的一个常见策略,它主要应用于高并发、大数据量的系统中,以提高数据库系统的性能和可用性。在这种架构下,数据库被分为两部分:主库(Master)负责处理所有的写操作(INSERT、...

    springboot 实现mysql读写分离

    在IT行业中,数据库读写分离是一种常见的优化策略,特别是在高并发和大数据量的场景下,以提高系统的性能和可用性。本教程将详细介绍如何利用SpringBoot框架实现MySQL的读写分离,以及涉及到的相关技术。 首先,...

    springaop多数据库读写分离

    在IT行业中,数据库读写分离是一种常见的优化策略,主要用于提高系统的并发处理能力和数据读取效率。Spring AOP(面向切面编程)与MyBatis框架的结合应用,可以帮助我们实现这一目标。以下将详细讲解如何利用Spring ...

    一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案,具有零依赖、零学习成本、零业务代码入侵

    标题中的“一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案”指的是一种在Entity Framework Core(简称ef-core)框架下的数据库管理工具或库,旨在优化数据库性能并实现读写分离。Entity Framework Core...

Global site tag (gtag.js) - Google Analytics