0

2342

分布式系统事务一致性解决方案

本文首发于InfoQ,版权所有,请勿转载!!!

http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency

开篇

在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring、JDBC、ADO.NET),结合关系型数据库自带的事务管理机制来实现事务性的需求。关系型数据库通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

而大型互联网平台往往是由一系列分布式系统构成的,开发语言平台和技术栈也相对比较杂,尤其是在SOA和微服务架构盛行的今天,一个看起来简单的功能,内部可能需要调用多个“服务”并操作多个数据库或分片来实现,情况往往会复杂很多。单一的技术手段和解决方案,已经无法应对和满足这些复杂的场景了。 分布式系统的特性

对分布式系统有过研究的读者,可能听说过“CAP定律”、“Base理论”等,非常巧的是,化学理论中ACID是酸、Base恰好是碱。这里笔者不对这些概念做过多的解释,有兴趣的读者可以查看相关参考资料。CAP定律如下图:

在分布式系统中,同时满足“CAP定律”中的“一致性”、“可用性”和“分区容错性”三者是不可能的,这比现实中找对象需同时满足“高、富、帅”或“白、富、美”更加困难。在互联网领域的绝大多数的场景,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

分布式事务

提到分布式系统,必然要提到分布式事务。要想理解分布式事务,不得不先介绍一下两阶段提交协议。先举个简单但不精准的例子来说明:

第一阶段,张老师作为“协调者”,给小强和小明(参与者、节点)发微信,组织他们俩明天8点在学校门口集合,一起去爬山,然后开始等待小强和小明答复。

第二阶段,如果小强和小明都回答没问题,那么大家如约而至。如果小强或者小明其中一人回答说“明天没空,不行”,那么张老师会立即通知小强和小明“爬山活动取消”。

……

乐果   发表于   2017 年 01 月 11 日 标签:MQ 继续阅读

0

2820

mysql存储函数:创建自增ID

有时候,我们不想依赖MySQL数据表的主键“自增ID”来作为 “业务ID”

最简陋的方法是:单独数据表 + 函数(存储函数),下面简要说明操作步骤

1.创建生成多个表的序列号的数据维护表

CREATE TABLE seq (
name varchar(20) NOT NULL,
val int(10) UNSIGNED NOT NULL,
PRIMARY KEY  (name)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

  

2.插入几条初始化数据

INSERT INTO seq VALUES('one',100);
INSERT INTO seq VALUES('two',1000);

  

3.创建函数以生成序列号

CREATE FUNCTION seq(seq_name char (20)) returns int
begin
 UPDATE seq SET val=last_insert_id(val+1) WHERE name=seq_name;
 RETURN last_insert_id();
end

   说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来 结束。为了避免冲突,首先用”DELIMITER &&“将MySQL的结束符设置为&&。最后再用”DELIMITER ;“来将结束符恢复成分号。这与创建触发器时是一样的。

……

乐果   发表于   2016 年 12 月 05 日 标签:mysql 继续阅读

0

2444

数据类型

笔记于2012-12-31, 百度空间。

现因百度空间封闭,故转载过来。

第一次了解“数据类型”这个概念,是学习javascript的时候。

js将数据分为两大类型:“基本类型”(或称“值类型”)和“引用类型”,二者的区别可以用一个经典的例子来说明:

……

乐果   发表于   2016 年 09 月 06 日 标签:JavaScriptPHPpython 继续阅读

0

2424

有所为,必有所不为

孟子曾说:“人有不为也,而后可以有为。”

自古圣贤就曾告诫我们,人要审时度势,决定取舍,选择重要的事情去做,而不做或暂时不做某些事情。 人的精力是有限的,只有放弃一些事情不做,才能在别的一些事情上做出成绩。

的确,有所为,必有所不为。我觉得非常有道理,对此我摘录了一位大师的感悟,不由的感同身受:

1、人的精力是有限的,有所为就必有所不为,而人与人之间的巨大区别就在于所为所不为的不同取向。

2、人活世上,有时难免要有求于人和违心做事。但是,我相信,一个人只要肯约束自己的贪欲,满足于过比较简单的生活,就可以把这些减少到最低限度。远离这些麻烦的交际和成功,实在算不得什么损失,反而受益无穷。我们因此获得了好心情和好光阴,可以把它们奉献给自己真正喜欢的人,真正感兴趣的事,而首先是奉献给自己。对于一个满足于过简单生活的人,生命的疆域是更加宽阔的。

……

乐果   发表于   2016 年 05 月 05 日 标签:随笔 继续阅读

0

5552

从阿里云RDS的mysql(master)同步到ECS中的mysql(slave)

1、下载二进制备份文件,解压:略

2、还原数据:

./innobackupex --defaults-file=/data/service/mysql/data/backup-my.cnf --apply-log /data/service/mysql/data

报错:

160408 13:49:57 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

./innobackupex version 2.3.4 based on MySQL server 5.6.24 Linux (x86_64) (revision id: e80c779)
xtrabackup: cd to /data/service/mysql/data
xtrabackup: This target seems to be not prepared yet.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(2113955558)
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:200M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 1
xtrabackup:   innodb_log_file_size = 2097152
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup:   innodb_data_home_dir = ./
xtrabackup:   innodb_data_file_path = ibdata1:200M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 1
xtrabackup:   innodb_log_file_size = 2097152
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
InnoDB: Using atomics to ref count buffer pool pages
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Memory barrier is not used
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, size = 100.0M
InnoDB: Completed initialization of buffer pool
InnoDB: Log file ./ib_logfile1 is of different size 50331648 bytes than other log files 2097152 bytes!
xtrabackup: innodb_init(): Error occured.

……

乐果   发表于   2016 年 04 月 08 日 标签:mysql 继续阅读

较旧的文章 较新的文章
热评文章