| 
                         在 SOFAJRaft 中发起一次线性一致读请求的代码展示: 
- // KV 存储实现线性一致读 
 - public void readFromQuorum(String key, AsyncContext asyncContext) { 
 -  // 请求 ID 作为请求上下文传入 
 -  byte[] reqContext = new byte[4]; 
 -  Bits.putInt(reqContext, 0, requestId.incrementAndGet()); 
 -  // 调用 readIndex 方法, 等待回调执行 
 -  this.node.readIndex(reqContext, new ReadIndexClosure() { 
 -  @Override 
 -  public void run(Status status, long index, byte[] reqCtx) { 
 -  if (status.isOk()) { 
 -  try { 
 -  // ReadIndexClosure 回调成功,可以从状态机读取最新数据返回 
 -  // 如果你的状态实现有版本概念,可以根据传入的日志 index 编号做读取 
 -  asyncContext.sendResponse(new ValueCommand(fsm.getValue(key))); 
 -  } catch (KeyNotFoundException e) { 
 -  asyncContext.sendResponse(GetCommandProcessor.createKeyNotFoundResponse()); 
 -  } 
 -  } else { 
 -  // 特定情况下,比如发生选举,该读请求将失败 
 -  asyncContext.sendResponse(new BooleanCommand(false, status.getErrorMsg())); 
 -  } 
 -  } 
 -  }); 
 - } 
 
  
应用场景
    - Leader 选举;
 
    - 分布式锁服务,比如 Zookeeper,在 SOFAJRaft 中的 RheaKV 模块提供了完整的分布式锁实现;
 
    - 高可靠的元信息管理,可直接基于 SOFAJRaft-RheaKV 存储;
 
    - 分布式存储系统,如分布式消息队列、分布式文件系统、分布式块系统等等。
 
 
使用案例 
    - RheaKV:基于 SOFAJRaft 实现的嵌入式、分布式、高可用、强一致的 KV 存储类库。
 
    - AntQ Streams QCoordinator:使用 SOFAJRaft 在 Coordinator 集群内做选举、使用 SOFAJRaft-RheaKV 做元信息存储等功能。
 
    - Schema Registry:高可靠 schema 管理服务,类似 kafka schema registry,存储部分基于 SOFAJRaft-RheaKV。
 
    - SOFA 服务注册中心元信息管理模块:IP 数据信息注册,要求写数据达到各个节点一致,并且在少数派节点挂掉时保证不影响数据正常存储。
 
 
实践 
一、基于 SOFAJRaft 设计一个简单的 KV Store 
 
二、基于 SOFAJRaft 的 RheaKV 的设计 
 
功能名词 
PD 
    - 全局的中心总控节点,负责整个集群的调度,不需要自管理的集群可不启用 PD (一个 PD 可管理多个集群,基于 clusterId 隔离)。
 
 
Store 
    - 集群中的一个物理存储节点,一个 Store 包含一个或多个 Region。
 
 
Region 
    - 最小的 KV 数据单元,每个 Region 都有一个左闭右开的区间 [startKey, endKey), 可根据请求流量/负载/数据量大小等指标自动分裂以及自动副本搬迁。
 
 
特点 
    - 嵌入式
 
    - 强一致性
 
    - 自驱动
 
    - 自诊断, 自优化, 自决策
 
 
以上几点(尤其2、3) 基本都是依托于 SOFAJRaft 自身的功能来实现,详细介绍请参考 SOFAJRaft 文档 。 
致谢
感谢 braft、etcd、tikv 贡献了优秀的 Raft 实现,SOFAJRaft 受益良多。                         (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |