数据库一致性

缓存一致性问题

核能气质少年 提交于 2019-11-27 16:20:48
缓存一致性问题 一.场景 二.问题 三.定义 四.分析 1.顺序异常分析 1.1 先A后B 1.2 先B后A 1.3小结 2.方案分析 2.1先A后B 2.2先B后A 1.3小结 1.4方案改进 五.总结 一.场景 项目中为了对dao(data access object)层数据做缓存,设计了一层das(data access service),在das上采用了aop的方式作统一缓存处理。这里做的是缓存删除操作。 二.问题 数据库和缓存的一致性问题。 三.定义 A: 删除缓存 B: 提交数据库事务 C: 读取缓存(如果缓存数据为空,会从数据库读取旧数据) A-B: A和B同步 A–B: A和B异步 四.分析 1.顺序异常分析 1.1 先A后B 注意:删除缓存的操作在数据库事务中执行的情况也属于先A后B (1)A失败了,B不会执行,不影响一致性。 (2)A成功了,B失败了。因为是删除缓存操作(读请求会从数据库读取旧数据),所以不影响一致性。 (3)先A,后B,存在时间间隙,如果在这段间隙中有其它读请求C,那么就会出现数据不一致。 1.2 先B后A (1)B失败,A不会执行,不影响一致性。 (2)B成功,A失败,会出现数据不一致。 1.3小结 从上面分析可以发现,两种顺序的执行都会存在导致数据不一致的问题。 2.方案分析 2.1先A后B 解决问题(3) (1)阻塞加锁的方式, A-B

Nosql

那年仲夏 提交于 2019-11-27 15:58:43
单机MySQL的美好时代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 在那个时候,更多的都是静态网页,动态交互类型的网站不多 初期架构 | center DAL,(Data Access Layer)。其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。 上述架构下,我们来看看数据存储的瓶颈是什么? 1、数据量的总大小 一个机器放不下时。(表要占空间,表的索引要占空间) 2、数据的索引(B+ Tree树)一个机器的内存放不下时库 3、访问量(读写混合)一个实例不能承受,(读写一个库) 真正意义上的库应该是主从复制,读写分离,而mysql等数据库只能自己从自己的库中读与写,也就是自己和自己玩。 如果满足了上述1 or 3个,则需要进化.. Memcached(缓存,java上还有一个ehcache)+MySQL+垂直拆分 后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力, 优化数据库的结构和索引 。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享

第一次有人把“分布式事务”讲的这么简单明了

随声附和 提交于 2019-11-27 13:12:39
不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付 又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。 有了事务,你去小卖铺买东西,那就是一手交钱一手交货。有了事务,你去网上购物,扣款即产生订单交易。 事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。 简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。 数据库本地事务 ACID 说到数据库事务就不得不说,数据库事务中的四大特性 ACID: A:原子性(Atomicity),一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 就像你买东西要么交钱收货一起都执行,要么发不出货,就退钱。 C:一致性(Consistency),事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。 如果事务成功地完成,那么系统中所有变化将正确地应用

分布式事务实践笔记

我的未来我决定 提交于 2019-11-27 13:10:21
微服务系统 事务 事务的原则 事务:是一种可靠,一致的方式,访问和操作数据库中数据的程序单元 原则特性: 原子性, 一致性 ,隔离性:事务之间互不干扰,持久性: 没提交事务之前,系统挂了,数据还是之前的数据,并没有被改变 mysql 查询事务的隔离级别 SELECT @@GLOBAL.tx_isolation,@@tx_isolation; 默认是 REPEATABLE-READ 可重复读 什么是 可重复读? 比如 开启一个 事务,这个事务只读某一个表的 某条 的取数据。 但是这时候并没有提交 , 但是 这时候另一个事务 修改了 该条数据,并提交了事务。 此时 之前的 的那个为 提交的事务,再次查询数据,这时候的数据是 未改变之前的数据,并不会因为 其他事务修改了数据提交了事务, 而显示出来 修改的值。 mysql 可重复读 修复 因为mysql 的事务隔离级别是 可重复读,另一个事务a 在执行更新数据,但是未提交, 这时候 一个事务 读取到 值之后, 另一个事务a更新了数据, 那么这时候 之前读取的值就不对了,怎么解决呢? 1, 要么改 数据隔离级别是 序列化的, 可以修改当前 连接 session的 事务隔离级别 2. 使用 FOR UPDATE 这时候 比如 SELECT * FROM T_USER FOR UPDATE 此时 如果该表有未 提交事务,将等待 事务提交完成

Redis集群案例与场景分析

﹥>﹥吖頭↗ 提交于 2019-11-27 08:34:45
1 、背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统。想当年Redis的单点单线程特性无法满足我们日益壮大的系统,只能硬着头皮把Redis“集群化”负载。且这套“集群化”方案良好地运行至今。虽难度不高,胜在简单和实用。无论简单还是很简单,记录这种经历是一件非常有趣的事情。 2 、问题 系统访问量日益倍增,当前的Redis单点服务确实客观存在连续可用性以及支撑瓶颈风险,这种主/备模式在服务故障突发的情况下就会被动停止服务进行Redis节点切换。针对单点问题,我们结合自身的业务应用场景对Redis“集群化”提出几个主要目标: 1、避免单点情况,确保服务高可用; 2、紧可能把数据分布式存储,降低故障影响范围,满足服务灵活伸缩; 3、控制“集群化”的复杂度,从而控制边际成本; 3 、过程 以上目标1和2就是所谓的分布式集群方案,把大问题分而治之。但最难把控的是目标3的“简化”实现。基于当时开源社区的那几种Redis集群方案,对于我们“简化”的要求来说相对略显臃肿。所以还是决定结合自身的业务应用等因素打造一个“合适”的Redis集群。 初始,我们凭借自己对分布式集群的认识勾结合应用场景勾勒出一个我们觉得足够“简化”的设计图,然后在这个“简化

zookeeper与分布式系统

大憨熊 提交于 2019-11-27 07:38:08
1.1. 分布式系统基础知识 一个 tomcat 打天下的时代,不能说完全淘汰了,在一个管理系统,小型项目中还经常使用,这并不过分,出于成本的考虑,这反而值得提倡。 1.1.1. 分布式系统是什么 分布式系统:一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统 这是分布式系统,在不同的硬件,不同的软件,不同的网络,不同的计算机上,仅仅通过消息来进行通讯与协调 这是他的特点,更细致的看这些特点又可以有:分布性、对等性、并发性、缺乏全局时钟、 故障随时会发生。 1.1.1.1. 分布性 既然是分布式系统,最显著的特点肯定就是分布性,从简单来看,如果我们做的是个电商项目,整个项目会分成不同的功能,专业点就不同的微服务,比如用户微服务,产品微服务,订单微服务,这些服务部署在不同的 tomcat 中,不同的服务器中,甚至不同的集群中,整个架构都是分布在不同的地方的,在空间上是随意的,而且随时会增加,删除服务器节点,这是第一个特性 1.1.1.2. 对等性 对等性是分布式设计的一个目标,还是以电商网站为例,来说明下什么是对等性,要完成一个分布式的系统架构,肯定不是简单的把一个大的单一系统拆分成一个个微服务,然后部署在不同的服务器集群就够了,其中拆分完成的每一个微服务都有可能发现问题,而导致整个电商网站出现功能的丢失。 比如订单服务,为了防止订单服务出现问题

微服务分布式事务的实现方法及替代方案

ぐ巨炮叔叔 提交于 2019-11-27 06:05:43
微服务–分布式事务的实现方法及替代方案 这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正! 概念澄清 事务补偿机制 : 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务. CAP理论 : CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统. 幂等性 : 简单的说, 业务操作支持重试 , 不会产生不利影响. 常见的实现方式: 为消息额外增加唯一ID. BASE (Basically avaliable, soft state, eventually consistent): 是分布式事务实现的一种理论标准. 柔性事务 vs. 刚性事务 刚性事务是指严格遵循ACID原则的事务, 例如单机环境下的数据库事务. 柔性事务是指遵循BASE理论的事务, 通常用在分布式环境中, 常见的实现方式有: 两阶段提交(2PC), TCC补偿型提交, 基于消息的异步确保型, 最大努力通知型. 通常对本地事务采用刚性事务, 分布式事务使用柔性事务. 先上结论, 再分别介绍分布式事务的各种实现方式. 如果业务场景需要强一致性, 那么尽量避免将它们放在不同服务中,

在「不可靠」硬件上,分布式数据库如何保证数据可靠性和服务可用性?

不想你离开。 提交于 2019-11-27 03:14:37
“数据不能丢,服务不能停”,可以说这句话道出了用户对数据库的核心能力的要求。然而,传统的商业数据库必须依赖高可靠的硬件才能实现数据可靠性和服务可用性。OceanBase作为一款成熟的企业级分布式数据库,基于普通PC服务器,就能够做到传统高端硬件环境下的数据可靠性和服务可用性,而且还能做得更好!跟我们一起看看OceanBase的技术秘诀吧! Part1 前言 说到数据可靠性和服务可用性,在数据库领域真是老生常谈的话题,可以说从数据库诞生之日起就如影随形。如果要用一句话来概括数据库对数据可靠性和服务可用性的要求,可以借用OceanBase数据库创始人阳振坤老师的一句话:“数据不能丢,服务不能停”。可以说,这句话也道出了用户对数据库的一个核心能力要求:除了功能完善、使用方便之外,还要绝对安全、足够健壮。可以说,为了满足这两个看似简单的要求,在数据库领域诞生了大量的技术和论文,也让无数人绞尽了脑汁。 在传统的商业数据库产品(如Oracle、DB2)中,虽然也有一些行之有效的软件技术(如Redo Log、主从热备技术等)用来提高数据可靠性和服务可用性,但整体来说对硬件的稳定性有很强的依赖。而传统的企业级服务器(如IBM 的Mainframe、AS400、Power等)和EMC、IBM等厂商的高端存储产品,能够很好的保证硬件的稳定性,因此也就成为了Oracle为代表的传统数据库产品的理想平台

高性能MySQL之事物

北战南征 提交于 2019-11-27 01:21:46
背景 当你手中抓住一件东西不放时,你只能拥有一件东西,如果你肯放手,你就有机会选择更多。与其在别人的生活里跑龙套,不如精彩做自己。人无所舍,必无所成。跌倒了,失去了,不要紧,爬起来继续风雨兼程,且歌且行。 一、概念 事务到底是什么东西呢?想必大家学习的时候也是对事务的概念很模糊的。接下来通过一个经典例子讲解事务。 银行在两个账户之间转账,从A账户转入B账户1000元,系统先减少A账户的1000元,然后再为B账号增加1000元。如果全部执行成功,数据库处于一致性;如果仅执行完A账户金额的修改,而没有增加B账户的金额,则数据库就处于不一致状态,这时就需要取消前面的操作。这过程中会有一系列的操作,比如余额查询,余额做加减法,更新余额等,这些操作必须保证是一个整体执行,要么全部成功,要么全部失败,不能让A账户钱扣了,但是中途某些操作失败了,导致B账户更新余额失败。这样用户就不乐意了,银行这不是坑我吗?因此简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。你现在知道,MySQL是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一。 接下来会以InnoDB为例,抽丝剥茧MySQL在事务支持方面的特定实现。 二、隔离性与隔离级别

信安周报-第02周:SQL基础

霸气de小男生 提交于 2019-11-27 00:44:47
信安之路 第02周 Code: https://github.com/lotapp/BaseCode/tree/master/safe 前言 本周需要自行研究学习的任务贴一下: 1.概念(推荐) 数据库系列去年就开始陆陆续续的发文,这周任务简单带过,概念部分我更新了一下,其他部分看扩展吧~ 1.1.关系型数据库 引用百科的一段 抽象 描述: “关系型数据库,是指 采用了关系模型 来组织数据的数据库,其 以行和列的形式存储数据 ,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。” 通俗讲就是: 现实中的东西抽象成一个个关系,然后存储在一张张行列组成的表中,这些表就组成了关系型数据库 PS:重点就是各数据之间的 关系 (Join) 1.1.1.代表 最经典的莫过于: MySQL 、 SQLServer 、 PostgreSQL 、 SQLite 、 Oracle 1.1.2.特性 先看看传统数据库的好处: 通过事务保持数据一致 可以Join等复杂查询 社区完善(遇到问题简单搜下就ok了) 最典型的特征就是: 事物的ACID特性 PS:抽象的就不说了,举个例子来说明 ACID : A