文档章节

Atomix getting start 浓浓的机翻

桂哥
 桂哥
发布于 04/27 10:26
字数 2053
阅读 187
收藏 0

概观

Atomix 2.1是用于构建容错分布式系统的全功能框架。Atomix将ZooKeeper的一致性与Hazelcast的可用性和性能相结合,使用一组定制通信API,一个分区Raft集群和一个多主协议来为构建分布式系统提供一系列高级基元。这些原语包括:

背景

Atomix最初是在2014年将它的姊妹项目Copycat(已弃用)作为爱好项目构思出来的。随着时间的推移,Copycat成长为Raft共识协议的成熟实现,并且Copycat和Atomix都在各种项目中投入使用。2017年开始开发新版本,并将Copycat和Atomix结合在Atomix 2.x中。此外,最初为在ONOS中使用而开发的项目的重要扩展被迁移到Atomix 2.x. Atomix现在作为开放网络基金会 ONOS的核心组件。

依赖管理

Atomix打包在一个模块层次结构中,用户只能依赖他们打算使用的功能。几乎所有用户都希望使用Atomix核心模块,该模块由atomix工件ID标识:

<dependencies>
  <dependency>
    <groupId>io.atomix</groupId>
    <artifactId>atomix</artifactId>
    <version>2.1.0-SNAPSHOT</version>
  </dependency>
</dependencies>

此外,大多数群集都配置有一组分区组。使用的分区组取决于系统的一致性,容错性和持久性要求。不同的用例可能需要不同的依赖关系。但与Atomix打包是两个主要协议:

  • atomix-raft

  • atomix-primary-backup

    io.atomix atomix 2.1.0-SNAPSHOT io.atomix atomix-raft 2.1.0-SNAPSHOT io.atomix atomix-primary-backup 2.1.0-SNAPSHOT

引导群集

与Atomix合作的第一步是形成一个集群。Atomix群集由两种类型的成员组成:

  • PERSISTENT 成员存在于群集配置中,无论是否可用
  • EPHEMERAL 成员根据其可用性加入和离开群集

要形成群集,通常需要引导一组节点。此外,如果使用分布式基元,则必须配置一个或多个分区组

使用Java API

用户可以使用各种方法在Atomix群集上运行。这些方法中最基本的是使用Java API,它提供了最好的性能,一致性和灵活性。

Atomix中的核心Java API是Atomix对象。Atomix严重依赖构建器模式来构建用于沟通和协调分布式系统的高级对象。

要创建一个新的Atomix实例,请创建一个Atomix构建器:

Atomix.Builder builder = Atomix.builder();

构建器应该配置本地节点配置:

builder.withLocalMember(Member.builder("node1")
  .withType(Member.Type.EPHEMERAL)
  .withAddress("localhost:5000")
  .build());

除了配置本地节点信息之外,还必须为每个实例配置一组_引导节点_,从中形成一个集群。首次启动集群时,所有实例都应提供相同的引导节点集合。

builder.withMembers(
  Member.builder("member1")
    .withType(Member.Type.EPHEMERAL)
    .withAddress("localhost:5000")
    .build(),
  Member.builder("member2")
    .withType(Member.Type.EPHEMERAL)
    .withAddress("localhost:5001")
    .build(),
  Member.builder("member3")
    .withType(Member.Type.EPHEMERAL)
    .withAddress("localhost:5002")
    .build());

Bootstrap节点可以是节点PERSISTENT或EPHEMERAL节点。需要强一致性的集群必须由一组PERSISTENT能够参与共识的节点引导。具有更宽松的持久性/一致性要求的群集可以使用EPHEMERAL可动态扩展的节点。

要详细了解各种类型的节点之间的差异,请参阅用户手册

最后,该实例必须配置一个或多个分区组。通用分区组可以使用配置文件进行配置

builder.addProfiles(Profiles.DATA_GRID);

通常情况下,需要强一致性保证的群集配置有CORE节点和至少一个RaftPartitionGroup群集,而群集设计用于DATA节点使用PrimaryBackupPartitionGroups的性能和可伸缩性。

Atomix atomix = builder.build();

调用start()实例来启动节点:

atomix.start().join();

该start()方法返回将在节点加入群集后完成的未来。

为了形成由CORE节点和Raft分区组组成的集群,大多数实例必须同时启动以允许Raft分区形成法定人数。在start()所有分区能够形成之前,该方法返回的未来将不会完成。如果您的Atomix实例在启动时无限期阻塞,请确保启用DEBUG日志记录以调试问题。

使用Atomix代理

如前所述,有多种方式可以管理和与Atomix集群进行交互。Atomix代理是Java API的一个简便替代方案。代理是一个独立的Atomix节点,其行为与Java节点的行为相似,但会为客户端交互提供REST API。代理可以用于在客户端 - 服务器体系结构中配置Atomix群集或提供对Atomix基元的多边形访问。

要使用Atomix代理,首先使用Maven下载并构建Atomix:

mvn clean package

项目建成后,要运行代理程序,$ATOMIX_ROOT必须设置环境变量:

export ATOMIX_ROOT=./

该代理程序与bin/atomix-agent脚本一起运行:

bin/atomix-agent -h

使用该-h选项查看代理脚本的选项列表。

在使用代理时,提供JSON或YAML配置文件是最方便的。配置文件也支持通过Java API支持的所有构建器配置。要配置代理,请创建一个atomix.yaml文件并定义群集:

atomix.yaml cluster: nodes: node1: type: ephemeral address: localhost:5001 node2: type: ephemeral address: localhost:5002 node3: type: ephemeral address: localhost:5003 profiles: - consensus - data-grid

Java API也支持配置文件。要Atomix使用配置文件配置实例,只需将该文件传递给Atomix构造函数即可。

配置文件创建完成后,通过引导配置的节点来启动群集:

bin/atomix-agent node1 -c atomix.yaml


bin/atomix-agent node2 -c atomix.yaml


bin/atomix-agent node3 -c atomix.yaml

可以在配置文件中指定本地节点,但在atomix-agent参数中指定本地实例名称可以使配置文件在所有实例之间共享。

创建一个Java客户端

所有的Atomix节点类型公开相同的API,并且能够执行与其对等体相同的功能。有状态节点和无状态节点,高度一致且最终一致的节点都可以在基元上操作,发送和接收消息以及管理集群。因此,Atomix不一定需要任何客户端节点。但是Atomix可以配置在各种不同的体系结构中,并且在有状态节点是独立代理的客户端 - 服务器体系结构中,客户端成为必需。

客户机节点的构建方式与所有其他节点相同,只是它们不参与复制,因此不是群集成员资格列表的成员。要配置客户端节点,只需创建一个CLIENT节点并将其指向一个或多个对等节点:

Atomix atomix = Atomix.builder()
  .withLocalMember(Member.builder("client1")
    .withAddress("localhost:6000")
    .build())
  .withMembers(
    Member.builder("member1")
      .withType(Member.Type.PERSISTENT)
      .withAddress("localhost:5000")
      .build(),
    Member.builder("member2")
      .withType(Member.Type.PERSISTENT)
      .withAddress("localhost:5001")
      .build(),
    Member.builder("member3")
      .withType(Member.Type.PERSISTENT)
      .withAddress("localhost:5002")
      .build());

最后,使用该start()方法启动实例将导致它加入群集:

atomix.start().join();

创建分布式基元

引导Atomix集群本身并不能提供很多功能。Atomix的真正力量来自其原始形式。基元是高级分布式对象,用于在分布式系统中复制状态和协调状态更改。

Atomix通常提供两种不同的方法来创建分布式基元:

  • 使用构建器模式创建不同的实例
  • 使用getter创建多个实例

与其他构建器一样,基元构造也提供与基元构建器相同的选项。构建者只需提供一个流畅的API来以编程方式配置基元。

要通过构建器模式创建分布式基元,请使用界面*Builder上的其中一种方法Atomix

ConsistentMap<String, String> map = atomix.consistentMapBuilder("my-map")
  .withCacheEnabled()
  .build();

map.put("foo", "Hello world!");

Versioned<String> value = map.get("foo");

if (map.put("foo", "Hello world again!", value.version())) {
  ...
}

所有分布式基元都提供了API的同步和异步版本。默认情况下,getters和builders返回一个同步原语实例。要检索基元的基础异步实例,请使用以下async()方法:

AsyncConsistentMap<String, String> asyncMap = map.async();

asyncMap.put("foo", "Hello world!").thenRun(() -> {
  ...
});

© 著作权归作者所有

共有 人打赏支持
桂哥
粉丝 2
博文 7
码字总数 3172
作品 0
深圳
高级程序员
故障容忍分布式协调框架--Atomix

Atomix 是JAVA8 的故障容忍分布式协调框架。 Fault-tolerant distributed coordination framework for Java 8 主要特性: 可靠:数据一致性 简单:提供极其简单的异步 APIs 来管理分布式资源...

李三石
2015/12/21
1K
1
手把手教你在Windows下搭建React Native Android开发环境

最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考。(我都是参考官方文档的) react-native...

Common1140
2015/12/24
10.5K
45
ORCHARD 是什么?

官网 http://orchard.codeplex.com 教程 http://www.cnblogs.com/sunjunlin/p/3876693.html 【翻译】从头开始编写一个Orchard网上商店模块(1) - 介绍 http://www.cnblogs.com/zhongzf/archi......

付翔
2016/02/03
0
0
iOS 网络请求Json自动转存到CoreData(二)

项目需求:从网络获取Json后,将Json自动转存到CoreData中。 继上一篇日志,那么这篇的主要内容是:将Json存到CoreData中。 说话实话,无非就是KVC赋值,思路清晰明了,但是我在想一个问题,...

萨斯辈的呼唤
2014/10/18
1K
0
Reveal真机查看任意APP

前言: 在Xcode开发时,可以使用Xcode自带的 Debug view Hierarchy查看View布局,如下图 但是使用起来很麻烦,具体找某个view的时候,还有可能找不到,也不能动态的改变view的属性。 这里要推...

刀客445
2016/08/05
18
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
51分钟前
1
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
53分钟前
2
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
今天
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
3
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部