译者 | 布加迪
审校 | 孙淑娟
迅速增加的用户和活动已考验了许多Mastodon服务器的可扩展性,也给广大管理员带来了压力。据IT外媒TechCrunch采访Mastodon创始人Eugen Rochko的文章介绍,在大批用户离开Twitter之后,Mastodon在8600台不同服务器上的月活跃用户猛增到250万。这些数字来自2022年12月,采用率在继续提高。
这个增长势头有多快?对服务器又有什么影响?下图显示了一个大型实例在一段时间内的作业队列,可以帮助您了解情况。上面那条线是所处理的作业数量,下面那条线是失败的作业数量。

图1. Twitter用户外流对Mastodon作业队列带来的影响
Redis开源(Redis OSS)是Mastodon技术堆栈的一部分。任何想要实施Mastodon服务器或提高其性能的人都应该学习如何最有效地配置Redis元素及其他设置。我们在本文中总结了Mastodon的架构,解释了Redis适合的地方,并指出了潜在的瓶颈。我们将帮助您开始调优自己的实例,并确定解决可扩展性问题所需要采取的操作。
不妨先简单介绍一下技术。
Mastodon自称是“一种基于ActivityPub的免费开源社交网络服务器,用户可以关注好友、发现新朋友。用户可以在Mastodon上发布想要发布的任何内容:链接、图片、文本、视频。所有Mastodon服务器都可以作为一个联合网络实现互操作,即一台服务器上的用户可以与另一台服务器上的用户无缝联系,包括实现ActivityPub的非Mastodon软件。”
ActivityPub是W3C推荐的一种去中心化社交网络协议,基于Activity Streams 2.0数据格式,这种模型用于使用JSON表示潜在和已完成的活动。ActivityPub提供了用于创建、更新和删除内容的客户端到服务器API,以及用于传递通知和内容的联合服务器到服务器API。
用ActivityPub、OStatus、Zot!和diaspora*等协议结合在一起的联合服务器网络称为Fediverse。Fediverse上的服务器(名为“实例”)与其他实例联合起来,这样就获得了如同集成社交网络的用户体验。每个实例管理各自的操作和安全。
Mastodon是实现ActivityPub的20多种服务器之一。据Fediverse Observer声称,截至去年12月,Fediverse中共有21501台服务器。

图2. Fediverse
Mastodon是一种带有React.js前端的Ruby on Rails(RoR)应用软件。它遵循这些框架的标准实践。若要运行Mastodon,您需要Ruby、Node.js、PostgreSQL、Redis和SMTP服务器。Sidekiq是RubyGems。添加另外几项服务,比如NGINX和Cloudflare,就能提升Mastodon的可扩展性和抵御DDoS攻击的能力。
下面的架构图有点过于简化了。PostgreSQL是存储用户和帖子等内容的数据库。Sidekiq是Ruby和Rails的后台作业系统。Redis是内存中数据库,用于充当PostgreSQL(图中省略)的缓存,并保存Sidekiq作业队列(图中附有)。文件存储通常保存在Amazon S3存储桶或同类存储区中;由于多个原因,将外部文件存储在本地磁盘上有问题,将它们存储在NFS上更是一场早晚会降临的灾难。

图3. Mastodon架构概况
Redis是一种NoSQL内存中数据结构存储系统,可以将数据持久地存储在磁盘上。它可以充当数据库、缓存和消息代理。Redis拥有内置复制、Lua脚本、最近最少使用(LRU)清除、事务和不同级别的磁盘持久性。它通过Redis Sentinel提供了高可用性,结合Redis Cluster提供了自动分区。
Redis数据模型是键值,但也支持多种类型的值:字符串、列表、集、有序集合、散列、流、HyperLogLogs和位图。Redis还支持具有半径查询和流的地理空间索引。
Redis OSS功能强大,但除了增加云数据库即服务外,Redis企业版还增加了提升速度、可靠性和灵活性的功能。Redis企业版可线性扩展,以支持每秒数亿次操作,具有本地延迟的双活全球分布,提供了Redis on Flash,以基于磁盘的数据库的基础设施成本支持大型数据集,并基于内置持久性和单位数秒级故障切换机制提供99.99%的正常运行时间。这一切都是在将数据库延迟保持在1毫秒以下的情况下提供的。
只要您有root权限,可以在Debian 11或Ubuntu 20.04系统上从源端安装Mastodon,也可以从云实例安装。这个过程很漫长,但手动操作最终让您对安装的系统会有最大的控制和了解。
还可以从许多云提供商(包括DigitalOcean、Linode和AWS等)的应用软件市场安装Mastodon,可以在Docker或Kubernetes上安装Mastodon,包括云提供商自己的Kubernetes,或者向Mastodon托管提供商(比如Masto.host、Fedi.monster或Cloudplane)租用实例。撰写本文时,许多但并非所有的Mastdon托管提供商对新实例关闭,它们最终可能会再次开放。
许多人已经发帖子介绍安装和运行自己的Mastodon实例方面的感悟和心得。只需搜索“我自己的Mastodon服务器”或“个人Mastodon实例”,就能找到许多这方面的内容。
Nora Tindall的叙述较为清晰。她的结论总结一下就是“默认的Mastodon的配置很糟糕。对于小服务器上的小实例来说没有问题,但一旦您开始发展壮大,就必须扩展Mastodon的规模。”
瓶颈在哪里?据Tindall声称,最大的瓶颈是数据库资源(需要为PostgreSQL分配一半的内存)、Sidekiq队列(分开它们)以及数据库连接(确保有足够的连接来处理Web服务器、Sidekiq队列和流:Nora建议总共200个数据库连接)。
另一组实用的调优技巧来自Hazel Weakly:
正如您所见,我们可以采取很多办法来扩展Mastodon以处理增加的流量。下次我们将探讨如何以及何时进一步扩展Mastodon,使用更大的Redis内存分配量和采用Redis企业版。
与此同时,您可以自己尝试Redis企业版,以便深入了解其强大功能。
原文链接:https://thenewstack.io/how-to-boost-mastodon-server-performance-with-redis/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0