用例-实用的可伸缩性:在Artifactory HA的框架下
文摘:
Viktor Gamov / Hazelcast, 2016年5月:应用程序的可伸缩性是困难的。正确地实现应用程序可伸缩性就更难了。
虽然有些人可能会尝试从头开始编写分布式集群框架,但从另一方面来说,Pragmatic Developer很可能会利用成熟的开源框架,比如Hazelcast,它可以解决所有的麻烦。在本节课中,您将了解到JFrog的务实开发人员在构建Artifactory高可用性特性时如何从使用经过实战测试的Hazelcast集群功能中受益。
讨论转录:
我叫Viktor Gamov,是Hazelcast的一名解决方案架构师。本质上,解决方案架构师所做的就是解决问题。而且,你知道吗,我觉得你的推荐人是那位能帮你解决所有问题的先生。
今天我们将讨论Artifactory HA,以及开发人员为使这个解决方案解决他们的问题所做的选择。
所以本质上,Artifactory H - HA有简单的想法。不惜任何代价交付二进制文件。这就是为什么Artifactory有多个实例。许多东西会被复制,因为在现实世界中,任何东西都可能被破坏。这就是为什么产品的高可用性对开发人员的基础设施至关重要,这是JFrog作为该产品开发人员的一个非常非常大的目标。
我今天要讲的很多东西,都可以在Artifactory HA中找到。因此,从本质上讲,作为一个分布式系统或高可用性系统,Artifactory HA需要解决多个问题。
首先,这个图表解释了Artifactory HA的基本架构。如您所见,作为后端,Artifactory可以将数据存储在多个源中,包括完全缓存模式下的数据库。因此,您还将二进制文件包含在数据库中。二进制文件也可以存储在网络附加存储器上。为什么网络附加存储?因为多个实例可以,需要访问这个。使用网络连接存储或任何可用于多个节点访问的网络连接存储是一个非常合理的选择。另外,Artifactory链中的一些东西,例如与Amazon S3的集成。因此,在这种情况下,您可以克服NSF的问题和[…]事情,并使用正确的和可扩展的解决方案。从非常好的[…]。
一些Artifactory集群的信息,Artifactory成员需要交换关于缓存的信息,关于存储在方法数据中的一些东西的信息,加上对源的并发控制,因为你可以看到,在FAS或数据库中,这里是共享资源,所以我们需要对访问有某种控制,比如对并发访问。
所以。有一些,你甚至可以说这是一个问题,但我想把它看作是挑战。所以有几个挑战。它是二进制文件的并发和分布式访问。正如你从图中所看到的,NSF就像中央存储,即使它在硬件层面上有一些备份和一些弹性[…],从Artifactory的角度来看,它仍然是一个单一的源。所以要提供对这些资源的访问,这种访问可以,应该被控制。2022世界杯阿根廷预选赛赛程因为这个访问应该被控制在哪些节点会做一些事情上。例如,有一个主节点将在你的Artifactories上运行垃圾收集,或者当你上传新jar时运行一些节点可以运行索引,你需要解析Maven或其他构件的元数据。
所以这种挑战是,因为多个实例,它们需要有相同的世界图景,相同的谁在某一时刻有权访问特定二进制的图景。Artifactory成员需要访问的一些信息是关于存储库的信息元数据,关于哪个文件属于哪个存储库,等等。因此存储库缓存是Artifactory HA开发人员面临的另一个挑战[…]。
正如我已经提到的,一些在后台运行的任务,例如,当你运行索引或者当你在垃圾收集中运行一些校验和检查时,这个任务需要巩固系统的一个不同组件,任务已经完成或正在进行中,还有很多其他的事情。所以本质上,对工作进度的识别是另一件事我们要讨论的另一件事是如何在Artifactory链中工作的。出于某种原因,你们可能都明白,连通性对于分布式系统来说是必不可少的。对吧?因此,在这种情况下,Artifactory链是网络约束系统,而不是I/O约束系统。对吧?在这种情况下,网络的速度很重要,另外,当集群的其他成员加入时,发现其他成员也很重要。需要存储此信息,以便在一个节点无法执行作业时进行故障转移,因此如果该节点不可用,则需要将作业发送到另一个节点。
我刚才解释的一些事情,我只讲了四件事,因为这很容易理解。什么时候很容易记住,因为我想让你们在这次演讲后记住一些东西,即使昨天很美好。有几件事很容易记住,人们通常能记住的三、四件事。
这是我要重点讲的几件事。特别是特定的api,让我们称之为Artifactory HA开发人员在产品中采用的拼图游戏。因此,我们将讨论分布式锁,它提供对共享资源的并发访问。2022世界杯阿根廷预选赛赛程共享资源,比如2022世界杯阿根廷预选赛赛程二进制文件。我们将讨论一个分布式映射,它为Artifactory HA中的一些元数据信息提供分布式缓存。一个分布式主题,它提供了执行分布式通知的框架——不同组件的通知。成员监听器允许在成员加入或成员离开或关于成员的某些信息发生更改时获取信息。另外,我将谈论一些被称为发现SPI的东西[…]。
那么为什么是Hazelcast呢?Hazelcast的本质是什么。Hazelcast本质上也解决了可分发的三个简单问题但其实并没有简单的问题。这个你想要解决的问题有三件事是分布式存储,分布式消息传递和分布式计算。今天我们将重点讨论分布式存储和分布式消息传递。也许明年我将谈论分布式计算[…]。
对于Java开发人员来说,Hazelcast看起来像是Java集合的分布式版本。基本上就是这样。这就是Hazelcast很容易与任何产品集成的原因。我们来看看第一个问题,第一个问题是分布式并发控制。
分布式并发控制可能很简单,你们中有多少人,如果你们在座有开发人员,你们中有多少人至少做过一次分布式锁实现。是的。我们这里有人知道该怎么做。你可以接受这个,但是支持它会很痛苦,使用它会很痛苦,例如,我在我的[…]中使用,我使用数据库作为分布式锁的存储。因此,一个节点将使用lock进入表进入数据库另一个节点将从数据库读取这个。正如你从这张照片上看到的,你会到达那里。你知道,你会从你想去的地方到达,但这要看情况,你想要一个平稳的旅程,还是你想要一个痛苦的旅程,你想要,你知道,享受旅程。
这就是为什么我们要讲ILock或分布式锁的组件。我已经说过,Hazelcast提供了Java集合的分布式版本,这就是为什么它很容易开始使用。这里,ILock是扩展Java,是并发锁。它遵循类似的范式。它是重新进入,所以如果成员获得一次锁,再次获得相同的锁,就不会处于死锁的情况。所以你就能拿到锁。如果其他成员试图获得这个锁,什么都不会发生。如果成员下降,锁定将被释放。还有其他释放或强制释放可用锁的语义。锁将由第一个尝试获取的成员获得。 And there is a condition. There’s additionally […] same thing with Java which is concurrent lock. There’s a condition that can be used from the other member that will be condition for releasing this lock.
所以本质上它是这样的,就像这样。Hazelcast实例。这将启动Hazelcast进程。在这种情况下,它将是嵌入式流程。现在我们锁定了。这段代码可以在应用程序的多个实例中执行,因此这个锁将被分发,并可供任何成员访问。对吧?基本上,有几件事需要记住。我们需要获得锁,不要忘记释放它,因为在这种情况下,没有人可以访问,除非你,比如,强制解锁。
让我们快速看一下。这个东西在现实生活中是如何工作的,以及从实际应用的角度来看它是如何工作的。请稍等。我的电脑在切换屏幕。好吧。好的。我的终点站在哪里?你们看得清楚吗?我把它画大一点。这是我之前没有检查过的东西。 Shame on me. All right.
我现在有一个简单的应用程序控制台。本质上,它嵌入了Hazelcast我们会讲到Hazelcast支持的不同拓扑但把它看作是我在Hazelcast中可以做的一些事情的在线界面。我可以做帮助,看到他们可以运行的不同命令。在这个特殊的例子中,我感兴趣的是在特定的地图上使用log。首先,一个成员可以为键1做lock。在这个例子中,键被获取了当我试图从另一个元素中通过键1来处理数据时就像这里的这个,这是一个不同的过程。这是一个不同的过程,是一个不同的JVM。所以我要做的是。M点。首先,我可以得到一些东西。 Some data, right. I can try to get, and I’ll get the result now because nothing is there yet. But when I’m trying to m dot put and I’ll do dice like test one. You see, this process stuck because there is right now another process that holds this lock.
所以另一部分的这个家伙你可以做什么,你可以做测试,测试二没有任何问题。result返回之前的结果以防它为空。如果我这样运行它,它会返回之前的结果,也就是测试二。本质上与map . put在Java集合中提供的语义相同。那么这个家伙能做什么呢?所以在这种情况下,它只是坐在那里等待。现在我需要解锁。正如我们所看到的,成功解锁,写入数据,并返回由该进程写入的最后一个值。对吧?这有意义吗? I hope it does.
许多不同的API都支持它。我可以看到这里。如果我到这里。说地图。我可以试着找一段时间。如果我没有得到锁,我可以等待,锁将不可用,我将无法得到它,会失败。还有很多其他的东西我们稍后会讲到。
好的。现在回到幻灯片上。
所以。所以第一个用例是分布式并发控制。所以本质上,如果Artifactory HA需要在一些特定的二进制文件中做一些重要的事情,一些特定的工件,它可以获得锁。可以为路径获取一个锁因此路径在这里本质上是键因为路径是唯一的。所以我们有这个问题,我们没有这个问题因为我们没有键的唯一性问题。
下一个是分布式缓存。所以分布式缓存本质上是一个应用程序,一个软件,允许太多的进程,很多jvm,访问相同的数据。缓存数据。而且由于数据在内存中,与直接通过调用API进行访问相比,缓存提供了快速访问。或者在[…]数据库中,续作脚本。或者试图进行一些计算。所以本质上缓存是一种临时存储,提供快速访问。
丫缓存。缓存,就是我们用来加速的东西。但当我们谈到缓存时我们通常会想到类似memcache的东西。但有一些东西我们无法从memcache中得到。对吧?所以在这种情况下,Artifactory HA是一个产品。它需要自给自足。所以开发人员可以对客户提出这样的要求,说,如果你使用缓存,你需要另一个基础设施,等等,等等或者你想做可伸缩缓存,你需要另一个基础设施,在这种情况下,它将与这个软件一起工作但我们试图避免,他们试图避免这个。在我开始讲分布式缓存之前,我想谈谈为什么memcache实际上可能没那么糟糕,也许是更好的解决方案,稍微讲讲分布式系统中的数据分布和分布式缓存。
我有个问题要问你。你在这张照片里看到了什么?记住,我们讨论的是数据分布。不,你安静。安静的坐着。
(观众)克隆
好的,我们在这里看到了克隆体。正确的。我们在这里看到了什么?
(观众)这个问题很难回答。克隆很容易……
谁知道为什么我看到了,我这里的一切。所以我给你们一个小提示。两张照片上都有一艘船。
(观众)的肉。
或羊肉。
(观众)条纹。
条纹。好的。还有什么?我要找的另一个名字是什么?
(观众)
好的。
(观众)
更好。
(观众)
(观众)给你。这就是为什么你要用首席架构师。
是的,我们在这里看到碎片。这就是为什么我喜欢用这张图来说明分布式系统中数据分布的两个基本概念。这是复制和分片。也称为分区。那么它们之间有什么区别呢?当我们进行复制时,我们基本上在每个节点上存储相同的数据。因此,在本例中,这种方法可能无法进行超级扩展,因为在尝试复制时,它将受到集群中最小成员的容量的限制。同样的数据,你需要确保数据一遍又一遍地保持一致。这就是为什么分片被认为是分布式数据的实际方法。
所以分片本质上为你提供了一个视图,为你提供了数据如何分布的方式,在这种情况下,引入更多的机器将为共享数据扩展存储空间。当我们谈到部署选项时,有些部署选项对于某些产品来说可能是非常自然的例如Artifactory HA,它是嵌入式模式。hth华体会最新官方网站这就是为什么我说memcache可能不合适。因为在这种情况下,你需要引入另一个基础设施memcache是用c++写的你需要一些驱动程序来访问memcache系统,在其他网络调用中,等等。
当你在应用程序中嵌入分布式缓存时,你不会有太大希望因为大多数时候,我们是Java开发人员,我想大多数Java开发人员。并且,至少Artifactory HA是用Java编写的。所以使用Hazelcast有嵌入式库。本质上只是web[…]lib目录中的一个碎片。
但是,它仍然没有限制你的选择。Hazelcast也提供了经典的集群客户端道歉,你猜集群可以单独部署。它允许管理或分离扩展应用程序和扩展数据存储的关注点。嵌入式选择对于需要使用集群功能的应用程序来说是非常自然的。
当我说到数据时,数据总是在内存中。但是,它如何安全且有弹性地保存数据呢?我将把备份存储在内存中。这听起来对在座的任何人都有好处吗?听起来对我来说确实不错。我会解释为什么。
对于开发人员来说,开发人员使用一个简单的缓存或映射抽象。在这种情况下,不管数据实际存储在哪里,它总是有简单的put和get API。但在内部,它是由Hazelcast处理的在这里,数据是分布的。现在如果我们有四个Artifactory HA节点,这个Artifactory HA存储的数据将分布在多个节点上,所以你可以看到,我们这里有一整块数据,但是这个数据将存储在节点1和节点0上,而这个数据的备份将存储在另一个节点上。在这种情况下,如果这个节点宕机,或者这个节点宕机,数据将从备份中恢复这个分区的备份数据在主分区中仍然可用。
这是关于分片或分区的简单观点。有不同的配置选项可用,例如复制因子或备份计数。我们称之为备份计数。人们喜欢称之为复制因子。同一数据可能有多个备份。在这种情况下,你可以试着从多次失败中幸存下来。您可以在两个节点同时发生故障时幸存下来。当节点关闭时,Hazelcast负责重新平衡数据。重新分区并从备份中恢复数据。
让我们快速看一下它在实际应用程序中的工作方式。当我的电脑切换到控制台屏幕时,我试着-我会解释前提。我将使用与执行日志相同的控制台应用程序。因为它本质上代表了我想解释的东西。我已经在这里运行了。我来做一下。这是我可以用来填充数据的命令之一,我只需要一些数据,这样我就可以进行故障转移。
有一个命令叫,它在哪里?把许多。我将把前10万个大小为1千字节的元素中的一些放在这个内存中。而它吸收这些的方式就是管理中心控制台。这是一个允许我查看集群状态的web应用程序。或者使用嵌入式Hazelcast的应用程序。这里有两个节点。还有这个管理控制台,我看到这些数据是如何分布在多个节点上的。我不知道你是否看到这里我没有这个花哨的东西-不,我有。差不多就是响应式设计。 Right? Not super responsive, though.
如你所见,数据分布在各个节点上我有节点1的数据,备份到节点2。我要做的是,到这里来,把这个节点灭掉。如你所见,二号成员意识到失败了。它只是重新平衡了集群,如果我切换回管理控制台,哦,错了,是的,这个,数据仍然在那里。数据不会丢失。虽然我只是,从插座上取下了插头。是的。正如您在这里看到的,当只有一个节点时,备份并不意味着什么。在这种情况下,如果只在一个节点上运行,就没有备份。从控制台可以看到,这个特定的内存消耗开始增长,因为最初存储在两个节点中的数据现在需要放在一个节点中。
另一个简单的方法是如何修复它我只需要引入另一个节点。他们马上就会加入。它们建立了连接,现在我可以继续在这里做实验数据会重新平衡,单独节点上的总体数据消耗会下降。因此,在这种情况下,添加更多节点将为应用程序增加另一个存储空间。我还可以从管理中心看到其他一些东西。我一会儿再回到这个问题上。当我们要讨论一些事情,它是如何在Artifactory中完成的。但本质上你可以看到不同的数据结构可以在这里看到。
好吧。到目前为止,观众们有什么问题吗?我不知道为什么我的电源开关非常慢。我在试着打破这尴尬的沉默。带着一些尴尬——
(观众)做点什么吧。
好的。开始吧。所以我不能。
好吧。第三件事是系统不同组件之间的消息传递和通知。再说一次,你需要记住我们在哪里。我们已经在Java端,我们在Artifactory HA端,不同的组件需要获得通知。对吧?你能做的是,有一些作业可以监听主题。如果有新的通知,这个工作就需要做些什么。
它在Hazelcast中工作的方式,Hazelcast提供了分布式队列如果你需要一个发布者,一个订阅者类型的访问。此外,还有一个主题,允许有一个出版商,许多订阅者。因此不同的组件可以将数据发送到主题总线。
这个主题总线本质上是分布式的,这意味着主题,对主题的访问,可以被系统中的任何组件访问。如果你把这个客户端看作是一个不同的组件。一个组件可以发布。另一个组件可以监听。例如,这是一个出版商。有一些-一些main - main成员会发送这个信息,因为,例如,如果有一个垃圾收集过程正在发生,或者索引过程,当它完成时,其他组件需要得到通知。
下一个。连通性和发现。为了获得一些关于集群的信息,并以某种方式存储这些信息,从而使Hazelcast, Artifactory HA使用这个称为成员监听器的组件。当这两个端口是你在配置Artifactory HA时通常会配置的。您可以仅为HTTP配置典型端口。您的构建脚本和构建基础设施将在那里获得构件,并且有一个成员端口。所以本质上,有一个,你需要提供一个端口,这个端口将被其他成员用来加入集群。通过成员侦听器,将获得关于其他成员的一些信息。当新成员加入集群时,我们会得到成员事件我们可以得到完整信息,比如IP地址,其他信息,IP地址,端口,实例名,等等。当成员被移除时也是一样。 If someone reboot of the member is changed, this listener will also will be triggered and the member attribute event will be — will be placed.
所以,在过去的一段时间里,我想,大概两年吧。我们收到了大量的请求来支持不同的发现选项。因为Hazelcast,非常类似于Artifactory HA,我们试图是独立的,我们不想强迫开发人员使用任何特定的技术,所以这就是为什么所有的发现都是开箱即用的。我们没有使用任何外部依赖,我们没有使用JGroups,这是我们自己限制的。这就是为什么它只有一个七兆字节的罐子,里面有你需要的所有东西。但是我们所挣扎的事情,我们想要为社区得到答案,最后我们有了这个答案,我们的技术叫做Discovery SPI。
有一段时间,有几个月,去年,我们实际上与我们的社区成员一起工作,包括在我之后在这个房间讲话的先生,曾雷。他是一个谷歌云平台的布道者。他贡献了很多,比如Kubernetes对Hazelcast的集成,都是他贡献的。另外,在我们设计API时,他也提供了很多反馈。
说到探索。现在,如果你想使用TCP/IP发现,这很好,你可以把它放在配置文件中。有时或大多数情况下,当我们在集群内运行时,我们不知道IP地址或主机。所以在微服务世界中,像Hazelcast和Artifactory HA这样的组件可以成为大型基础设施的一部分,在这种情况下,使用Discovery SPI,这个项目可以从控制台或Zookeeper中获得这些信息。或者,现在,我们还提供与其他云提供商的集成,包括Azure。亚马逊。人们希望在容器中运行Artifactory HA或Hazelcast,我们还提供了使用Docker网络来使用Discover的能力。另外,在Mesos集群配置系统中运行Hazelcast集群。过去的支持也是必不可少的。
我们为探索号做了一些事情。Zookeeper, Kubernetes, Eureka,在Cloud Foundry工作,或者,你知道,Spring Cloud,[…]堆栈。
好,让我们看看,当我们使用,这个东西在Artifactory中是如何完成的。所以,我将使用你们今天看到的相同的工具。我使用管理中心来演示您可能在Artifactory HA中看到的一些内容。我将使用管理中心。哦,按错了。也会发生。好的。好了,现在我们可以连接到运行Artifactory HA了。让我回到我的控制台,我会给你们看一些东西。
现在我有两个运行Artifactory HA的进程。我想把这个放大一点,这样你就会看到我实际上在运行Artifactory。是的,有这个。Artifactory公顷。这是非常漂亮的ASCII - ASCII图形。HA节点标识符。因为这是它开始时的第一个节点,我可以从那里看到消息。所以这是-因为在第一个节点中没有[…],所以没有其他HA成员,这就像主节点。我可以在数据库中查看信息我可以看到我有一个主节点,我有一个集群的成员卷。实际上,我正在寻找甲骨文数据库和Artifactory的信息。 If I’m to […] the same — the same info in other member, okay. Oops. It should be — it should be one member. Anyways. Happens. All right. So. And I have the Artifactory HA running two members. And I’m not particularly interested in here to look inside, you know, the […] build script, I wanna show you how and what pieces of Hazelcast is used here.
首先,我们在这里可以看到,不同的主题产生了组件的通知。如果一个计算了一些Debian方法数据的作业将粘贴该信息,将该信息打印到此主题中。
不同的配置会发生变化。如果有人更改了Artifactory HA的Hazelcast -的配置,Hazelcast主题将继续告知成员端需要做什么。另外,这里的映射用作远程存储库的缓存。所以这是我可以看到的信息,只要看看里面。Hazelcast等工具可以提供的另一个非常有用的见解是JMax控制台。通过JMax控制台,如果你想将我们的企业库存系统与JMax连接起来,并查看集群的状态。我们可以从JMax上得到信息。例如,我可以看到这里的符号for,这是另一个分布式并发控制原语,我可以看到这里有一个符号for,如果索引由主成员运行,它将被获取。我可以看到主题的状态,例如,哪里是计算Debian。因为我没有在我的机器上运行任何Debian,所以没有数据,但密封的数据是可用的。
一次又一次。好吧。这是从Artifactory HA的角度来看的。我会有几张幻灯片,里面有一些关键的信息,我可以回答一些问题。但是,我们今天所看到的。一些有趣的事情。这是我的清单,我通常在会议后做的事情。是的。不过我们没有看猫的视频。我们看到了一些奇怪的东西。
好吧。现在。我们怎样才能让事情变得更好呢?分布式执行器服务用于分配作业。所以现在,Artifactory HA依赖于该成员。在主成员上做这些内务工作,比如运行索引,运行垃圾收集等等。我们分发执行器服务,这是Hazelcast计算能力的一部分。它允许通过一组特定的键在特定节点上运行作业,或在一组节点上运行作业。data是作业执行的指针。所以目标事务或者类似于执行服务的数据。
对于像Artifactory HA这样的系统来说,当它们进入无主模式时,另一个选择是能够对其他成员的作业进行故障转移,这也将在几周后发布的Hazelcast 3 - 7中实现。
入口处理器做原子数据通知。因此,目前Artifactory HA依赖于日志,因此在这种情况下,对于悲观日志的情况,您总是需要在它们进行一些数据更新之前进行日志记录。入口处理器允许避免做悲观的日志。它甚至没有被自己锁定。输入过程允许在没有任何日志或乐观和悲观日志的情况下对数据进行原子准备。虽然乐观API是可用的,但像put[…]这样的操作在集群上也是可用的。
以及用于云和自定义拓扑的Discovery SPI。在我们在Artifactory中引入这个之前,HA是Hazelcast的长期用户。你在成员侦听器中使用的一些东西和其他东西现在可以使用Discovery SPI来完成,这将是它们所做的事情的标准实现。他们可以选择不同的实现,不同的方法,不同的客户端,从云上写,等等。
我认为这是最重要的一张幻灯片。因此,您总是可以编写自己的集群软件。对吧?你可以一直这样写,我们知道我们很多人都是非常聪明的工程师,我们这样做不是一次,可能是两次,三次。但是,你知道,它会把你从A点带到b点,对吧?它有两个轮子,你可以控制方向,也可以驾驶,但如果它不需要痛苦的旅程,或者它可以是愉快的旅程,你可以享受旅程,不要想这些事情。Artifactory HA的开发人员采取的务实的方法不是重新发明轮子或发明自行车,而是使用开源技术,并将其构建在他们的产品中,并专注于对客户真正重要的事情。它是弹性、灾难恢复和DevOps基础设施中工件的可用性。现在我来回答几个问题。谢谢你的时间。
