用例-为高可用性环境编写性能用户插件

文摘:

Daryl Spartz / Yahoo, 2016年5月:在有大量工件要删除的大型安装中,工件清理插件的执行可能会由于磁盘活动过载而产生不利影响。本演示将描述我们对插件的修改,这些修改使我们能够在没有系统影响或响应时间损失的情况下成功地删除超过13TB的数据。

讨论转录:

我叫Daryl Spartz。我在雅虎工作。我是Artifactory的新手。我想我是去年十月开始工作的。

我的第一个任务是清理藏物。每个人可能都处于不断增长的情况下,我可能会重复这一点,但是我们有太多的人工制品,我们已经很充实了。我们已经分配了一个27tb的过滤器卷。我们大约有23%的空间,还有23tb的空间,所以。我们过去曾试图解决这个问题,但我们遇到了问题。所以,我的任务是在不打扰的情况下做到这一点。这就是这个演讲的由来。我们处于高可用性环境中,因此我们有两个互为快照镜像的过滤器。我会再详细讲一下。

那么,高性能意味着什么呢?我们将简要讨论一下。它实际上围绕着一个使用Artifactory Cleanup插件的案例研究。我将讨论我们的高可用性架构。顺便说一下,在我把这些都搞定之后,我们从Artifactory 3.9升级到了4.7。虽然我们用了一些Chef,但我们把更多的东西换成了Chef。我会复习一下烹饪书和一些我以前做这个的食谱以及它们是如何工作的。如果我们有问答环节,希望你们有时间。

那么高性能意味着什么呢?就像任何软件一样。如果做得不对。它在Artifactory的上下文中运行,因此您可能会影响Artifactory本身,至少线程正在运行。你知道,在CPU使用率方面,你正在消耗的内存量在这个特殊的情况下,我谈论清理,你通过移除工件来影响I/O系统。

所以,作为一个插件,你可以控制的东西是有限的。您正在使用Artifactory中的函数或API调用。你不能控制那个但你能控制的是你调用特定API的次数和频率。如果你有一个长时间运行的东西,你知道,你会消耗很多资源,所以你可能想要用不同的方式处理它,或者以某种方式限制自己。2022世界杯阿根廷预选赛赛程我会讲到的。

所以,在这个特殊的情况下,我从Artifactory Cleanup插件开始。它可以在JFrog的组织下在GitHub上获得,它的目的是删除基本上不被使用的工件。因此,我从原始脚本开始,脚本执行API调用,以获取特定年龄的所有工件的列表,并且在特定时间内未被下载。然后脚本对找到的每一个进行循环并删除它。

这对我们来说是一个问题。同样,我们有23tb的空间。到它结束的时候,我们清理了大约9tb的数据。所以我们有很多很多东西。所以每次我们删除一些东西时,我们在过滤器上有所有的活动结果是如果我们让它保持原样,它会占用我们的数据库。我们有一些锁在运行。长运行锁。这给我们带来了一些问题,我们最终不得不打电话给JFrog的支持人员来弄清楚我们是否可以终止正在进行的事务。

所以我从这个开始。同样,当您在高可用性集群上时,使用NSF挂载点。当我们满负荷运行它时,我们确实注意到由于所有正在进行的I/ o,我们正在影响过滤器上的服务。我们并不是唯一的租户,所以我们对系统的其他用户来说并不是一个好公民。当我们运行这个的时候,我们选择了一个特定的主机来运行它在Artifactory的特定实例上的CPU负载,或者,我不记得它是备用的还是别的什么,但是,CPU突升了,我们的监控开始提醒我们有太多的CPU在运行,诸如此类。这并不一定是灾难性的事件,但如果它是您所攻击的负载平衡集群的一部分,则可能会影响定向到该特定主机的用户。同样,您希望成为一个好公民,不要因为给它过多的负载而影响您的服务水平协议。

这就是我们发现的。当我们运行它时,我们最终得到了一个锁等待超时。最初运行它。我们必须处理好它。当我开始研究这个的时候,我发现,你们可能知道,插件是在启动时加载的。因此,它从插件目录中读取并加载它们,然后基本上在JVM中加载类。然后您可以在类中定义多个端点以调用不同的函数。

所以当我发现这一点时,这些都是很重要的,因为我想做的是能够控制插件。不是让它全速运行,不是硬代码,而是一种特定的节流机制。但我想管理它,也许我想暂停它,也许我想停止它,或者别的什么,所以。知道。

这是我们的HA集群的快速图表。所以我们有一个所有用户或应用都会访问的c名。然后在两边进行旋转,标记为GQ1和BF1。我忘了改了。但是,这是我们的共同地点的名字。BF1就像我们的灾难恢复,所以在这个特殊的情况下,没有真正的流量去BF1。因此,当谈到GQ1端时,我们有一个负载平衡VIP,它将流量定向到三个独立的实例。一个是主节点,另外两个是从节点。然后数据库就落后了。我们在两个颜色之间有一个双主数据库,在主和从之间有一个从复制。 And this is I believe the way JFrog helped us architect the BCP. Our disaster recovery mechanism.

所以,我最后做的是使用原来的Artifactory Groovy插件,并对它进行了增强。我添加了一个可选的节奏参数,您可以将其添加到REST API调用中,或者实际上甚至可以添加到计划作业中,我们将在一分钟内看到。这样你就不会跑得太快了。你基本上可以让它慢下来,这样它就不会冲击磁盘驱动程序,网络活动正在进行它是NSF。我把它做了动态调整,所以如果我被认为花了太长时间,没有效果,我可以减少节流时间,这样它就可以运行得更快一些,我们可以观察我们的监控指标,看看我们是否影响了任何服务。

我添加了暂停、恢复和停止控件。如果我们认为我们在某个地方影响了性能,我可以暂停它。然后它的状态,它要删除的文件数量将保持在那里,我可以稍后恢复它。也许是下班的时候。或者如果我不想调整暂停时间。

我添加了一些我发现非常重要或有用的日志信息。它会告诉我我在这个过程中的位置。如果我们有,在一个案例中我们有几百万。我说到哪儿了?我是在前一万人中,还是接近最后一万人。我很想知道有多少空间被删除了,所以我也记录了下来。

我还添加了一个增强功能。最初的插件使用属性文件来定义策略。这是一个单一的政策。你可以列出尽可能多的回购,但这是相同的策略。所以如果你想回顾过去三个月。这款游戏已经发布了3个月,但3个月都没有下载,这就是所有人的情况。我改了一下,每个保单可以有一个或多个回购。

所以我把它贡献给了开源,你可以下载。那里有最新的版本。有一点是,Groovy需要最新的4 . X来支持处理配置slurper进程是可以的。您还需要这样做,因为在以前的Groovy支持中,无论如何都存在一个漏洞。

这是一些你可以做的curl请求以及如何指定它。不幸的是,它被划了线。但基本上还是一样的调用,但我增加了几个选项,你可以指定月份,回购名称,或名称列表,我还增加了一个演练选项。所以。如果你想检查这个,确保它不会搞砸任何东西,它基本上只是告诉你我要做这个,它不会做那个。然后是节奏参数。以毫秒为单位。在这个例子中,每次删除是2秒。其他命令是停止、暂停和恢复,就像我提到的那样。这些都在GitHub上。 You can download this and use it.

下面是一个带有我添加的日志记录的运行示例。所以当它启动时,在这个特定的策略中我有两个回购。这就是所谓的Mobile and Fastbreak。然后我回顾的月数必须大于3个月。我把节奏设置为每次删除一秒。一秒可能是非常保守的,但是,你知道,可能半秒或更少。同样,我可以动态调整它。当它开始的时候,它告诉你参数,然后开始删除。如果你注意到最后几行,它告诉你它删除了多少个文件。是257000的2个。 And the total bytes so far are returned. I believe that’s like 10 — 10 megabytes. Or am I off? That’s a gigabyte. So, anyway, so that information goes out there. It’s all logged at the info level so that’s, of course, adjusted — can be adjusted, well it’s adjusted through the log back dot xml of Artifactory.

政策是这样的。单一政策在底部。旧的配置属性文件就是这样的。上面这个,Groovy的配置器也支持这个,所以你可以有很多策略,然后在每个策略中,你可以定义repo或repos,然后你可以选择把这些其他的值放在那里。你是否想要一个速度参数或者你是否想要一个预演。如此,如此。这就是现在的工作方式。

这就是它的作用。实际上,就像我说的,清理了,大约9tb的数据。我记得,我们最初设定的是两秒。我把它精确到一秒。我们大概花了一个星期的时间来做,但它是免费的,你知道,让它运行不会有什么坏处,除非你的空间真的很紧。

是吗?

[观众]有几个问题。您是在运行前打破了快照镜像,还是刚刚获得了备份,还是使用了[…]实例?因为我认为如果你删除了母版[…]

是的。

(观众)

不,我们没有打碎闪光镜,我们让它走了。我们做快照,所以如果我需要恢复任何东西,每小时,每周快照。因此,即使在运行了这个之后,我们也没有看到返回给我们的空间,直到快照结束滚出。

(观众)你去掉了快照。

是的。

[观众]我的第二个问题是[…]Docker图像作为你的[…]的一部分?

问题是我要删除Docker吗。在这一点上,没有。Mobile和Fastbreak——我不确定Fastbreak到底是什么,但Mobile是iOS和Android图像。Fastbreak,我不确定它是什么,但它不是Docker。在这一点上,我们没有为Docker使用Artifactory。

还有问题吗?是的。

[观众]所以,你在使用GUI脚本。但是[…]你也可以使用CLI[…]吗?

所以问题是,通过CLI编写脚本会不会更好。老实说,我没有在这个特殊情况下使用CLI。但我只需要打一个电话就能得到所有要删除的藏物的列表。我不知道如何在CLI中返回。我猜是某种物体。我猜你也会这么做。你要能够把握节奏。这是内置的节奏。如果您想要或不希望对其进行调整,则必须使用CLI编写脚本。但我认为,本质上是一样的。

插件的唯一优点是,在这种特殊情况下,它们有一个在Groovy脚本中定义的调度作业。所以,它被设置为运行,我相信,在周日早上5点左右,所以这是一个经常发生的事情。如果您愿意,也可以设置一个rom来运行CLI,但这似乎更容易一些。它是可编程的。我只需要更新属性文件。同样,您可以使用CLI执行相同的操作。您可以设置属性文件。所以我不知道它是否有任何真正的优势。它只是这样包装的。它已经为你准备好了。

还有问题吗?是吗?

[观众]那么,你是否也需要进行[。]清理,因为有时候这些人工制品不是[。]?

是的。还有另一个插件,删除一些东西,我不记得它的名字了。但是,是的,我们确实这样做了,现在这是一个手动步骤来启动它。我相信我们也能找到一种自动化的方法。

还有问题吗?

(观众)

我很抱歉?

(观众)

是的。我们基本上与组织合作,让我们知道什么样的政策适合他们。我们选择了我们所有空间中最大的三个消费者作为起点。我们没有超出这个范围。我们已经讨论了有一种方法来标记特定的工件,然后我们清理那些被标记的,或者没有标记的,诸如此类的事情。因为这是,任何三个月没有下载的东西,这并不意味着它实际上没有投入生产。对吧?你最终可以摆脱一些你不想要的东西。所以这不是理想的情况。这就是使用CLI的脚本思想。 You can do it that way and have a different means of tagging and checking the tags or maybe even enhancing this plugin to optionally look for certain tags to identify it but yeah, it’s something that we negotiated with the groups.

还有问题吗?很难看出来。这是更好的。

接下来我要讲的部分因为这是我做的第一件事就是清理。接下来我们想从Artifactory 3.9升级到4.7。我们有一些东西是用大厨的。辅助的东西。但主要的东西是我们自己专有的包装和配置。对于Artifactory本身,我们完全把它移到了Chef上。因此,从安装到配置Artifactory的所有内容,无论是独立配置还是HA配置。是通过Chef食谱完成的。然后是Artifactory的启动和停止功能。希望在某个时候,我看了看Chef市场。 I didn’t find anything that did exactly and everything that I wanted so hopefully my stuff will go out there at some point.

我的方法是让它数据驱动。所以我所做的一切都是数据驱动的。Artifactory要下拉的版本,它是一个属性——Chef属性。它是在烹饪书中定义的但它可以在不同的环境中被重写。因此,我们有一个测试环境、一个登台环境和一个生产环境。如果我们想要测试它,我们可以覆盖那个属性并有不同的版本。特定的包名,从哪里下载的位置。因此,我们为JFrog设置了一个远程缓存镜像,这样当我们第一次运行它时,我们就可以获得我们想要的Artifactory的最新版本,然后缓存它。所以,如果我在测试环境中这样做,当我进入分级时,我不需要返回到JFrog。它现在被缓存了。 And same with production.

但所有这些都是数据驱动的。一切都准备好了。与HA环境一样,卷名称的过滤器,即拥有卷的实际主机。这些都是属性。它们都可以在环境或角色属性设置中配置。所以当你分配一个节点时,比如说环境,登台意味着一些特定的东西然后我可以为登台、生产和其他任何东西设置不同的过滤器容量。所以。

所以很多资源都是标准资源。2022世界杯阿根廷预选赛赛程使用yum repository指向我们的缓存镜像。包来定义企业版本名,然后定义版本号。所以现在如果我想升级到4.8版本,我只需在cookbook的默认属性中修改一行,提交它,然后管道就会部署它。很简单。我们使用的所有实例显然都需要许可证。我把它们放在Chef保险库中,就像在其他机制中一样。所以现在,当一个特定的部署在一个特定的主机上进行时,它会进入Chef vault并获得它的特定许可,我使用文件资源将它放置在Artifactory针对该特定主机的配置中的正确位置。

为多个项目使用模板。特别是存储属性。试着记住里面的内容,但这是一个模板。系统属性,然后是集群属性。它们都是模板。一切都来自于属性。在任何食谱中都没有什么硬性规定。再说一次,这些可能会有所不同。所以我有一个属性来定义这个安装是独立的还是高可用性的,然后这些文件的位置会根据这个属性而不同。脚本或配方处理它的去向。

在许多地方,我们有需要修改的xml文件,即使我们不拥有它。我不想把整个文件放在一个模板下。特别是,我们的实例是为SSL设置的,因此我需要修改server . xml。所以我用了一本在市场上找到的大厨食谱。它叫做xml下划线文件。我在一些事情上找到了它,但我需要更多的东西。所以我扩展了它,并把它贡献给了那个包的所有者。他采用了一套改变,第二套我还没有收到他的回音。但它基本上允许我修改现有的xml文件。例如,我可以用SSL连接器替换连接器,我们使用APR Tomcat本地库来实现更快的连接。 So I have to replace, delete the ones that come with Artifactory, and replace it with our specific xml segments.

对于插件,我们还是选择插件。我们现在从开源中得到的只有少数几个。但是我想能够打开日志记录,我不想手动去编辑它,所以我使用相同的xml文件进入并添加一个日志记录器条目,用于日志返回说,对于这个特定的插件,我想要在调试或信息或警告级别进行日志记录。

它运行得很好,几张幻灯片后,这是属性文件的一部分。您现在在其中定义的日志级别。您可以将其默认为无。因此,没有为它创建记录器条目。这就是删除空文件夹那部分的情况但对于清理,我想知道我想知道有多少文件和多少字节被保存了。我在属性中设置了info当检测到它时,这个xml文件会输出并添加一个记录器条目。如果该条目不存在,则添加该条目。如果我在某个时候想要改变它,xml文件就会很聪明地不添加另一个条目,我也不需要引导到旧的条目。它会找到这段并更新这段。这是一个有用的东西。

对于HA,同样,为节点属性使用一组模板。用于创建集群主目录的目录,其中有[…]目录、数据目录和备份目录之类的东西。我使用资源挂载来挂载NSF的东西。因此,作为属性,您可以定义主机、卷名和挂载上的任何特定选项。所以你有两个集合。对于HA配置,首先是主服务器,然后是辅助服务器。然后这是在[…]位置级别完成的,作为你在Chef中可以找到的滚动的一部分。那么,在另一边,你只是把它翻转一下或者用它们的体积然后它们彼此指向对方。所以效果非常好。使用link进行从主Artifactory路径到筛选器卷的符号链接。

然后我创建了起点和终点。它们基本上只是作为烹饪书的一部分或者库函数用于开始和停止。一开始我添加了一个重试功能,因为我注意到当我们从3 - 9迁移到4·x时,我们遇到了Artifactory没有出现的情况。它基本上会输出一个日志信息,这是一个问题,但是重新启动它。结果它重新启动了,所以我添加了重试逻辑,所以我等待了一段时间。如果我没有检测到它是向上的,我可以通过对应用程序进行旋转来检测。因为如果你去系统,Java进程还在那里,只是它没有在它应该在的端口上响应。所以如果卷曲有效,我们就没事了。如果它没有等待一会儿,然后尝试重试。它只是节省了一点获取警报和处理它的时间。

我花了一点时间的另一件事是创造厨房环境。这非常非常有用因为我可以测试所有这些配置选项。对于厨房环境,我可以重写烹饪书中定义的属性。我可以说这是一个独立的,我想给主机这个名字。你知道,我可以在Vagrant上设置这一切,在我的笔记本电脑上,我可以安装一个Artifactory实例,启动并运行,使用,你知道,测试那里的SSL功能和所有东西。我可以在厨房里把它换成HA。我并没有创建两个不同的Vagrant vm。我没那么做。但对于其中一个,我从我的笔记本电脑导出了一些NSF,以便Vagrant可以安装它们,这样我就可以测试安装方面。诸如此类的东西。 And it was really, really useful. I can do all this without committing code and watching our pipeline fail somewhere down the road. So it was very, very useful.

我想就是这样。所以我想感谢JFrog给我这个机会和大家交流,感谢你们来听我的演讲。如果我有一些。我的插件的名字。在那里你可以找到藏物清理工作。我犯的错。然后是xml文件。我指着我的回购,因为他还没有接受我最近的修改。你可以有部分xml更新,但只能有一个,我扩展了它,你可以有多个。我不知道他为什么没有回应,不管是肯定的还是否定的,但我可能会再试着联系他。

所以,问题吗?有人有问题吗?

要么快速释放,要么死亡