Blog

TrueTime授时机制

Content #

Spanner 采用的方案是 TrueTime。它的时间源是 GPS 和原子钟,所以属于多时间源和物理时钟,同时它也采用了多点授时机制,就是说集群内有多个时间服务器都可以提供授时服务。

TrueTime 是会出现时光倒流的。例如,A、B 两个进程先后调用 TrueTime 服务,各自拿到一个时间区间,如果在其中随机选择,则可能出现 B 的时间早于 A 的时间。不只是 TrueTime,任何物理时钟都会存在时钟偏移甚至回拨。

单个物理时钟会产生误差,而多点授时又会带来整体性的误差,那 TrueTime 为什么还要这么设计呢?

因为它也有两个显著的优势:

  1. 高可靠高性能,多时间源和多授时点实现了完全的去中心化设计,不存在单点;
  2. 支持全球化部署,客户端与时间服务器的距离也是可控的,不会因为两者通讯延迟过长导致时钟失效。

Viewpoints #

From #

05 | 全局时钟:物理时钟和逻辑时钟你Pick谁?

社会贴现率

Content #

贴现率原本是人们用未到期的债券作抵押向银行融通资金时,银行扣除利息损失的折扣率,实际上就相当于当时流行的利息率。我们知道,当通货膨胀率很高时,利息率必定跟着上升,否则想借钱的人会借不到钱,人们也不愿意把钱借给别人或存入银行,所以通胀率、利息率、贴现率三者之间有着密切的关系。

经济学中肯定了未来一元钱的价值必定低于当前一元钱。如果某甲答应给某乙一元钱,可以现在马上就支付,也可以等一年之后再支付。试问某乙选择马上从某甲处支得还是一年之后再得到它?答案无疑是马上能得到那一元钱。

首先因为一年以后的事可能有变化。其次,即使有百分之百的把握甲不会爽约,但现在就支取丝毫也没有坏处,乙还可以将它存入银行,到年末还可拿利息。乙选择马上得到它,说明当前一元钱的价值比一年后一元钱的价值高。为了确切地算出未来一元钱的价值和今天一元钱的价值相差多少,经济学家用了贴现率,大体上也就是利息率。如果年息是10%,那么一年后的1.10元相当于今天的1.00元。贴现率越高,将来的钱越不值钱,相对而言,现在的钱显得更重要。不但将来发生的收益因贴现而变得不那么重要,将来发生的损失也显得不重要。

举例说,一座核电站运行30年或40年报废之后,反应堆的堆址将带有放射性,处理这个带有放射性的堆址要花费巨大成本。如果预期未来几十年的贴现率很高,这笔成本就变得不重要。当贴现为10%时,30年后1亿元的损失只相当于今天的570万元[因为5 700 000×(1+0.1)30=100 000000],今天的这笔损失只及30年后的1/17。一个高的贴现率相当于未来的损益不重要,只有眼前才是重要的。

如果将经济贴现率的概念推广到更一般的社会活动,可以得出社会贴现率的概念,它表明人们对将来发生的事有多重视。一个高的社会贴现率,意味着人们对未来的责任感减弱,说明人们只追求眼前利益,变得鼠目寸光。商业上的毁约,政治上的失信,对设备保养掉以轻心,对环境破坏无动于衷,对下一代人不负责任,甚至今朝有酒今朝醉,都是社会贴现率高所表现的心态。所以社会贴现率上升是一个危险的信号,它导致社会的不稳定,人与人的联系减弱,机会主义泛滥。

社会贴现率既然如此重要,我们有办法测定它吗?经济贴现率是可以观察的,然而社会贴现率却无从观察,而它又确实存在。许多经济学家和社会学家虽然未能提出一个客观的测定办法,却了解了社会贴现率依赖于哪些因素而变动。

首先它依赖于经济贴现率,这是不言自明的。我们知道,高通胀导致高贴现率,从而会导致高的社会贴现率。经济学家常将通货膨胀仅看成是货币现象,而不重视它的后果。高通胀是对未来预期不确定的原因之一,它造成人们恍恍惚惚,暴躁不安。即使人生活在富有诗意的田园景色中,一想到笼罩着一切的高通胀,就会感到担忧。其次,社会的安定,特别是政治安定对社会贴现率有重大影响。

在一个战争环境中,人们生死未卜,与处于安定环境的人相比,肯定会有更高的社会贴现率。同样的理由,人的平均剩余寿命会影响社会贴现率,平均剩余寿命越高,社会贴现率越低。对于一个即将于次日被判处死刑的人而言,他的贴现率极高,明天以后的事对他已没有任何意义。与此相联系的是社会的犯罪率、交通事故率、意外死亡率、职业保障程度、各种保险所能覆盖的程度,它们都会对社会贴现率产生影响。甚至人民的平均教育水平,人与人互相依赖的程度,社会的道德风尚都会反映到人们对未来的预期,从而影响社会贴现率。

From #

弗里德曼关于结果平等的纸牌比喻

Content #

美国的诺贝尔经济学奖金获得者米尔顿·费里德曼在《自由选择》艺术(商务印书馆中文版)第141页举了一个例子:“晚上纸牌开具的时候,各个赌家的筹码的数量是相等的。但玩了一段时间后,数量就会不相等了。当晚收局时,某些人成了大赢家,另一些成了大输家。按照平等的理想,是不是赢家要要把赢的钱还给输家呢?如果真是这样,游戏就会变得毫无趣味,连输家也会觉得没意思。他们也许会玩上一两次,但如果他们知道不会输赢,收局时还是会同开局一样的话,他们还会再玩吗?“这一段分析说明,结果平等的实施非但有赢家要向输家付出钱的不公平问题,而且游戏变得没有任何意义,等于说人生变得没有意思,这个世界也和死的一样。

From #

租的消散定理

Content #

在经济学中有一条称为“租的消散定理”的理论。意思是说任何一种可用资源,不管是自然资源还是人造的生产资料,如果所有权不明确或不加限制地任人使用,一定会遭到严重的破坏;同时争夺资源的代价会越来越高,最后使资源的使用价值降低到与夺取资源所要付出的代价相等。

例如发现一个金矿,如果对采金不加限制的话,就会涌进大批的采金人,而且他们必然争夺其中最容易开采、品相又高的部分。由于滥采滥挖,稍次的矿砂被抛弃,造成资源的浪费和整个矿山可用资源的迅速减少;另一方面,对资源的争夺又会引起采金人之间的斗殴;最后达到一种均衡状态,即金矿对外人不再有吸引力,因而也没有更多的人涌进,因为采金得到的利益被斗殴所支付的代价抵消了。不仅金矿如此,池塘内的鱼、山上的野兽、树上的果子、供公家使用的自行车,都会陷入同样的境地。

From #

消除不劳而获的彻底办法是消除无偿贡献

Content #

禁止乱发奖金和分东西曾经三令五申地加以强调,可是始终不见效。其原因正是大多数人并未想通,无偿贡献和不劳而获是同一件事的两个方面。有了无偿贡献必有不劳而获。政策上提倡无私奉献,又禁止不劳而获,实际上相互矛盾。消除不劳而获的彻底办法是消除无偿贡献,而且这一原则完全符合我们一贯强调的“按劳分配”,将劳动创造出的价值返回到创造价值的人。而要做到这一点只有依靠劳动市场这唯一的途径。

From #

一般均衡条件

Content #

个人的优势、地区的优势是在交换的竞争中体现出来的。南方有种甘蔗的优势,是从和北方的交换中发现的。究竟什么地方算南方,它可以向北推移到何种程度,这也是从交换的竞争中发现的。而且随着人们吃糖习惯的改变、人口的增长、国际贸易的需要等,适宜于种甘蔗的这条分界线经常在移动。当分界线一带的农民决定自己是否应种甘蔗时,他们并不考虑国家计划部门的指示,而是取决于市场信息。他们服从市场信息指导的原因在于他们要谋求自己的利益。这个例子说明,人类社会的分工是通过交换和竞争形成的。它们的基本推动力是个人的利益,其结果是全社会得益。

这样一种利益关系的变革,不能不对道德观念产生重大影响。在自然经济下,个人要帮助别人必须自己有所牺牲;个人要得到利益必然损害别人的利益。这是一种“零和对局”。但是交换却可以使各方同时得益,而且参与交换的动机是追求个人的利益,因此追求个人利益就不是非道德的了。这里有一个非常重要的前提,即个人追求利益符合全社会的利益是有条件的,这个条件就是社会有一个均衡的价格系统。经济学家称之为一般均衡条件,即所有商品的价格统统都达到了供需均衡。因为人们追求利益是以价格或者金钱来衡量的。

如果价格扭曲,人们依据价格所作的选择就会有所不同。此时个人追求利益将和社会目标相左。在一般均衡条件下个人的选择符合社会目标,因此才有经济自由主义。它认为个人的选择不应该受到干扰。这和计划经济的观念截然相反。也许有人会问,这个一般均衡条件如何才能实现?答复也还是在公平竞争的条件下的个人自由选择。在一般均衡条件实现之前有些个人利用扭曲的价格获利(例如我国在双轨制价格下出现的官倒,将计划轨中的物资卖到市场轨经济),这将有损于社会。但是经过一番调整,一般均衡条件能够逐渐被建立起来。我国改革中实行双轨制就是经历了这样的过程。当时有不少人发了不义之财,但是扭曲的价格最终被调整过来。现在我们的价格除了少数垄断性商品和服务之外基本上处于一般均衡条件。

From #

计算校验码位数

Content #

如果数据位有 K 位,校验位有 N 位。那么需要满足下面这个不等式,才能确保能够对单比特翻转的数据纠错。这个不等式就是:

K + N + 1 <= 2^N

在有 7 位数据位,也就是 K=7 的情况下,N 的最小值就是 4。4 位校验位,其实最多可以支持到 11 位数据位。

简单的数据位数和校验位数的对照表。

Viewpoints #

From #

50 | 数据完整性(下):如何还原犯罪现场?

常见授时方案

Content #

区分授时机制抓住三个要素就可以了。

  1. 时间源:单个还是多个
  2. 使用的时钟类型:物理时钟还是混合逻辑时钟
  3. 授时点:一个还是多个

根据排列组合,一共产生了 8 种可能性,其中 NTP(Network Time Protocol)误差大,也不能保证单调递增,所以就没有单独使用 NTP 的产品;还有一些方案在实践中则是不适用的(N/A)。因此常见的方案主要只有 4 类。

Viewpoints #

From #

05 | 全局时钟:物理时钟和逻辑时钟你Pick谁?

远端写入时间戳异常

Content #

有些分布式数据库会有一个限制条件,就是所有的 Leader 节点必须固定在同城主机房,而这就导致了资源使用率大幅下降。TiDB 和 OceanBase 都是这种情况。

Raft 协议下,所有读写都是发送到 Leader 节点,Follower 节点是没有太大负载的。Raft 协议的复制单位是分片级的,所以理论上一个节点可以既是一些分片的 Leader,又是另一些分片的 Follower。也就是说,通过 Leader 和 Follower 混合部署可以充分利用硬件资源。

但是如果主副本只能存在同一个机房,那就意味着另外三个机房的节点,也就是有整个集群五分之三的资源,在绝大多数时候都处于低负载状态。这显然是不经济的。

这个限制条件是怎么来的,一定要有吗?

其实,这个限制条件就是全局时钟导致的。具体来说,就是单时间源的授时服务器不能距离 Leader 太远,否则会增加通讯延迟,性能就受到很大影响,极端情况下还会出现异常。

增加延迟比较好理解,因为距离远了嘛。那异常是怎么回事呢?

我们把这种异常称为“远端写入时间戳异常”,它的发生过程是这样的:

  1. C2 节点与机房 A 的全局时钟服务器通讯,获取时间。此时绝对时间(At)是 500,而全局时钟(Ct)也是 500。

  2. A3 节点也与全局时钟通讯,获取时间。A3 的请求晚于 C2,拿到的全局时钟是 510,此时的绝对时钟也是 510。

  3. A3 节点要向 R2 写入数据,这个动作肯定是晚于取全局时钟的操作,所以绝对时间来到了 512,但是 A3 使用的时间戳仍然是 510。写入成功。

  4. 轮到 C2 节点向 R2 写入数据,由于 C2 在异地,通讯的时间更长,所以虽然 C2 先开始写入动作的流程,但却落后于 A3 将写入命令发送给 R2,此时绝对时间来到了 550,而 C2 使用的时间戳是 500。A3 与 C2 都要向 R2 写入数据,并且是相同的 Key,数据要相互覆盖的。这时候问题来了,R2 中已经有了一条记录时间戳是 510,已经提交成功,稍后又收到了一条时间戳是 500 的记录,这是 R2 只能拒绝 500 的这条记录。因为后写入的数据使用更早的时间戳,整个时间线就会乱掉,否则读取的进程会先看到 510 的数据,再看到 500 的数据,数据一致性显然有问题。

    ...

两地三中心五副本

Content #

比较典型的分布式数据库部署模式是两地三中心五副本。这种模式下,每个分片都有 5 个副本,在同城的双机房各部署两个副本,异地机房部署一个副本。

这个模式有三个特点:

  1. 异地备份

保留了“异地容灾”模式下的数据同步功能,但因为同样要保证低延迟,所以也做不到 RPO(Recovery Point Objective) (恢复点目标)为零。

  1. 容灾能力

如果同城机房有一个不可用或者是同城机房间的网络出现故障,异地机房节点的投票就会发挥作用,依然可以和同城可用的那个机房共同达成多数投票,那么数据库的服务就仍然可以正常运行,当然这时提交过程必须要异地通讯,所以延迟会受到一定程度影响。

  1. 同城访问低延迟

由于 Raft 或 Paxos 都是多数派协议,那么任何写操作时,同城的四个副本就能够超过半数完成提交,这样就不会因为与异地机房通讯时间长而推高数据库的操作延迟。

两地三中心虽然可以容灾,但对于异地机房来说 RPO 不为零,在更加苛刻的场景下,仍然受到挑战。这也就催生了三地五副本模式,来实现 RPO 为零的城市级容灾。

Viewpoints #

From #

24 | 全球化部署:如何打造近在咫尺且永不宕机的数据库?