Metabase可扩展性
扩展Metabase以支持更多人和数据库的最佳实践。
Metabase是一个可扩展的、经过实战的软件,被成千上万的公司用来提供高质量的自助服务分析。它通过水平扩展支持高可用性,而且它是开箱即用的高效工具:一台拥有4gb内存的单核机器可以将Metabase扩展到数百个用户。
本文提供了有关如何随着用户和数据源数量的增加而在生产中保持Metabase平稳运行的高级指导和最佳实践。每个数据系统都是不同的,所以我们只能在较高的层次上讨论扩展策略,但是您应该能够将这些策略转换为您特定的环境和使用情况。
影响Metabase性能和可用性的因素
Metabase在垂直和水平方向上都可以很好地缩放,但它只是数据仓库,系统的总体性能将取决于系统的组成和使用模式。影响您使用Metabase体验的主要因素包括:
- 连接到Metabase的数据库数。
- 每个数据库中的表数。
- 数据仓库的效率。
- 仪表板中的问题数。
例如,如果问题需要运行数据库需要30分钟才能完成的查询:只需要30分钟。解决方案是重新评估你对这些数据的需求(你真的每次都需要这些信息吗?)或者找到提高数据库性能的方法,例如重新组织、索引或缓存数据。
数据库和表的数量也会影响客户机性能,但仅在管理数百个数据库和/或数千个表的大规模情况下,如元数据它本身可能有很多问题需要查询。为了使性能在这个范围内保持平稳,您可以管理Metabase同步其元数据的时间与您连接的数据库。
现在,让我们确保您的Metabase应用程序能够很好地适应规模。
垂直缩放
垂直缩放是暴力手段。给Metabase更多的内核和内存,它将有更多的可用资源来完成它的工作。如果遇到与应用程序本身相关的性能问题(即,与数据库的宽度和大小无关),则在功能更强大的计算机上运行Metabase可以提高性能。
也就是说,Metabase已经是开箱即用的高效工具。例如,对于AWS上的starterMetabase实例,我们建议使用平台即服务技术在t3.small实例,并从那里扩展。那是一台双核机器,有2GB的内存。4-8gb的计算机应该可以处理数百个用户,如果需要,可以增加内核数量和千兆字节内存。
虽然添加更多的内核和内存会很有效,但是通常最好使用水平伸缩来支持更多的用户。原因是每个Metabase实例都内置了数据库连接限制,以防止实例用请求压倒数据仓库。你可以增加连接数可用于您的实例,但我们仍建议使用多个实例。
水平缩放
水平缩放涉及到将Metabase的多个实例与负载平衡器一起运行,以将流量定向到实例。Metabase是为水平扩展而设置的,因此不需要任何特殊配置来运行Metabase的多个实例。
水平扩展的主要用例是提高可靠性(也称为“高可用性”),但是水平扩展也可以提高多用户性能。当负载平衡时,高流量、CPU绑定的Metabase实例的某些流量被定向到其他实例时,其性能会更好(更快),因为CPU负载将分布在多台计算机上。
Metabase与本地H2数据库存储你的申请数据(所有的问题,仪表板,日志和其他Metabase数据),但在生产环境中运行时,应升级到关系数据库,如PostgreSQL在单独的服务器上运行。事实上,当水平扩展时,必须使用在单独服务器上运行的关系数据库来存储应用程序数据。这样,Metabase的所有实例都可以共享一个公共数据库。对于所有生产实例,我们建议在单独的服务器上为所有生产实例使用外部数据库,即使您只运行过一个Metabase实例,因此外部数据库不会增加水平扩展的成本。
Metabase使用外部应用程序数据库存储用户会话数据,这样当一个或所有Metabase实例关闭时,用户不必担心丢失已保存的工作,管理员也不必处理配置粘滞会话以确保用户连接到正确的Metabase实例。负载平衡器会将用户路由到一个可用的实例,这样他们就可以继续工作了。
利用基于时间的水平缩放
一些客户根据一天中的时间调整Metabase实例的数量。例如,一些公司会在早上启动Metabase的多个实例,以便在人们登录并运行其上午的仪表板时处理突发的流量,然后在下午(或晚上或周末)关闭这些实例,以节省云开支。
如果您使用我们的弹性部署,您可以配置两者基于资源的缩放触发器和基于时间的缩放。对于其他环境,例如 Kubernetes 或 Google Cloud Platform,您需要参考每个系统的相应文档来设置类似的自动调整规则。
简单的负载平衡
负载平衡器将流量定向到多个Metabase实例,以确保每个请求获得最快的响应。如果Metabase的一个实例暂时关闭,负载平衡器将请求路由到另一个可用实例。
使用Metabase设置负载平衡器很简单。Metabase API公开运行状况检查终结点,/api/health,负载平衡器可以调用它来确定Metabase实例是否已启动并响应请求。如果实例正常,则端点将返回一个HTTP状态代码200 OK。否则,负载平衡器将知道将请求路由到另一个实例。
请参阅我们的指南在AWS弹性架构上运行Metabase查看设置负载平衡器以使用/api/health终结点。
数据仓库调整
构建数据仓库超出了本文的讨论范围,但是您应该知道,Metabase中的查询速度只会与数据库返回数据的速度一样快。如果您遇到的问题需要大量的数据,而这些数据需要很长时间才能检索到,那么无论Metabase有多快,这些查询时间都会影响您的体验。
以下是一些可以提高数据仓库性能的方法:
- 以预测人们会问的问题的方式组织数据。确定您的使用模式并以一种便于返回组织中常见问题的结果的方式存储数据。编写ETL以创建新表,这些表将来自多个源的频繁查询的数据集中在一起。
- 调整数据库。阅读数据库的文档,了解如何通过索引、缓存和其他优化来提高数据库的性能。
- 过滤数据.鼓励人们使用过滤器提问数据。他们还应该利用Metabase的数据探索工具(包括记录预览),这样他们只查询与他们试图回答的问题相关的数据。
- 决定是使用数据库还是数据仓库。人们通常从使用像MySQL数据库或PostgreSQL。虽然这些数据库的扩展性相当好,但它们通常没有针对Metabase将使用的分析查询类型进行优化。像这样的操作
sum
或max
当你达到一定的程度时会减速。随着分析应用的增长,您可能会发现需要探索专用的数据仓库,例如 Amazon Redshift, Google BigQuery, 或 Snowflake..
Metabase应用程序最佳实践
以下是一些策略,可以最大限度地利用Metabase应用程序:
- 只需要你需要的数据.
- 使用托管关系数据库存储Metabase应用程序数据.
- 缓存查询.
- 寻找瓶颈.
- 增加到Metabase应用程序数据库的最大连接数.
- 增加到每个数据库的最大连接数.
- 只在需要时与数据库同步.
- 升级至Metabase的最新版本.
- 使您的浏览器保持最新.
只需要你需要的数据
如果人们正在运行大量返回大量记录的查询,那么Metabase的速度是否快并不重要:用户只会以数据仓库返回所请求记录的速度获取数据。有时,人们对仪表板的要求太高了:当一个包含50个问题的仪表板加载时,它会同时发送50个请求数据的请求。根据数据库的大小,返回这些记录可能需要相当长的时间。
但这不是全部。Metabase不会因为您在仪表板中提出更多问题而减慢速度。如果您的问题没有获取大量数据,或者您的数据仓库可以在一秒钟内返回结果,那么50个问题将很快加载。
不过,总的来说,鼓励人们保持仪表盘的重点。仪表板是用来讲述你的数据的故事,你可以用几个问题(甚至一个问题)来讲述一个好故事。利用Metabase的数据探索工具来了解您的数据(例如在表中预览记录的能力),这样您就可以只拨入回答问题所需的记录。
因此,确保每个问题都是完成仪表板所必需的,并且在跨时间或跨空间查询数据时要特别注意,因为您可以通过将问题限制在较短的时间跨度或较小的区域来过滤掉大量不必要的数据。
使用托管关系数据库存储Metabase应用程序数据
应用程序数据库存储所有问题、仪表板,集合、权限以及与Metabase应用程序相关的其他数据。您可以使用关系数据库(如PostgreSQL或MySQL)来管理您的应用程序数据库,但我们推荐一个托管解决方案,如AWS RDS。RDS将自动备份,并使您更容易在扩展时调整存储和计算,从而使您少担心一件事。托管数据库解决方案对于自托管的客户特别有用,商业版利用了Metabase的优势审核功能,因为启用审核将增加应用程序数据库中的数据Metabase存储量。
缓存查询
你可以配置缓存存储最近提出的问题的结果,以便不需要重新计算。Metabase将向用户显示结果的时间戳,如果用户想重新运行查询,可以手动刷新问题的结果。缓存适用于不经常更新的结果。
寻找瓶颈
一些商业版本提供审计工具用于监视应用程序的使用和性能。例如,您可以查看有多少问题正在被询问,由谁提出,以及这些问题运行了多长时间,这有助于确定任何需要注意的瓶颈。
增加到Metabase应用程序数据库的最大连接数
Metabase应用程序数据库的默认连接数MB_APPLICATION_DB_MAX_CONNECTION_POOL_SIZE环境变量,当前默认设置为15。如果您的使用经常消耗所有这些连接,则可以通过增加最大连接数来提高性能。或者,您可以通过水平伸缩来增加连接的数量(例如,如果您添加了一个额外的Metabase实例,那么您实际上就向应用程序数据库添加了另外15个连接)。
您可以通过以下方式检查连接数:查看日志,并检查线路,如... App DB connections: 12/15。在该示例中,Metabase正在使用15个可用应用程序数据库连接中的12个。
增加到每个数据库的最大连接数
类似地,单个Metabase实例到每个数据库的默认最大连接数为15,即每个数据库的最大连接数为15,因此,如果已将Metabase连接到两个数据库,则最多可以连接30个。
可以通过更改MB_JDBC_DATA_WAREHOUSE_MAX_CONNECTION_POOL_SIZE环境变量。与上面的应用程序数据库连接一样,您还可以通过水平伸缩来增加连接的数量。每个附加的Metabase实例都会将最大连接数增加15个(或您设置的任何最大值)。要了解更多信息,请参阅我们的环境变量文件.
只在需要时与数据库同步
默认情况下,Metabase每小时执行一次轻量级同步。同步不会复制任何数据。Metabase只是检查以确保表列表,列,并且它在其应用程序数据库中维护的行与数据库中的表、列和行是最新的。
你可以设置这些同步的定时和频率。对于大型数据库,可以考虑限制Metabase执行同步的次数,并将这些同步限制在非高峰时间,尤其是在不经常向数据库添加新表的情况下。
升级至Metabase的最新版本
如果你还没有,我们推荐你升级至Metabase的最新版本获取最新的性能改进。
通过HTTP/2通过HTTPS服务Metabase
通过HTTPS over HTTP/2为Metabase实例提供服务可以提高性能,因为HTTP/1.1上的浏览器可以将每个域的连接限制为大约6个并发连接,而HTTP/2是在单个连接上多路传输的。更多的可用连接无法修复速度较慢的数据库,或线程已用完的重载Metabase实例,但至少您会知道您的浏览器不会限制您的连接。
使您的浏览器保持最新
Metabase是一个web应用程序,可以从最新和最好的浏览器版本中获益,比如 Firefox, Chrome, Edge, 和Safari..
支持的部署
建立Metabase的方法有很多种;我们的最爱包括:
- AWS弹性豆茎:看看我们的弹性部署Metabase建立指南。我们使用Elastic Beanstalk托管内部Metabase应用程序。
- Docker:参考在Docker上运行Metabase.
Google Cloud Platform, Microsoft Azure, Digital Ocean, Heroku,以及其他云提供商为托管您的Metabase应用程序提供了其他很好的替代方案。
托管Metabase
如果您不想处理Metabase应用程序的照管和馈送,Metabase提供了一个托管解决方案。您仍然需要确保数据源的性能,但不再需要管理Metabase应用程序的运行。
寻求帮助
如果你还有问题,很可能有人已经有了同样的问题。看看Metabase讨论论坛搜索你的问题。如果你找不到解决办法,请提交你自己的问题。
Metabase中文社区