译者 | 布加迪
审校 | 孙淑娟
迅速增加的用户和活动已考验了许多Mastodon服务器的可扩展性,也给广大管理员带来了压力。据IT外媒TechCrunch采访Mastodon创始人Eugen Rochko的文章介绍,在大批用户离开Twitter之后,Mastodon在8600台不同服务器上的月活跃用户猛增到250万。这些数字来自2022年12月,采用率在继续提高。
这个增长势头有多快?对服务器又有什么影响?下图显示了一个大型实例在一段时间内的作业队列,可以帮助您了解情况。上面那条线是所处理的作业数量,下面那条线是失败的作业数量。
图1. Twitter用户外流对Mastodon作业队列带来的影响
Redis开源(Redis OSS)是Mastodon技术堆栈的一部分。任何想要实施Mastodon服务器或提高其性能的人都应该学习如何最有效地配置Redis元素及其他设置。我们在本文中总结了Mastodon的架构,解释了Redis适合的地方,并指出了潜在的瓶颈。我们将帮助您开始调优自己的实例,并确定解决可扩展性问题所需要采取的操作。
1、Mastodon简介
不妨先简单介绍一下技术。
Mastodon自称是“一种基于ActivityPub的免费开源社交网络服务器,用户可以关注好友、发现新朋友。用户可以在Mastodon上发布想要发布的任何内容:链接、图片、文本、视频。所有Mastodon服务器都可以作为一个联合网络实现互操作,即一台服务器上的用户可以与另一台服务器上的用户无缝联系,包括实现ActivityPub的非Mastodon软件。”
ActivityPub是W3C推荐的一种去中心化社交网络协议,基于Activity Streams 2.0数据格式,这种模型用于使用JSON表示潜在和已完成的活动。ActivityPub提供了用于创建、更新和删除内容的客户端到服务器API,以及用于传递通知和内容的联合服务器到服务器API。
2、Mastodon和Fediverse
用ActivityPub、OStatus、Zot!和diaspora*等协议结合在一起的联合服务器网络称为Fediverse。Fediverse上的服务器(名为“实例”)与其他实例联合起来,这样就获得了如同集成社交网络的用户体验。每个实例管理各自的操作和安全。
Mastodon是实现ActivityPub的20多种服务器之一。据Fediverse Observer声称,截至去年12月,Fediverse中共有21501台服务器。
图2. Fediverse
3、Mastodon架构
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架构概况
4、Redis简介
Redis是一种NoSQL内存中数据结构存储系统,可以将数据持久地存储在磁盘上。它可以充当数据库、缓存和消息代理。Redis拥有内置复制、Lua脚本、最近最少使用(LRU)清除、事务和不同级别的磁盘持久性。它通过Redis Sentinel提供了高可用性,结合Redis Cluster提供了自动分区。
Redis数据模型是键值,但也支持多种类型的值:字符串、列表、集、有序集合、散列、流、HyperLogLogs和位图。Redis还支持具有半径查询和流的地理空间索引。
Redis OSS功能强大,但除了增加云数据库即服务外,Redis企业版还增加了提升速度、可靠性和灵活性的功能。Redis企业版可线性扩展,以支持每秒数亿次操作,具有本地延迟的双活全球分布,提供了Redis on Flash,以基于磁盘的数据库的基础设施成本支持大型数据集,并基于内置持久性和单位数秒级故障切换机制提供99.99%的正常运行时间。这一切都是在将数据库延迟保持在1毫秒以下的情况下提供的。
5、如何安装Mastodon?
只要您有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实例”,就能找到许多这方面的内容。
6、Mastodon性能瓶颈及应对方法
Nora Tindall的叙述较为清晰。她的结论总结一下就是“默认的Mastodon的配置很糟糕。对于小服务器上的小实例来说没有问题,但一旦您开始发展壮大,就必须扩展Mastodon的规模。”
瓶颈在哪里?据Tindall声称,最大的瓶颈是数据库资源(需要为PostgreSQL分配一半的内存)、Sidekiq队列(分开它们)以及数据库连接(确保有足够的连接来处理Web服务器、Sidekiq队列和流:Nora建议总共200个数据库连接)。
另一组实用的调优技巧来自Hazel Weakly:
- 通过增加worker_rlimit_nofile和worker_connections的值,调优NGINX。
- 增加PostgreSQL的max_connections,但别太离谱。考虑512作为上限。
- 考虑pgbouncer之类的数据库池。这让您可以避免PostgreSQL读副本。
- Hazel引用了Nora针对DB_POOL、MAX_THREADS、WEB_CONCURRENCY和STREAMING_CLUSTER_NUM的建议。
- 针对对象存储,使用S3或类似的服务,而不是本地磁盘,尤其不是网络文件系统(NFS)。
- 针对默认(default)、推送(push)和拉取(pull)类型的Sidekiq队列:将DB_POOL设置为10,并将-c设置为$DB_POOL的值。
- 针对入站和调度器Sidekiq队列:将DB_POOL设置为5,并将-c设置为$DB_POOL的值。
- 针对mailer Sidekiq队列:将DB_POOL设置为1,并将-c设置为$DB_POOL的值。
- 入站队列非常受CPU的限制,很少的线程占用整个CPU核心。准备好为入站队列启动多个进程。将DB_POOL设置为10。
- 考虑将Puma(Mastodon Web服务器)和Sidekiq移动到它们各自的机器上;· 如果需要,在NGINX后面添加更多的这些系统,以实现负载均衡。
- 针对没有被配置为缓存,而是被配置为持久存储的Redis实例运行Sidekiq,并使用Redis Sentinel(而不是使用Redis Cluster,因为Sidekiq队列的键不断变化)来扩展它。
- 运行Redis实例前端PostgreSQL作为缓存,并使用Redis Cluster进行扩展。这意味着您至少需要两个Redis实例(如果您使用Redis OSS)。
7、初步结论
正如您所见,我们可以采取很多办法来扩展Mastodon以处理增加的流量。下次我们将探讨如何以及何时进一步扩展Mastodon,使用更大的Redis内存分配量和采用Redis企业版。
与此同时,您可以自己尝试Redis企业版,以便深入了解其强大功能。
原文链接:https://thenewstack.io/how-to-boost-mastodon-server-performance-with-redis/