如何实现分布式锁

分布式锁服务在分布式系统中是一个非常通用的需求。互联网行业有基于Zookeeper实现分布式锁服务的方案,也有提出基于Redis实现分布式锁服务的方案。企业级应用方面,开源Linux上,Redhat Linux HA套件中提供了DLM(Distributed Lock Manager),商用操作系统OpenVMS也提供了DLM。下面的这篇文章,是我于18年初的时候读到的,最近又重读一遍,作为回顾总结。翻译自Martin Kleppmann的博文:How to do distributed locking

Apache Kafka的分布式系统消防员(Controller Broker)

作为分布式系统的Kafka,在管理、协调分布式节点,处理各类分布式系统事件时,都依赖于Controller Broker来完成。Controller Broker的工作包括:

  1. Broker节点上、下线时,处理Broker节点的故障转移。
  2. Topic新建或删除时,Partition扩容时,处理Partition的分配。
  3. 管理所有Partition的状态机,以及所有Replica的状态机,处理状态机的变化。

以下内容介绍了Controller Broker的具体功能、逻辑,它翻译自:Apache Kafka’s Distributed System Firefighter

B-Tree数据结构总结

对B树的理解一直停留在概念阶段,一直也想了解一些细节。趁着过年这段时间,把《算法导论》关于B树的章节(第18章)整个过了一遍。结合书上的说明,自己实现了一把,留为总结。以下文字内容多摘自《算法导论》,伪代码部分根据我自己的理解添加了注释。

C++内存屏障(内存顺序)总结

原子操作(atomic)是无锁编程(Lock-Free Programming)的基础。以往,要使用atomic操作,我们一般会使用gcc内置的原子操作接口,或者是基于指定平台硬件指令封装的atomic库。c++11直接引入了atomic库,为c++定义了原子类型操作接口以及内存模型,极大的方便了我们的使用。我尝试通过本文对C++11中内存屏障(内存顺序)的一些基本概念和使用情况进行总结。

什么是内存屏障(Memory Barriers)

内存屏障是一种底层原语,在不同计算机架构下有不同的实现细节。本文主要在x86_64处理器下,通过Linux及其内核代码来分析和使用内存屏障

对大多数应用层开发者来说,“内存屏障”(memory barrier)是一种陌生,甚至有些诡异的技术。实际上,他常被用在操作系统内核中,用于实现同步机制、驱动程序等。利用它,能实现高效的无锁数据结构,提高多线程程序的性能表现。本文首先探讨了内存屏障的必要性,之后介绍如何使用内存屏障实现一个无锁唤醒缓冲区(队列),用于在多个线程间进行高效的数据交换。

Kafka数据丢失及最新改进策略

上周在测试环境,无意间连续把两台kafka的磁盘打爆,导致broker相继挂掉。当我清理完磁盘,重启两台broker后,发现很有意思的现象:kafka数据丢失!从我们的处理日志上, 我们观察到有向一个topic的两个partition,分别写入了3条和7条,共计10条消息。但是,当我们恢复两台broker后,通过命令查看,发现这时该topic两个partition消息数量竟然都是0,而从zk上consumer group记录的信息来看,有cg的确已经消费过该topic的数据,且cg在对应partition上的offset分别为3,7。

|