Calvin's Marbles


  • 首页

  • 关于

  • 归档

  • 标签

  • 搜索

Raft共识算法

发表于 2019-03-12

本文来自我的文章分布式一致性和分布式共识协议太长,因此将其中的Raft部分单独列出来作为一篇文章。

Raft协议的设计者们认为Paxos协议非常难于理解,并且需要作出很多修改才能够应用到工程中,因此设计了偏重于实现的Raft协议,这甚至体现在他们的论文标题《In Search of an Understandable Consensus Algorithm(Extended Version)》上,此外作者也提供了一个C++版本的实现liblogcabin。Raft协议主要分为三个模块,Leader election、Log replication和Safety。
Raft将服务器节点分为Leader、Candidate和Follower三种,协调者被称为领袖/主(Leader),参与者被称为群众(Follower)。相对于其他的协议,Raft中的Leader更强,这体现在:

  1. Leader是唯一的。
  2. Log entries只能从Leader发送给其他服务器,事实上Follower不主动发送,而只响应来自Leader和Candidate的请求。
  3. 客户端只能和Leader交互,如果客户端首先连上了Follower,那么会被Follower转发给Leader。
  4. Raft的独特之处还在于其在Leader election的过程中Raft使用了随机计时器进行超时。此外,Raft还提供了一个joint consensus的算法处理Membership changes的问题。
阅读全文 »

Jepsen使用

发表于 2019-02-20

Jepsen是一款用来验证分布式系统安全性的工具。

阅读全文 »

通用生产力软件工具指南

发表于 2019-01-22

最近换了新电脑,进行配置的时候遇到很多坑,这里记录一下常用的软件的一些注意事项。

阅读全文 »

多态:以 Haskell 为例

发表于 2019-01-16

一般地来说,一个值,或者说一个函数,是多态的,当它可以是多种类型的。Haskell 原始支持的多态分为参数多态和 ad-hoc 多态。
在文章haskell学习笔记中提到了 Parametric polymorphism、higher kinded polymorphism 和 higher rank polymorphism 三个概念,我们将在本文中详细探讨。

阅读全文 »

曼谷/芭提雅游记

发表于 2019-01-15

今年去泰国跨年(避寒)了,30号到4号,一共玩了五天。

阅读全文 »

stateful constexpr

发表于 2019-01-12

通过 stateful constexpr,我们希望实现以下功能

1
2
3
4
5
6
int main () {
constexpr int a = f ();
constexpr int b = f ();

static_assert (a != b, "fail");
}

通过在编译器实现副作用,可以在编译期实现容器、查看某个类是否已经被实例化、查看一个函数在决议后的地址,甚至实现反射。

我们还能看到:

  1. 友元的一个有趣的应用
  2. Argument-dependent lookup
  3. C++ 模板实例化规则
阅读全文 »

MIT6.824做题笔记

发表于 2018-12-29

MIT 6.824 2018的Lab。

阅读全文 »

通过C++预处理实现if

发表于 2018-12-07

C++的预处理机制令人诟病的一点是在不同的编译器中的表现是不同的,在boost/preprocessor/config/config.hpp列举出了非常多的case,所以在本篇文章中我们只考虑g++-7的编译结果。此外,出于便于阅读的考虑,对名字进行了简化,去掉了诸如BOOST_PP等前缀。

阅读全文 »

Python中join不能响应信号的问题

发表于 2018-08-01

在文章subprocess模块用法中介绍了Python中的threading.Thread.join()时不能响应信号的问题。这个问题被Python官方标记为Bug。
Python官方的Issue指出这个Bug与Python的signal、基础线程库thread(C实现)和高级线程库threading(Python封装)都有关,下面首先概览这三个模块的实现,接着通过编译调试的方式来观赏这个Bug的具体过程。

阅读全文 »

Redis底层对象实现原理分析

发表于 2018-07-23

我将直接根据github上的unstable分支代码分析。主要是2018年7月版本(dict实现的大部分)的和2020年8月版本(其他部分)的,所以可能会有细微差别。因为Redis的代码比较好读,并且质量很高。这里还推荐《Redis设计与实现》一书,它介绍了Redis中部分比较有趣的设计思路,可惜还有些没有覆盖到,本文中对这些有趣的设计也进行了论述。
Redis中主要包含了字符串STRING、列表LIST(双向链表)、集合SET、哈希表HASH、有序集合ZSET五种最常见的类型。在后续的版本中,还提供了bitmap、geohash、hyperloglog、stream这四种类型。
这些对象依赖于一些内部结构,包括字符串(SDS)、哈希表(dict)、链表(list)、跳表(zskiplist)、压缩双向表(ziplist)、快表等。注意出于性能原因,一个对象的实现往往根据具体的内容而选择不同的实现。列举如下:

  1. STRING
    使用int、sds(raw)或者embstr。
    下面的类型也是使用STRING的存储的:
    1. hyperloglog
    2. bitmap
  2. HASH
    使用dict或者ziplist方案。
  3. LIST
    3.0是使用list或者ziplist的方案。
    目前使用快表。
  4. SET
    使用dict或者intset的方案。
  5. ZSET
    视数据规模选用ziplist和skiplist+dict的方案。
    下面的类型也是使用ZSET的存储的:
    1. GEOHASH

本文中不介绍的是,它们在系列的其他文章中讲解:

  1. Redis基础设施
  2. Redis Sentinel
  3. Redis Cluster
  4. Redis AOF/RDB

最后,本文的主体部分已经完成,但后续仍然会进行修订,或者补充。

阅读全文 »
1…141516…27
Calvin Neo

Calvin Neo

270 日志
155 标签
RSS
GitHub Twitter Weibo
Links
  • xqq
  • wenwen
  • zyyyyy
© 2015 - 2026 Calvin Neo   Hosted by Coding Pages
版权声明
由 Hexo 强力驱动
主题 - NexT.Muse