数据库一致性

微服务架构下的数据一致性保证(一)

北慕城南 提交于 2019-11-29 01:53:27
大家好,今天我给大家分享的题目是微服务架构下的数据一致性保证。 今天分享第一篇, 主要内容 包括: 1.传统使用本地事务和分布式事务保证一致性。 2.传统分布式事务不是微服务中一致性的最佳选择。 3.微服务架构中应满足数据最终一致性原则。 4.微服务架构实现最终一致性的三种模式。 5.对账是最后的终极防线。 一、传统使用本地事务和分布式事务保证一致性 传统单机应用一般都会使用一个关系型数据库,好处是应用可以使用 ACID transactions。为保证一致性我们只需要:开始一个事务,改变(插入,删除,更新)很多行,然后提交事务(如果有异常时回滚事务)。更进一步,借助开发平台中的数据访问技术和框架(如Spring),我们需要做的事情更少,只需要关注数据本身的改变。 随着组织规模不断扩大,业务量不断增长,单机应用和数据库已经不足以支持庞大的业务量和数据量,这个时候需要对应用和数据库进行拆分,就出现了一个应用需要同时访问两个或两个以上的数据库情况。开始我们用分布式事务来保证一致性,也就是我们常说的两阶段提交协议(2PC)。 本地事务和分布式事务现在已经非常成熟,相关介绍很丰富,此处不多作讨论。 二、传统分布式事务不是微服务中一致性的最佳选择 首先, 对于微服务架构来说,数据访问变得更加复杂,这是因为数据都是微服务私有的,唯一可访问的方式就是通过API

分布式存储系统的一些基本理论

烂漫一生 提交于 2019-11-29 00:25:20
无论是云计算、大数据还是互联网公司的各种应用,其后台基础设施的主要目标都是构建低成本、高性能、可扩展、易用的分布式存储系统。 大规模分布式存储系统的定义如下:分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务。 几个特点: (1)可扩展:分布式存储系统可以扩展到几百台甚至上千台的集群规模,而且,随着集群规模的增长,系统整体性能表现为线性增长 (2)低成本:自动容错、自动负载均衡机制使其可以构建在普通PC机之上。另外,线性扩展能力也使得增加、减少机器非常方便,可以实现自动运维。 (3)高性能:针对整个集群还是单台服务器,都要求分布式存储系统具备高性能。 (4)易用:分布式存储喜提需要能够提供易用的对外接口,另外,也要求具备完善的监控、运维工具。 分布式存储数据需求比较复杂,大体可以分为三类: (1)非结构化数据 (2)结构化数据 (3)半结构化数据 不同的分布式存储系统适合处理不同类型的数据,将分布式存储系统分为四类: (1)分布式文件系统:互联网应用需要存储大量的图片,视频等非结构化数据对象,这类数据以对象的形式组织,对象之间没有关联,这样的数据一般称为Blob数据(Binary Large Object二进制大对象) 分布式文件系统存储三种类型的数据:Blob对象,定长块,大文件 (2)分布式键值系统:存储关系检点的半结构化数据

Hbase ——Not only SQL

ぃ、小莉子 提交于 2019-11-28 19:49:16
HBase —— NoSQL_Not Only SQL NoSQL数据库: 不遵循传统的RDBMS模型 解决数据库的可伸缩性和可用性(多机器) 数据是非关系的(可切分),不使用sql语句 不针对原子性或一致性(定时同步数据)问题 —————————————————————————————— 传统关系型数据库存在瓶颈 高并发读写,每秒上万次读写请求 高存储量,分库分表难以维护 高扩展性,无法简单地通过增加硬件提升性能 高可用性,不能保证服务长时间运行时的稳定性 NoSQL的优势 优异的海量数据读写性能 灵活的数据模型 数据间无关系,易于切割、扩展 SQL与NOSQL对比 对比 NoSQL 关系型数据库 常用数据库 HBase、MongoDB、Redis Oracle、DB2、MySQL 存储格式 文档、键值对、图结构 表格式,行和列 存储规范 鼓励冗余 规范性,避免重复 存储扩展 横向扩展,分布式 纵向扩展(横向扩展有限) 查询方式 非结构化查询 结构化查询语言SQL 事务 不支持事务一致性 支持事务 性能 读写性能高 读写性能差 成本 简单易部署,开源,成本低 成本高 NoSQL的特点 最终一致性,数据并非实时一致,但最终会一致 应用程序可以增加一致性 鼓励冗余数据存储 NoSQL 不等于 大数据 nosql是为了帮助解决大数据的数据存储问题 但大数据不仅仅包含数据的存储问题(存储

MySQL事务,这篇文章就够了

风格不统一 提交于 2019-11-28 18:56:59
原文链接:https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的文章有所帮助。 InnoDB与MyISAM等存储引擎对比 面试官问你B树和B 树,就把这篇文章丢给他 MySQL的B 树索引的概念、使用、优化及使用场景 MySQL全文索引最强教程 MySQL的又一神器-锁,MySQL面试必备 0 什么是事务 事务(Transaction) 是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每 个事务结束时,都能保持数据一致性。 同时,事务有着严格的地定义,必须满足四个特性,也就是我们一直说的ACID,但是,并不是说各种数据库就一定会满足四个特性,对于不同的数据库的实现来说,在不同程度上是不一定完全满足要求的,比如,Oracle数据库来说,默认的事务隔离级别是 READ COMMITTED ,是不满足隔离性的要求的。 下面我们趁热打铁,介绍一下事务的必知必会的四大特性,这几个特性也是在面试中,面试官面试MySQL的相关知识的时候,问的比较多的问题,所以,这几个特性务必需要理解并且透彻的记在心里,开个玩笑,被火车撞了,也不应该忘记这四个特性! 1 事务的四大特性

深入解读微服务架构下分布式事务解决方案

喜欢而已 提交于 2019-11-28 15:08:33
原文引用 大专栏 https://www.dazhuanlan.com/2019/08/26/5d6350a8eda02/ 1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。 Hailo有160个不同服务构成,NetFlix有大约600个服务。国内方面,阿里巴巴、腾讯、360、京东、58同城等很多互联网公司都进行了微服务化实践。 当前微服务的开发框架也非常多,比较著名的有Dubbo、SpringCloud、thrift 、grpc等。 2 微服务落地存在的问题 虽然微服务现在如火如荼,但对其实践其实仍处于探索阶段。很多中小型互联网公司,鉴于经验、技术实力等问题,微服务落地比较困难。如著名架构师Chris Richardson所言,目前存在的主要困难有如下几方面: 1)单体应用拆分为分布式系统后,进程间的通讯机制和故障处理措施变的更加复杂。 2)系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并操作多个数据库实现,服务调用的分布式事务问题变的非常突出。 3)微服务数量众多,其测试、部署、监控等都变的更加困难。 随着RPC框架的成熟,第一个问题已经逐渐得到解决。例如dubbo可以支持多种通讯协议

分布式架构的一致性维持

痞子三分冷 提交于 2019-11-28 14:49:28
在实际开发中,我们的大型项目都需要设计分布式架构,同时对高并发的场景进行管理,而在高并发环境中,我们通过使用redis集群来管理和控制该场景,同时,我们需要保证数据库与缓存的双写一致性,同时因为在常见的高并发场景中,我们对于微服务的控制并不能很好的应对该场景,如spring cloud和docker的结合并不能很好的解决该问题,因此我们需要相应的算法和协议来维持分布式架构的一致性。 如图所示,我们在分布式架构中,通常对于服务器的管理,我们通过观察是否存在特洛伊问题来决定使用哪种方法来解决分布式架构一致性。 在非特洛伊问题中,我们使用paxos和raft协议来维持分布式架构一致性,例如,在使用spring+spring MVC+Mybatis的开发中,我们经常使用@RequestBody 注解来返回一个json格式的网络状态,在常用的消息队列中,例如RabbitMQ,我们使用消息中间件的特性来进行程序的解耦削峰异步,通过消息中间件的作用,我们使传统RPC的方式变为了分布式,从而解决了系统的耦合性,但是对于大型业务场景,消息中间件会产生消息丢失,消息转发失败等系统问题,所以我们在设计架构的时候,通过会使用消息队列锁定算法来维持消息的稳定性,但对于高并发场景一味的使用synchronized或者乐观锁是不现实的,所以我们会使用分布式锁,自旋锁等高级锁来保持高并发场景的读写一致性。

MYSQL 事务隔离级别

非 Y 不嫁゛ 提交于 2019-11-28 14:45:34
事务的ACID特性: 原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做。 一致性(consistency):事务前后数据的完整性必须保持一致.事务必须是使数据库从一个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。有四种隔离级别 持久性(durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 隔离性的四种级别 来源: https://www.cnblogs.com/viczhang/p/11410388.html

分布式系统CAP定理与BASE理论

血红的双手。 提交于 2019-11-28 14:44:18
CAP定理: 一个分布式系统 不可能 同时满足 一致性 (C:Consistency)、 可用性 (A:Availability)和 分区容错性 (P:Partition tolerance)这三个基本要求,最多只能满足 其中的两项 。 一致性 在分布式环境中,一致性是指数据在 多个副本之间 是否能够 保持强一致 的特性。 对于一个将数据副本分布在不同节点上的分布式系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是更新前的数据(称为 脏数据 ),这就是典型的分布式数据不一致情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都能读取到最新的值,那么这样的系统就被认为具有 强一致性 (或严格的一致性)。 可用性 可用性是指系统提供的服务必须 一直处于可用 的状态,对于用户的每一个操作请求总是能够在 有限的时间 内 返回结果 ,如果超过了这个时间范围,那么系统就被认为是不可用的。 『有限的时间内』是一个在系统设计之初就设定好的运行指标, 不同的系统会有很大的差别 。比如对于一个在线搜索引擎来说,通常在0.5秒内需要给出用户搜索关键词对应的检索结果。而对应Hive来说,一次正常的查询时间可能在20秒到30秒之间。 『返回结果

详细介绍MySQL/MariaDB的锁

烈酒焚心 提交于 2019-11-28 10:43:15
本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围。 InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X)。   为了支持多粒度锁定,InnoDB支持意向锁,该锁允许事务在行锁和表锁同时存在。包括意向共享锁(IS)和意向排他锁(IX)。   意向锁将锁定的对象分为多个层次,意味着事务希望在更细粒度上进行加锁,如需要对页上的记录r加X锁,分别需要对数据库、表、页加意向锁IX,最后对记录r加X锁,其中任何一部分导致等待,该操作需要等待粗粒度锁的完成。 3. 锁的查看方式    通过show engine innodb status来查看,其中的transactions片段可以看到事务,其中包括锁等待。   在information_schema架构下,有3个表记录了事务和锁相关的信息。分别是 INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS 。(具体看书或博客) 4. 一致性非锁读   非锁定读机制,是InnoDB存储引擎的默认设置,默认 读取不会占用和等待表上的锁   InnoDB存储引擎利用 行多版本控制 实现一致性非锁读,   当读取的行正在加X锁DELETE或UPDATE时,读操作不会等待锁释放,会读取行的一个 快照数据   快照数据是指该行之前版本的数据,其通过

重新学习MySQL数据库6:浅谈MySQL的中事务与锁

陌路散爱 提交于 2019-11-28 10:36:27
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的;在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍。 事务其实就是并发控制的基本单位;相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位;数据库事务的 ACID 四大特性是事务的基础,了解了 ACID 是如何实现的,我们也就清除了事务的实现,接下来我们将依次介绍数据库是如何实现这四个特性的。 原子性 在学习事务时,经常有人会告诉你,事务就是一系列的操作,要么全部都执行,要都不执行,这其实就是对事务原子性的刻画;虽然事务具有原子性,但是原子性并不是只与事务有关系,它的身影在很多地方都会出现。 由于操作并不具有原子性,并且可以再分为多个操作,当这些操作出现错误或抛出异常时,整个操作就可能不会继续执行下去,而已经进行的操作造成的副作用就可能造成数据更新的丢失或者错误。 事务其实和一个操作没有什么太大的区别,它是一系列的数据库操作(可以理解为 SQL)的集合,如果事务不具备原子性,那么就没办法保证同一个事务中的所有操作都被执行或者未被执行了