精华内容
下载资源
问答
  • 一致性成本vs非一致性成本,原文...一致性成本(cost of conformance),该成本是预防性的,在缺陷发生之前付出的,用于质量与要求或规范一致而付出的成本。 非一致性成本: 非一致性成本(cost of non-conformance..

    一致性成本vs非一致性成本,原文链接:https://www.ffeeii.com/1882.html

    质量成本:

    质量成本(cost of quality)包括在产品生命周期中为预防不符合要求,为评估产品或服务是否符合要求,以及因未达到要求(返工),而发生的所有成本。

    一致性成本:

    一致性成本(cost of conformance),该成本是预防性的,在缺陷发生之前付出的,用于质量与要求或规范一致而付出的成本。

    非一致性成本:

    非一致性成本(cost of non-conformance),是由于质量与要求或者规范不一致而造成的成本。

    一致性成本和非一致性成本对比:

    一致性成本和非一致性成本对比

    举例:

    1、为了确保满足质量标准,项目经理聘请外部资源来检查可交付成果的质量。这种检查的成本可以分为哪些成本类别?

    • A:预防成本
    • B:评估成本
    • C:外部成本
    • D:失败成本

    答案:B。检查属于评估成本

    2、下面是非一致成本的例子,除了:

    • A:返工
    • B:培训
    • C:报废
    • D:保修

    答案:B。解析:培训是为了提高团队成员的能力或统一对项目的质量的认识,是为了预防缺陷的产生,是一致性成本。

    展开全文
  • 总线矩阵:业务过程维度的交点; 一致性维度:同一集市的维度表,内容相同或包含; 一致性事实:不同集市的同一事实,需保证口径一致,单位统一

    目录

    1、概述

    总线架构

    一致性维度 

    一致性事实

    2、总线架构demo


    1、概述

    在Kimball的维度建模的数据仓库中,关于多维体系结构(MD)有三个关键性概念:总线架构(Bus Architecture),一致性维度(Conformed Dimension)和一致性事实(Conformed Fact)。 

    总线架构

    多维体系结构(总线架构) 数据仓库领域里,有一种构建数据仓库的架构,叫Multidimensional Architecture(MD),中文一般翻译为“多维体系结构”,也称为“总线架构”(Bus Architecture)。多维体系结构的创始人是数据仓库领域中最有实践经验的Kimball博士。 多维体系结构主要包括后台(Back Room)和前台(Front Room)两部分。后台也称为数据准备区(Staging Area),是MD架构的最为核心的部件。在后台,是一致性维度的产生、保存和分发的场所。同时,代理键也在后台产生。 前台是MD架构对外的接口,包括两种主要的数据集市,一种是原子数据集市,另一种是聚集数据集市。原子数据集市保存着最低粒度的细节数据,数据以星型结构来进行数据存储。聚集数据集市的粒度通常比原子数据集市要高,和原子数据集市一样,聚集数据集市也是以星型结构来进行数据存储。前台还包括像查询管理、活动监控等为了提供数据仓库的性能和质量的服务。 在多维体系结构中,所有的这些基于星型机构来建立的数据集市可以在物理上存在于一个数据库实例中,也可以分散在不同的机器上,而所有这些数据集市的集合组成的分布式的数据仓库。

    一致性维度 

    在多维体系结构中,没有物理上的数据仓库,由物理上的数据集市组合成逻辑上的数据仓库。而且数据集市的建立是可以逐步完成的,最终组合在一起,成为一个数据仓库。如果分步建立数据集市的过程出现了问题,数据集市就会变成孤立的集市,不能组合成数据仓库,而一致性维度的提出正式为了解决这个问题。 一致性维度的范围是总线架构中的维度,即可能会在多个数据集市中都存在的维度,这个范围的选取需要架构师来决定。一致性维度的内容和普通维度并没有本质上区别,都是经过数据清洗和整合后的结果。 一致性维度建立的地点是多维体系结构的后台(Back Room),即数据准备区。在多维体系结构的数据仓库项目组内需要有专门的维度设计师,他的职责就是建立维度和维护维度的一致性。在后台建立好的维度同步复制到各个数据集市。这样所有数据集市的这部分维度都是完全相同的。建立新的数据集市时,需要在后台进行一致性维度处理,根据情况来决定是否新增和修改一致性维度,然后同步复制到各个数据集市。这是不同数据集市维度保持一致的要点。 在同一个集市内,一致性维度的意思是两个维度如果有关系,要么就是完全一样的,要么就是一个维度在数学意义上是另一个维度的子集。例如,如果建立月维度话,月维度的各种描述必须与日期维度中的完全一致,最常用的做法就是在日期维度上建立视图生成月维度。这样月维度就可以是日期维度的子集,在后续钻取等操作时可以保持一致。如果维度表中的数据量较大,出于效率的考虑,应该建立物化视图或者实际的物理表。这样,维度保持一致后,事实就可以保存在各个数据集市中。虽然在物理上是独立的,但在逻辑上由一致性维度使所有的数据集市是联系在一起,随时可以进行交叉探察等操作,也就组成了数据仓库。

    一致性事实

    在建立多个数据集市时,完成一致性维度的工作就已经完成了一致性的80%-90%的工作量。余下的工作就是建立一致性事实。 一致性事实和一致性维度有些不同,一致性维度是由专人维护在后台(Back Room),发生修改时同步复制到每个数据集市,而事实表一般不会在多个数据集市间复制。需要查询多个数据集市中的事实时,一般通过交叉探查(drill across)来实现。 为了能在多个数据集市间进行交叉探查,一致性事实主要需要保证两点:第一个是KPI的定义及计算方法要一致,第二个是事实的单位要一致性。如果业务要求或事实上就不能保持一致的话,建议不同单位的事实分开建立字段保存。

          这样,一致性维度将多个数据集市结合在一起,一致性事实保证不同数据集市间的事实数据可以交叉探查,一个分布式的数据仓库就建成了。

    2、总线架构demo

    参考文献:东拼西凑.txt

    小结有话

    1、总线矩阵:业务过程和维度的交点;一致性维度:同一集市的维度表,内容相同或包含;一致性事实:不同集市的同一事实,需保证口径一致,单位统一。

    2、追求一致性必然会增加开发工作量,但长期来说,使用方便、运维简单;一致性和性能,需要平衡。

     

    数仓系列传送门:https://blog.csdn.net/weixin_39032019/category_8871528.html

     

    展开全文
  • 文章目录统一javaweb项目mysql数据库时间UTC时间方法及原理前言UTC时间与 GMT时间时间戳时区mysql时间字段解读4种日期类型比如datetimetimestamp区别查看修改时区java里时间类获得系统时间类获得UTC时间...

    统一javaweb项目和mysql数据库时间UTC时间方法及原理

    前言

    由于在时间处理上,北京时间和世界时间相差8小时,如果时间处理不当,会造成程序混乱。所以必需统一时间,建议使用UTC时间,当然使用北京时间也没毛病。

    UTC时间与 GMT时间

    1. UTC:协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。
    2. GMT:经过格林威治老天文台本初子午线的时间便被称为世界时,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
      我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。

    本地时间=UTC + 时区差
    例如:
    北京时间:2019-03-22 12:20:00
    UTC时间:2019-03-22 12:20:00 UTC+8:00
    GMT时间:2019-03-22 4:20:00 UTC+0:00

    时间戳和时区

    1. 时间戳
      所有的linux系统文件系统底层存储的都是UTC时间,也就是说都是自1970年0时0分0秒以来的UTC标准时间的秒数。
      无论系统配置是什么时区,显示如何不同,底层存储都是一致的,这个时间叫时间戳。
      时间戳不分东西南北、在地球的每一个角落都是相同的。
    2. 时区
      时间戳在地球的每一个角落都是相同的,但是在相同的时间点会有不同的表达方式,所以有了另外一个时间概念,叫时区。例如北京时间叫东八区

    mysql时间字段解读

    4种日期类型

    参考官方文档
    mysql中有4种日期类型

    1. date
      只有年月日,没有时分秒,格式如下:YYYY-MM-DD
      支持时间范围是1000-01-01’ to '9999-12-31
      很少用
    2. time
      只有时分秒,格式如下: HH:MM:SS
      很少用
    3. datetime
      年月日时分秒,格式如下:YYYY-MM-DD HH:MM:SS
      支持时间范围是1000-01-01’ to '9999-12-31
    4. timestamp
      时间戳,常用,返回的格式是YYYY-MM-DD HH:MM:SS。如果想获得数字值(UTC时间),在列后台添加+0
      比如
    
    select now();  
    结果
    +---------------------+
    | now()               |
    +---------------------+
    | 2019-03-22 10:21:50 |
    +---------------------+
    1 row in set
    
    select now()+0;
    结果
    mysql> select now()+0;
    +----------------+
    | now()+0        |
    +----------------+
    | 20190322102206 |
    +----------------+
    1 row in set
    
    

    比如datetimetimestamp区别

    1. 两者的存储方式不一样
      对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储(换句话说,将当前时区时间转化成自1970年0时0分0秒以来的UTC标准时间的秒数)。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。

    sql语句当前时区时间,不能插入UTC时间(比如2019-03-22T02:00:00Z)。这个区别对开发者和用户是透明的,可以忽略

    1. 两者所能存储的时间范围不一样
      timestamp所能存储的时间范围为:’1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。
      datetime所能存储的时间范围为:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。

    没太大区别,可以忽略这个区别

    1. 自动初始化和更新
      自动初始化指的是如果对该字段(譬如上例中的hiredate字段)没有显性赋值,则自动设置为当前系统时间。
      自动更新指的是如果修改了其它字段,则该字段的值将自动更新为当前系统时间。

    timestamp有自动初始化和更新,当你update某条记录的时候,该列值会自动更新,这是和datatime最大的区别。
    其实2者区别不是特别的大,但timestamp比datetime常用。

    查看和修改时区

    查看时区

    show variables like "%time_zone%";
    返回
    mysql> show variables like "%time_zone%";
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | system_time_zone |        |
    | time_zone        | SYSTEM |
    +------------------+--------+
    2 rows in set
    

    说明time_zone和system_time_zone使用system的时区,而在中国,时区基本上都是东八区,在linux上查看时区date -R

    java里时间类

    获得系统时间类

    参考java8 LocalDate LocalDateTime等时间类介绍
    下面的方法是获得当前时区时间

    1. LocalDate:LocalDate只提供日期不提供时间信息。它是不可变类且线程安全的。
      获得当前日期:LocalDate.now();
    2. LocalTime:LocalTime只提供时间而不提供日期信息,它是不可变类且线程安全的。
      获得当前时间:LocalTime.now();
    3. LocalDateTime:LocalDateTime提供时间和日期的信息,它是不可变类且线程安全的
      获得当前日期和时间:LocalDateTime.now();
    4. Year:Year提供年的信息,它是不可变类且线程安全的。
    5. Duration:Duration是用来计算两个给定的日期之间包含多少秒,多少毫秒,它是不可变类且线程安全的
    6. Period: Period是用来计算两个给定的日期之间包含多少天,多少月或者多少年,它是不可变类且线程安全的
    LocalDate localDate = LocalDate.now();
       Period period = Period.between(localDate, localDate.plus(2, ChronoUnit.DAYS));
       System.out.println(period.getDays());
    

    获得UTC时间

    使用Instant,这个类只有获得UTC时间。

    //获得当前时间 
    Instant instant = Instant.now();
    // 以ISO-8601输出 
    System.out.println(instant);
    //结果:
    2019-03-20T16:22:52.966Z
    
    //解析时间
    从字符串类型中创建Instant类型的时间 
    instant = Instant.parse("2019-03-20T16:22:52.966Z");
    

    mysql获得当前时间的特有关键字

    CURRENT_TIMESTAMP:获得当前时区时间,
    UTC_TIMESTAMP:获得当前UTC时间
    如果对时间不统一,会造成数据库里时间有的是UTC时间,有的是当前时区的时间。
    在javaweb开发时我们经常遇到
    Tomcat java使用UTC时区进行处理业务逻辑。从而导致Mysql数据库中lastModifyTime值查询后转到Java Bean,值少了8个小时。
    修改方法有很多种

    1. 保持两个系统的时区一致;由于Tomcat使用UTC时间,可以在Mysql中使用UTC_TIMESTAMP,而不是CURRENT_TIMESTAMP,这样时区就都是UTC了。
    2. lastModityTime不使用Mysql自动更新方式,而由Java Bean赋值方式。这样是最合理的。

    mysql时间类型和java时间类对应关系

    MySQL 类型 java类型
    datetime java.sql.Timestamp
    date java.sql.Date 或java.time.LocalDate
    timestamp java.sql.Timestamp或java.time. LocalDateTime
    time java.sql.Time 或java.time.LocalTime

    通过org.apache.ibatis.type包下的类型解析器可得
    在这里插入图片描述

    mybatis处理java时间类和mysql时间类型方式

    org.apache.ibatis.type包下默认设置很多种类型,用于映射这映射关系。
    比如挺好感觉Intant的类映射InstantTypeHandler类,类将java.time.intant转换成java.sql.timestamp

    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.time.Instant;
    @UsesJava8
    public class InstantTypeHandler extends BaseTypeHandler<Instant> {
    	//将Instant转换成Timestamp。注意将instant表示的UTC时间转换成了当前时区的时间
    	@Override
    	  public void setNonNullParameter(PreparedStatement ps, int i, Instant parameter, JdbcType jdbcType) throws SQLException {
    	    ps.setTimestamp(i, Timestamp.from(parameter));
    	  }
    	  
    	  //获得的数据又转换成Instant时间类
    	private static Instant getInstant(Timestamp timestamp) {
    	    if (timestamp != null) {
    	      return timestamp.toInstant();
    	    }
    	    return null;
    	  }
    	  }
    

    LocalDateTimeTypeHandler

    /**
     *    Copyright 2009-2017 the original author or authors.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *       http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    package org.apache.ibatis.type;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.time.LocalDateTime;
    
    import org.apache.ibatis.lang.UsesJava8;
    
    /**
     * @since 3.4.5
     * @author Tomas Rohovsky
     */
    @UsesJava8
    public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
    
      @Override
      public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType)
              throws SQLException {
        ps.setTimestamp(i, Timestamp.valueOf(parameter));
      }
    
      @Override
      public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Timestamp timestamp = rs.getTimestamp(columnName);
        return getLocalDateTime(timestamp);
      }
    
      @Override
      public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Timestamp timestamp = rs.getTimestamp(columnIndex);
        return getLocalDateTime(timestamp);
      }
    
      @Override
      public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Timestamp timestamp = cs.getTimestamp(columnIndex);
        return getLocalDateTime(timestamp);
      }
    
      private static LocalDateTime getLocalDateTime(Timestamp timestamp) {
        if (timestamp != null) {
          return timestamp.toLocalDateTime();
        }
        return null;
      }
    }
    
    

    其它类省略

    JDBC连接数据库设置时区

    使用JDBC连接数据库里5.7版本使用com.mysql.cj.jdbc.Driver 驱动包。在连接连接时要统一时区,否则容易造成混乱。
    下面是设置方法

    1. UTC时间:serverTimezone=UTC
    2. 北京时间:
    //北京时间东八区
    serverTimezone=GMT%2B8 
    //或者使用上海时间
    serverTimezone=Asia/Shanghai
    

    完整例子
    UTC时间

    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true 
    

    北京时间:

    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=true 
    

    总结

    以springboot框架开发javaweb项目为便,统一时间设置为UTC时间

    mysql数据库里

    字段指定了datetime或timestamp都一样,推荐使用timestamp

    timestamp有自动初始化和更新,当你update某条记录的时候,该列值会自动更新,这是和datatime最大的区别。

    javaweb

    下面的2种情况其实都会使用到,在混合使用的情况

    直接写sql情况下

    mybatis的映射mapper文件的sql里使用UTC_TIMESTAMP代替CURRENT_TIMESTAMP。比如

    <insert id="save" useGeneratedKeys="true" keyProperty="uid">
        insert into testTable ( create_a) values (UTC_TIMESTAMP )
        </insert>
    

    使用javabean传递时间

    在连接mysql数据库时统一时区为UTC

    jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true 
    

    其它

    有人说要统一服务器时间,配置如下

    @SpringBootApplication
        public class Application {
          @PostConstruct
          void started() {
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
          }
          public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
          }
    }
    

    但我没有使用也可以,先记录下吧

    经过上面2种处理后,数据库时间就统一为UTC时间了,当然,这里涉及了mybatis的typeHandler处理,还是要学习的。
    参考SpringBoot 统一时区的方案

    展开全文
  • 分布式事务数据一致

    千次阅读 2018-04-26 18:49:19
    数据一致性(状态一致性) raft协议会在几个节点之中选择一个领导,领导负责向外提供写,其他节点可以向外提供读。 其它节点接受领导的命令进行相关的操作,只要半数人状态达成一致就行了。 raft协议分成两个阶段...

    分布式事务相关

    数据一致性(状态一致性)

    raft算法的要求是选择一个节点作为leader, 客户端的读写操作都发往leader,
    leader先将请求记录在log中,然后再发送请求到follower,follower半数写入成功后才向client返回。
    其它节点接受领导的命令进行相关的操作,只要半数人状态达成一致就行了。
    raft协议分成两个阶段:
                        阶段一进行选主,为第二阶段服务。
                        阶段二进行领导相关命令的执行,及时反馈给领导
    同时也实现了分布式事务:
    常用的传统的分布式事务通常采用2pc,3pc来进行实现,raft协议的第二阶段就相当于是一个优化的2pc事务处理方法,
    2PC/3PC都是分布式一致性算法的残次版本,Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,
    那就是Paxos,其它的算法都是残次品。
    
    假如数据库在提交事务的时候突然断电,那么它是怎么样恢复的呢?  因为分布式系统的核心就是处理各种异常情况,
    这也是分布式系统复杂的地方,因为分布式的网络环境很复杂,这种“断电”故障要比单机多很多,所以我们在做分布式系统
    的时候,最先考虑的就是这种情况。这些异常可能有机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的TCP、
    存储数据丢失、其他异常等等...
    本地事务数据库断电的这种情况,它是怎么保证数据一致性的呢?我们使用SQLServer来举例,
    在使用SQLServer数据库是由两个文件组成的,一个数据库文件和一个日志文件,通常情况下,日志文件都要比数据库文件
    大很多。数据库进行任何写入操作的时候都是要先写日志的,同样的道理,我们在执行事务的时候数据库首先会记录下这个
    事务的redo操作日志,然后才开始真正操作数据库,在操作之前首先会把日志文件写入磁盘,那么当突然断电的时候,即使
    操作没有完成,在重新启动数据库时候,数据库会根据当前数据的情况进行undo回滚或者是redo前滚,这样就保证了数据
    的强一致性。
    
    集群刚开始启动时raft协议是如何操作的:
    raft协议中,集群中的机器刚开始启动的时候大家的身份都是follower,当follower超过一段时间
    (超时时间:每个follower都在150ms and 300ms之间随机,之后看谁先timeout,谁就先成为candidate,然后
    它会先投自己一票,再向其他节点发起投票邀请。)
    没有收到leader发来的心跳就表示leader已经死掉,增加自己的当前任期号并转化为candidate身份,然后它会先投
    自己一票,再向其他follower节点发起投票邀请。如果此时其他follower节点还没有到达超时时间,次轮选举还没有
    给自己投票或者投票给其它candidate,此时就会回应投票邀请,把票投给此candidate,然后重置自己的选举timeout。
    如果此candidate得到过半的投票就成为leader,之后定期开始向follower发送心跳。如果两个follower同时成为
    candidate的话,如果最后得到的票数相同,则等待其他follower的选择timeout之后成为candidate,继续开始新
    一轮的选举。
    
    log复制:leader把变动的log借助心跳同步给follower,过半回复之后才成功提交,之后再下一次心跳之后,
    follower也commit变动,在自己的node上生效。如果在长时间后由于出现网络分区集群出现两个leader,
    leader开始对比选举的term,发现有更高的term存在时,他们会撤销未提交的修改,然后以最新的为准。Raft 
    通过比较两份日志中最后一条日志条目的索引值和任期号定义谁的日志比较新。如果两份日志最后的条目的任期号不同,
    那么任期号大的日志更加新。如果两份日志最后的条目任期号相同,那么日志比较长的那个就更加新。
    
    Raft的日志机制来维护一个不同服务器的日志之间的高层次的一致性。这么做不仅简化了系统的行为也使得更加可预计,
    同时他也是安全性保证的一个重要组件。Raft 维护着以下的特性,这些同时也组成了的日志匹配特性:
    如果在不同的日志中的两个条目拥有相同的索引和任期号,那么他们存储了相同的指令。
    如果在不同的日志中的两个条目拥有相同的索引和任期号,那么他们之前的所有日志条目也全部相同。
    
    任期term的概念:
    Raft 把时间分割成任意长度的任期,任期用连续的整数标记。每一段任期从一次选举开始,一个或者多个候选人尝试
    成为领导者。如果一个候选人赢得选举,然后他就在接下来的任期内充当领导人的职责。在某些情况下,一次选举过程
    会造成选票的瓜分。
    在这种情况下,这一任期会以没有领导人结束;一个新的任期(和一次新的选举)会很快重新开始。Raft 保证了在
    一个给定的任期内,最多只有一个领导者。
    
    Raft 协议将整个过程分为主要3个步骤:
    领导者:和其他一致性算法相比,Raft 使用一种更强的领导能力形式。比如,日志条目只从领导者发送给其他的服
    务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。
    领导选举:Raft 算法使用一个随机计时器来选举领导者。这种方式只是在任何一致性算法都必须实现的心跳机制上
    增加了一点机制。在解决冲突的时候会更加简单快捷。
    关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问题,在这种方法中,两种不同的配置都要求的大
    多数机器会重叠。这就使得集群在成员变换的时候依然可以继续工作。

    分布式事务

    分布式事务:简单来说就是指对数据库的处理操作分布在不同的节点之上,而且操作的数据,分布于不同的数据库。
    分布式事务,需要保证不同数据库的数据一致性。
    分布式事务产生的原因:
    1.数据库分库分表
    处于数据量或者数据隔离的考虑,实际开发中需要进行分库分表。原来一个库现在变成了多个库,这时候要保证数据一致性,
    就要用到分布式事务。
    2.应用SOA
    所谓的SOA话,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、
    用户中心、库存中心。对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,
    库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库
    和库存数据库,为了保证数据一致性,就需要用到分布式事务。
    
    CAP定理
    CPA指的是,在一个分布式系统中,一致性(C)、可用性(A)、分区容错性(P),三者不可兼得。CPA是NoSQL数据库的基石。
    一致性(Consistency) :在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份
    最新的数据副本)
    可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
    分区容错性(Partition tolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据
    一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
    CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,
    所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
    
    两阶段提交这种解决方案属于牺牲了一部分可用性来换取的一致性。
    BASE
    BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
    BASE是下面三个术语的缩写:
    基本可用(Basically Available)
    软状态(Soft state)
    最终一致(Eventually consistent)

    常见的分布式事务解决方案(两类一致性(操作原子性(2pc,3pc)与副本一致性(raft/pasox)))

    总结:2pc,3pc ==>解决分布式事务和数据一致性 ===提升===>pasox算法==简化===>raft算法
    
    两阶段提交:
    两阶段提交(Two Phase Commit, 2PC), 具有强一致性。
    该协议将一个分布式的事务过程拆分成两个阶段: 投票阶段 和 事务提交阶段 。为了让整个数据库集群能够正常的运行,
    该协议指定了一个“协调者”单点,用于协调整个数据库集群的运行。
    
    第一阶段:投票阶段
    该阶段的主要目的在于打探数据库集群中的各个参与者是否能够正常的执行事务,具体步骤如下:
    协调者向所有的参与者发送事务执行请求,并等待参与者反馈事务执行结果。
    事务参与者收到请求之后,执行事务但不提交,并记录事务日志。
    参与者将自己事务执行情况反馈给协调者,同时阻塞等待协调者的后续指令。
    
    第二阶段:事务提交阶段
    在经过第一阶段协调者的询盘之后,各个参与者会回复自己事务的执行情况,这时候存在三种可能性:
    1.所有的参与者都回复能够正常执行事务
    2.一个或多个参与者回复事务执行失败
    3.协调者等待超时
    对于第一种情况,协调者将向所有的参与者发出提交事务的通知,具体步骤如下:
    协调者向各个参与者发送 commit 通知,请求提交事务。
    参与者收到事务提交通知之后,执行 commit 操作,然后释放占有的资源。
    参与者向协调者返回事务 commit 结果信息
    
    对于第二、三种情况,协调者均认为参与者无法成功执行事务,为了整个集群数据的一致性,所以要向各个参与者发
    送事务回滚通知,具体步骤如下:
    协调者向各个参与者发送事务 rollback 通知,请求回滚事务。
    参与者收到事务回滚通知之后,执行 rollback 操作,然后释放占有的资源。
    参与者向协调者返回事务 rollback 结果信息。
    
    2pc会有几个问题:
    1.同步阻塞(两阶段提交执行过程中,所有的参与者都需要听从协调者的统一调度,期间处于阻塞状态而不能从事其他操作,
    这样效率极其低下。)
    2.数据不一致(但仍然存在数据不一致性的可能性,比如在第二阶段中,假设协调者发出了事务 commit 通知,
    但是因为网络问题该通知仅被一部分参与者所收到并执行了commit 操作,其余的参与者则因为没有收到通知一直处于
    阻塞状态,这时候就产生了数据的不一致性。)。
    3.单点问题。
    
    三阶段提交:
    第一阶段:can_commit
    该阶段协调者会去询问各个参与者是否能够正常执行事务,参与者根据自身情况回复一个预估值,相对于真正的执行事务,
    这个过程是轻量的,具体步骤如下:
    协调者向各个参与者发送事务询问通知,询问是否可以执行事务操作,并等待回复。
    各个参与者依据自身状况回复一个预估值,如果预估自己能够正常执行事务就返回确定信息,并进入预备状态,
    否则返回否定信息。
    
    第二阶段:pre_commit
    本阶段协调者会根据第一阶段的询盘结果采取相应操作,询盘结果主要有三种:
    1.所有的参与者都返回确定信息
    2.一个或多个参与者返回否定信息
    3.协调者等待超时
    
    针对第一种情况,协调者会向所有参与者发送事务执行请求,具体步骤如下:
    协调者向所有的事务参与者发送事务执行通知。
    参与者收到通知后,执行事务但不提交。
    参与者将事务执行情况返回给客户端。
    在上述步骤中,如果参与者等待超时,则会中断事务。
    
    针对第二、三种情况,协调者认为事务无法正常执行,
    于是向各个参与者发出abort 通知,请求退出预备状态,具体步骤如下:
    协调者向所有事务参与者发送 abort 通知。
    参与者收到通知后中断事务。
    
    第三阶段:do_commit
    如果第二阶段事务未中断,那么本阶段协调者将会依据事务执行返回的结果来决定提交或回滚事务,分为三种情况:
    1.所有的参与者都能正常执行事务
    2.一个或多个参与者执行事务失败
    3.协调者等待超时
    
    针对第一种情况,协调者向各个参与者发起事务提交请求,具体步骤如下:
    协调者向所有参与者发送事务 commit 通知。
    所有参与者在收到通知之后执行 commit 操作,并释放占有的资源。
    参与者向协调者反馈事务提交结果。
    
    针对第二、三种情况,协调者认为事务无法成功执行,于是向各个参与者发送事务回滚请求,具体步骤如下:
    1.协调者向所有参与者发送事务 rollback 通知。
    2.所有参与者在收到通知之后执行 rollback 操作,并释放占有的资源。
    3.参与者向协调者反馈事务回滚结果。
    
    升级的3PC方案旨在解决这些问题,主要有两个改进:增加超时机制。两阶段之间插入准备阶段。但三阶段提交也存在
    一些缺陷,要彻底从协议层面避免数据不一致,可以采用Paxos或者Raft 算法。
    
    TCC(Try-Confirm-Cancel):
    TCC包含了三个阶段:Try,Confirm,Cancel,因此而得名「TCC」。
    TCC的概念属于国产,因为支付宝的技术布道而广为人知。
    其实,TCC算是一种编程模型,通常被理解为是一种柔性事务解决方案。
    Try,尝试执行业务。完成所有业务检查,预留相应的业务资源。
    Confirm,如果Try阶段执行成功,则此阶段利用Try阶段预留的资源,不再进行业务检查,而是执行真正的业务提交。
    并且Confirm阶段的操作满足幂等性,以便支持重试。这个阶段有一个假设:只要Try阶段成功,那么Confirm阶段一定成功。
    Cancel,此阶段是发生在Try阶段出现失败的时候,回滚之前的操作,释放Try阶段预留的业务资源,同样也满足幂等性。
    
    异步确保型:
    通过将一系列同步的事务操作变为基于消息执行的异步操作, 避免了分布式事务中的同步阻塞操作的影响。基于消息执行
    就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式
    事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的RocketMQ就支持这一特性.
    最大努力通知型:
    这是分布式事务中要求最低的一种, 也可以通过消息中间件实现, 与前面异步确保型操作不同的一点是, 在消息由
    MQ Server投递到消费者之后, 允许在达到最大重试次数之后正常结束事务.

    一致性模型

    数据的一致性模型可以分成以下 3 类:
    强一致性:数据更新成功后,任意时刻所有副本中的数据都是一致的,一般采用同步的方式实现。
    弱一致性:数据更新成功后,系统不承诺立即可以读到最新写入的值,也不承诺具体多久之后可以读到。
    最终一致性:弱一致性的一种形式,数据更新成功后,系统不承诺立即可以返回最新写入的值,但是保证最终会返回上
    一次更新操作的值。
    展开全文
  • MAVENのproperties和统一版本依赖文件

    千次阅读 2018-11-14 16:31:38
    当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建、文档、报告、依赖、scms、发布、分发...另外,自定义标签声明数据的配置并不是只能用于声明依赖的版本号,凡是需要统一声明后再引用...
  • 对于单机系统集中系统是指...1.单机系统的可用性和一致性(ACID)对于单机系统最主要的指标就是数据的一致可用性。其可以用ACID来度量一个系统的可用性和一致性。 Atomicity原子性:一个事务中所有操作都必须全部
  • 统一用户认证单点登录解决方案

    万次阅读 2016-10-15 14:57:51
     本文以某新闻单位多媒体数据库系统为例,提出建立企业用户认证中心,实现基于安全策略的统一用户管理、认证单点登录,解决用户在同时使用多个应用系统时所遇到的重复登录问题。 随着信息技术网络技术的迅猛...
  • 本文转载自”AI前线“,整理自翟佳在 QCon2018 北京站的演讲,在本次演讲中,翟佳介绍了 ...- Messaging:Pulsar 对 pub/sub queue 两种模式提供统一的支持,同时保证了一致性,高性能易扩展性。 - Compu...
  • 分布式系统的一致性问题(汇总)

    万次阅读 2019-09-02 15:32:19
    保证分布式系统数据一致性的6种方案 问题的起源 在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要...
  • 统一身份认证单点登录概念研究

    千次阅读 2018-09-28 08:39:14
    在研究、建设单位信息系统的集成登录时,自然想到了统一身份认证单点登录,首先遇到了这样的问题,统一身份认证单点登录的概念是什么,是不是某一个领域的术语,是不是有相应的标准协议以及相关的解决方案,...
  • 数据库的完整性和一致

    千次阅读 2020-09-23 19:52:19
    关系型数据库保证数据的完整性和一致性是最佳的。 完整性 实体完整性:每个实体独一无二(主键/唯一索引) 参照完整性 (引用完整性): 子表中不能有父表中没有的数据(外键) 域完整性:数据都是有效数据(数据类型...
  • 目录 1. 前言 2 ...5. setjmplongjmp 4 1) 结果1(非优化编译:g++ -g -o x x.cpp -O0) 5 2) 结果2(优化编译:g++ -g -o x x.cpp -O2) 6 6. 不同CPU架构的一致性模型 6 7. x86-TSO 7 ...
  • 使用zuul作为网关转发来调用其他模块,zuul中的session其他模块的session会不一致,同时如果是前后端分离,还存在跨域的问题下面会给出解决的方法。这样会导致用户登入时候,没法保存用户的信息,session会存在...
  • 1、统一使用utf-8编码格式扩展阅读1
  • 从世界需要统一时间标准出发,讲述为什么引入时区、时区的设计,进一步介绍时间的测量;涉及概念包括:世界时、本地时、原子时,time zone/UT/GMT/UTC/TAI等; 顺带介绍数据库时间、UNIX时间
  • JDK JRE 解决版本不一致问题

    万次阅读 多人点赞 2016-04-26 16:29:47
    Java\jdk\bin这个bin下有各种java程序需要用到的命令,与Java\jdk\jre\bin或者Java\jre\bin的bin目录最明显的区别就是Java\jdk\bin下才有javac.exe,这一点很好理解,因为 jre只是一个运行环境而已。与开发无关,正...
  • 本地消息表是最终一致性的方法,之前的实物补偿是强一致性方法,其区别可以追溯到CAP理论BASE理论。大白话来说,强一致性保证不存在数据不一致的脏时间,最终一致性可能存在脏时间。 消息队列 消息队列实际上是...
  • JAVA重写重载的区别

    万次阅读 多人点赞 2018-07-11 22:04:05
    重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个...
  • 分布式一致性协议

    千次阅读 2019-01-26 19:52:04
    一致性模型 一致性(Consistency)是指多副本(Replications)问题中的数据一致性。关于分布式系统的一致性模型有以下几种: 强一致性 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过...
  • 笔者在一次对接接口时候出现一个问题:一个json串中带有中文,我想直接测试加密结果是否一致,结果使用本地main方法加密没问题,后面在程序里加密调用接口发现签名验证不通过,后面才发现三tomcat处理中文时的问题。...
  • 分布式一致性协议Raft & Paxos 简单 v.s. 完美
  • 让微信小程序页面界面 UI 统一:WeUI 前端样式库 微信里使用的 H5 页面是相当多,特别是最近开发内测的小程序更是火爆,为了能让页面以及微信小程的界面能与微信统一,让用户看起来就像是微信内置的功能或页面,...
  • 引入后空格tab键问题报错 由于这个原因引起的错误需要在编辑器修改配置,以sublime为例,打开设置-&gt;用户设置 { "color_scheme": "Packages/Boxy Theme/schemes/Boxy Tomorrow.tmTheme"...
  • 早期的Android OS,没有统一的设计,UI是自定义的,不同厂商的设备在不同的版本间徘徊,androd手动刷romiphone的越狱一样纠结 。 多系统版本带来的问题就是缺乏交互、UI的一致性,外加硬件厂商HTC、摩托罗拉、...
  • 如何保障mysqlredis之间的数据一致性? 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样...
  • 由于种种原因,项目中需要同时继承mybatis, jpa,有个疑问是 使用mybatis 的service 调用 jpa 实现的 service ,事务是否会生效,即 两个service 是否用的同一个事物,事务管理使用spring 的声明式事务, 使用 @...
  • 我们经常会听到一些“高大上”却又比较“迷惑”的词汇,比如,ACIDCAP中的"C"是否是同一含义、Snapshot Isolation(SI)Serializable Snapshot Isolation(SSI)区别是什么、SerializableLinearizable是一个...
  • Zookeeper Eureka 区别

    2020-11-26 15:13:34
    主要区别 zookeeper的目标是一个分布式的协调系统,用于进行资源的统一管理,为了满足CP而进行设计。 eureka的目标是一个服务注册发现系统,专门用于微服务的服务发现注册,按照满足AP而进行设计。 Zookeeper ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,964
精华内容 75,185
关键字:

一致和统一的区别