java-raft框架之atomix进行分布式管理

news2024/9/25 9:37:49

共识算法

在一个分布式的系统中,管理各个节点的一致性(共识)一直是个很有难度的问题。

在近几十年的发展中,于1990年诞生的Paxos算法是其中最为经典的代表,并一统江湖数几十载。

如著名的zookeeper、chubby都是基于Paxos算法的经典应用。


不过Paxos算法的复杂度和难以理解性,也吸引了一些大佬想让它变得更加简单。

为此,以简单和易理解为目标的Raft算法便于2014年横空出世。

其Raft论文地址为:https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14

为了快速了解,也通过结合https://raft.github.io/中的动画演示快速了解。

尽管Raft算法的发布时间较短,不过它的具体落地方面可谓是百花齐放,如K8S中的etcd就是使用raft算法实现的代表应用。


atomix框架

atomix是一个基于raft算法,使用java语言进行实现的一个分布式框架,可以运用在各种分布式场景中。

更多关于atomix的相关介绍,可以在对应的github中找到:https://github.com/atomix/atomix-archive

需要注意的是:基于java的atomix现已停止维护,这里仅用作学习目的,在分布式系统中体验一下。


本文选用的atomix版本为最新的3.1.12版本。https://github.com/atomix/atomix-archive/releases/tag/atomix-3.1.12

所对应的maven依赖为:

	<atomix.version>3.1.12</atomix.version>
	
	<dependency>
		<groupId>io.atomix</groupId>
		<artifactId>atomix</artifactId>
		<version>${atomix.version}</version>
	</dependency>
	<dependency>
		<groupId>io.atomix</groupId>
		<artifactId>atomix-raft</artifactId>
		<version>${atomix.version}</version>
	</dependency>

下面以在分布式系统中的常见场景,来快速掌握下atomix的用法

数据存储

使用atomix进行数据存储与查询

package io.github.puhaiyang;

import io.atomix.cluster.ClusterMembershipService;
import io.atomix.cluster.Member;
import io.atomix.cluster.discovery.BootstrapDiscoveryProvider;
import io.atomix.core.Atomix;
import io.atomix.core.election.AsyncLeaderElector;
import io.atomix.core.map.AsyncAtomicMap;
import io.atomix.primitive.Recovery;
import io.atomix.protocols.raft.MultiRaftProtocol;
import io.atomix.protocols.raft.partition.RaftPartitionGroup;
import io.atomix.utils.time.Versioned;

import java.io.File;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;

public class ClusterTest {
    private static String LOCAL_DATA_DIR = "db/partitions/";
    private static String groupName = "raft";
    private static Integer MAX_RETRIES = 5;

    public static void main(String[] args) throws Exception {
        Atomix atomix = buildAtomix();
        //atomix启动并加入集群
        atomix.start().join();

        //创建atomixMap
        AsyncAtomicMap<Object, Object> asyncAtomicMap = atomix.atomicMapBuilder("myCfgName")
                .withProtocol(MultiRaftProtocol.builder(groupName)
                        .withRecoveryStrategy(Recovery.RECOVER)
                        .withMaxRetries(MAX_RETRIES)
                        .build())
                .withReadOnly(false)
                .build()
                .async();
        //进行数据存储
        asyncAtomicMap.put("myBlog", "https://puhaiyang.blog.csdn.net");
        //进行查询
        CompletableFuture<Versioned<Object>> myBlog = asyncAtomicMap.get("myBlog");
        Versioned<Object> objectVersioned = myBlog.get();
        System.out.printf("value:%s version:%s%n", objectVersioned.value(), objectVersioned.version());
    }

    private static Atomix buildAtomix() {
        List<String> raftMembers = Collections.singletonList("node1");
        //创建atomix
        return Atomix.builder(ClusterTest.class.getClassLoader())
                .withClusterId("my-cluster")
                .withMemberId("node1")
                .withHost("127.0.0.1")
                .withPort(6789)
                .withMembershipProvider(BootstrapDiscoveryProvider.builder().build())
                .withManagementGroup(RaftPartitionGroup.builder("system")
                        .withNumPartitions(1)
                        .withDataDirectory(new File(LOCAL_DATA_DIR, "system"))
                        .withMembers(raftMembers)
                        .build())
                .addPartitionGroup(RaftPartitionGroup.builder(groupName)
                        .withNumPartitions(raftMembers.size())
                        .withDataDirectory(new File(LOCAL_DATA_DIR, "data"))
                        .withMembers(raftMembers)
                        .build())
                .build();
    }
}

输出结果为:

value:https://puhaiyang.blog.csdn.net version:4

运行结果

运行成功后,会在程序根目录下生成对应的数据文件。
如上面代码中指定的文件路径为:db/partitions/datadb/partitions/system,则会将数据持久化到上面的目录中

leader选举

除了上面的map存储外,leader选举也是分布式系统中经常用到:

        AsyncLeaderElector leaderElector = atomix.leaderElectorBuilder("leader")
                .withProtocol(MultiRaftProtocol.builder(groupName)
                        .withRecoveryStrategy(Recovery.RECOVER)
                        .withMaxRetries(MAX_RETRIES)
                        .withMaxTimeout(Duration.ofMillis(15000L))
                        .build())
                .withReadOnly(false)
                .build()
                .async();
        //获取出当前节点
        Member localMember = atomix.getMembershipService().getLocalMember();
        System.out.println("localMember:" + localMember.toString());
        String topic = "this is a topic";
        //根据某一topic选举出leader,返回的是选举为leader的节点
        Leadership leadership = (Leadership) leaderElector.run(topic, localMember.toString()).get();
        System.out.println("==========" + leadership);
        //get leadership
        Leadership topicLeadership = (Leadership) leaderElector.getLeadership(topic).get();
        System.out.println("------------>" + topicLeadership);
        //输出所有的topic对应的leader
        Map topicLeadershipMaps = (Map) leaderElector.getLeaderships().get();
        System.out.println("++++++++++++" + topicLeadershipMaps.toString());

输出结果为:

localMember:Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}
==========Leadership{leader=Leader{id=Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}, term=1, termStartTime=1675088739669}, candidates=[Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}]}
------------>Leadership{leader=Leader{id=Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}, term=1, termStartTime=1675088739669}, candidates=[Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}]}
++++++++++++{this is a topic=Leadership{leader=Leader{id=Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}, term=1, termStartTime=1675088739669}, candidates=[Member{id=node1, address=127.0.0.1:6789, host=127.0.0.1, properties={}}]}}

总结

atomix的api远不止本例中的两个,还有其他很多的api。

如分布式锁、分布式事务、分布式自增id、分布式队列、分布式信息号等,这些在atomix中都有实现,详细可见atomix的类方法:
atomix-api

也正如当前所说,当前基于JAVA实现的atomix已经停止维护了。

如果要在生产环境中使用atomix,可以移步atomix的官网,获取在k8s环境下的新版atomix的使用方式,依然很强大。

atomix.io

参考链接
https://baymaxhuang.github.io/2017/06/14/Kryo序列化及其在ONOS中的应用/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统(day03)-- 进程

文章目录进程进程的定义进程的组成进程的组织进程的特征进程的状态-五种基本状态进程状态的转换进程控制进程控制的定义进程控制相关的原语进程 系统并发运行多个程序&#xff0c;它需要将程序代码、数据段存放到内存的某个位置&#xff0c;那系统怎么知道哪个内存的数据在哪呢…

注册公司选择认缴or实缴?如何查验公司实际资金?

目录 前言 实缴制 认缴制 认缴制还是实缴制呢&#xff0c;哪个更好&#xff1f; 1、如果你的启动资金比较少&#xff0c;建议选认缴制&#xff1a; 2、有27类的公司暂不推行注册资金认缴制&#xff1a; 3、如何查看公司实际的公司实缴金额? 4、认缴不需要验资&#xf…

【原文核心对照代码】【一文足以系列】A-LOAM里程计部分简短精解

前言 本文将通过论文对照代码的方式阐述A-LOAM这一神奇算法。全文保持各个章节短小精悍的风格。本文会省去一些细节&#xff0c;但是了解大部分的论文和代码实现已经足够了。 点曲率计算与边缘点面点区分 论文中通过对点云点的曲率进行如下求曲率的计算。将计算的结果跟阈值…

org.slf4j.Logger无法输出日志的BUG

场景依赖<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>s…

第一章 Iceberg入门介绍

1、Iceberg简介 本质&#xff1a;一种数据组织格式 1.1、应用场景 ①面向大表&#xff1a;单表包含数十个PB的数据 ②分布式引擎非必要&#xff1a;不需要分布式SQL引擎来读取或查找文件 ③高级过滤&#xff1a;使用表元数据&#xff0c;使用分区和列级统计信息修建数据文…

技术管理者如何获得下属的认同?

你好&#xff0c;我是童军&#xff0c;目前是华锐技术资管营销研发团队总监。今天我将从自己的工作场景出发&#xff0c;讲讲我是如何和团队小伙伴相处沟通&#xff0c;并获得认同的。 我们先看一个小故事。 我刚当上主管那会儿&#xff0c;在和新入职同事沟通具体工作时&…

【数组相关面试题】LeetCode试题

前言&#xff1a;在之前我们已经学习过了顺序表的相关概念以及实现的方法&#xff0c;今天我们通过几个题来进行应用了解。 目录1.第一题([oj链接](https://leetcode.cn/problems/remove-element/))2.第二题&#xff08;[oj链接](https://leetcode.cn/problems/remove-duplicat…

Ubuntu和Linux开发板网络环境搭建

参考&#xff1a;https://www.bilibili.com/video/BV1n541197rk?spm_id_from333.999.0.0 目录前言STM32MP157 开发板网络环境搭建开发工具网络拓扑结构Ubuntu 常用工具安装同一网段ping 测试概念关闭Ubuntu 和Windows 防火墙电脑和开发板直连同个路由器准备工作VMware 设置查看…

Java:每个开发人员职业生涯的基本Java技能

早在1996年&#xff0c;Java就首次被引入世界&#xff0c;如今仍然非常受欢迎。2021&#xff0c;全球超过35%的程序员使用这种语言。此外&#xff0c;它是TIOBE索引中最受欢迎的三种编程语言之一。作为Java初学者&#xff0c;这对你意味着什么?这意味着你必须获得竞争优势&…

浏览器的URL中每个中字符的“乱码”问题,字符集的解码和编码

uft-8和Unicode字符表对应&#xff0c;查找可参考&#xff1a;https://www.utf8-chartable.de/unicode-utf8-table.pl 几个好用的字符集转换网址&#xff1a;http://web.chacuo.net/charseturlencode&#xff0c;https://123.w3cschool.cn/webtools&#xff0c;http://mytju.co…

JVM详解--内存结构

文章目录什么是JVM内存结构程序计数器&#xff08;Program Counter Register&#xff09;虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09;概述栈内存溢出本地方法栈堆&#xff08;Heap&#xff09;堆内存溢出堆内存诊断方法区方法区内存溢出常量池运行时常量池St…

PHP手册

NULL 未定义和unset()的变量都将解析为值null unset() unset( $var, ...$vars) 如果在函数中 unset() 一个全局变量&#xff0c;则只是局部变量被销毁&#xff0c;而在调用环境中的变量将保持调用 unset() 之前一样的值。 <?php function destroy_foo() {global $foo;un…

双系统下linux分区被误删的解决办法

前言在windows系统的磁盘管理中误删了ubuntu的磁盘分区&#xff0c;开机后一直卡在grub界面。Windows/Linux双启动的机器一般都使用grub作为引导程序。如果不小心在Windows中删除了linux分区&#xff0c;grub就会因为找不到配置文件而造成无法启动。 系统配置 系统类型&#x…

Qt新手入门指南 - 如何创建模型/视图(一)

每个UI开发人员都应该了解ModelView编程&#xff0c;本教程的目标是为大家提供一个简单易懂的介绍。Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff…

java排错定位

1、检查有没有报错信息 日志文件中登记的错误&#xff0c;这个算是最简单的&#xff0c;在定位错误时&#xff0c;也最希望问题在这一步得到确认。在打印异常时&#xff0c;通常会打印异常的调用栈信息&#xff0c;通过调用栈信息就可以很便捷的定位问题了。 例如&#xff1a; …

【JavaScript】原型与原型链以及判断数据类型方式

&#x1f4bb; 【JavaScript】原型与原型链以及判断数据类型方式 &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#…

Redis对不起是我肤浅了(基础和应用篇):位图(Bitmaps)的妙用和深入分析每个命令的用法

一、前言 在Redis 4.0 版本之前&#xff0c;Redis是单线程程序&#xff0c;主要是指Redis的网络I/O线程。Redis的持久化、集群同步等操作&#xff0c;则是由另外的线程来执行的。但在Redis 4.0 版本之后&#xff0c;Redis添加了多线程的支持&#xff0c;这时的多线程主要体现在…

【IT互联网行业内,什么岗位工作更有前景?】

前言互联网及IT行业作为集技术与高薪于一身的新技术行业&#xff0c;不仅成为时下众多年轻人的首选行业&#xff0c;其本身也承载了社会、企业数字化发展转型的重担&#xff0c;从国家到社会、市场都非常重视行业技术的发展和渗透&#xff0c;其重要性不言而喻。作为普通人的小…

AcWing 1073. 树的中心(详解树形DP和换根DP)

AcWing 1073. 树的中心&#xff08;树形DP 换根DP&#xff09;一、问题二、思路1、暴力做法2、树形DP换根DP&#xff08;1&#xff09;思路分析&#xff08;2&#xff09;普通树形DP与换根DP的区别三、代码一、问题 二、思路 1、暴力做法 这道题其实暴力的做法很简单&#x…

【金融学】Economics of Money and Banking {暂时搁置,中级宏观和微观经济学未学}

Economics of Money and BankingClass1 The Big PicturePrerequisitesSome MaterialsCourse Material: https://www.coursera.org/learn/money-banking/lecture/8WXSW/the-big-picture Class1 The Big Picture Prerequisites intermediate macroeconomics 中级宏观经济学 int…