Masutangu

也許我這一生 始終在追逐那顆九號球

告别 2019

马上就 2020 年了,翻看去年年终总结《2018,值得反思的一年》对自己立下的期望:“2019年,我想成为一名优秀的工程师,成为真真正正的技术工程师”时,内心是无比惭愧的。 先说说今年做了什么吧,今年年初就计划写一系列介绍分布式的文章,因为我在学习过程中,发现很难理清楚分布式系统中各个概念的关联性,举例来说,初次接触逻辑时钟和版本向量这两个概念会觉得很类似,为什么有了逻辑时钟还需要版本向...

漫谈分布式:线性一致性与共识算法

前言 这篇文章是《漫谈分布式》系列文章的第五篇,主题为线性一致性和共识算法,以理清概念为主,不涉及具体的共识算法,如有兴趣参考文章 MIT 6.824 学习笔记(二) 介绍了 Raft 算法以及 The Part-Time Parliament 论文笔记 记录了 Paxos 论文的笔记。 一致性保证 大部分分布式数据库都至少提供最终一致性。但因为其表现和单线程读写变量并不一致,单线程并...

漫谈分布式:事务和隔离性级别

前言 这篇文章是《漫谈分布式》系列文章的第四篇,重点讨论单点数据库中事务的 ACID 特性中的隔离性、所提供的不同隔离级别:提交读(Read Committed)、可重复读(Repeatable Read)、快照隔离(Snapshot Isolation)、可串行化(Serializability)以及不同隔离级别的实现和开销,关于分布式数据库的事务将在下篇文章讨论。 事务 事务是一系...

漫谈分布式:数据分区

前言 这篇文章是《漫谈分布式》系列文章的第三篇,主要内容为分布式系统中划分数据的方式和分区的再平衡策略。 数据划分 Partitioning 上一篇文章《漫谈分布式:数据复制》 提到数据复制可以提高系统的可用性。但是当数据量过大,复制整个数据集显然不现实,此时需要将数据进行划分(partitioning),也称为 sharding。数据划分带来最大的好处是提高了系统的扩展性,将数据划分...

漫谈分布式:数据复制

前言 这篇文章是《漫谈分布式》系列文章的第二篇,讲解分布式系统中数据复制的方式,讨论了分布式系统的一致性模型,以及在分布式系统中如何确定事件时序,如何解决不同数据复制方式下的一致性问题和写冲突问题。 数据复制 复制即将同一份数据备份在多台不同的节点,节点之间网络互通。为什么需要复制?复制能带给什么好处? 数据多地部署,用户可以选择就近接入,减少时延。 提高可用性,部分节点挂...

漫谈分布式:数据库的设计思想与实现

前言 这篇文章是《漫谈分布式》系列文章的第一篇,主要讨论数据库中各类数据模型,以及数据库存储引擎中索引结构的实现。 数据模型 Data Model 在业务研发初期,数据模型的选型及其重要。不同的数据模型支持的操作集各不相同,所适用的业务场景也不同。因此在对数据模型进行选型时,不仅要熟悉业务,基于业务场景出发,从业务发展的长远角度来做决策,同时也需要深入了解不同数据模型的优缺点及适用场景...

日本之旅

拖了一个月,终于闲下来整理国庆日本之旅,写一篇流水账,记录下生活的小美好。这次旅行的路线是东京 (5d)-京都(1.5d)-大阪(1.5d),共八天。 Day 1 由于没有买到蛇口港船票的缘故,只好清晨五点摸着黑从家打车到皇岗口岸过关。过关后坐商务车大概一个小时的车程,七点多到达香港机场,十点半的飞机,下午四点(当地时间)到达成田机场。酒店靠近秋叶原地铁站附近,之前查好的路线图如下: ...

回顾 19 年上半年

今年以来还没发布过博客。一来上半年确实很忙,记不清多少个夜晚是凌晨后下班,甚至还有通宵待命,加上还要忙装修的事情,整得有点累,自己状态也一般,节奏经常被打乱。另外其实也没有算很偷懒,反思了下去年写的博客虽然数量多,但在系统性和深度方面有所欠缺,常常自嘲写的是水文。所以今年特别想写一些更高质量的文章。定的主题是分布式系统,目前已经写好了大纲和草稿,姑且算第一版吧。但距离能够发表还需要花费很多时...

2018,值得反思的一年

今年这一年,有好有坏,似乎有点两极分化。好的一方面,职级有了突破,也买了房安了家。不好的方面,工作上没什么建树,实话实说。 最近我产生了很多矛盾奇怪质疑的想法。对工作需求的质疑,对工作方式工作效率的不满,另一方面却又应该坚持自己的职业素养,把事情完成。当我意识到我无力改变什么,又不认同 “要么忍,要么滚” 的职场 “哲学” ,我陷入了深深的自我矛盾中。是否应该独善其身,机器人一般的完成无聊...

Libco 之共享栈

代码埋点 结构体: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 struct stStackMem_t { stCoRoutine_t* ocupy_co; // 被哪个协程占用 int stack_size; char* stack_bp; //stack_buffer + stack...