通过分离成多个集群来优先排序数据库

来自 PostgreSQL wiki
跳转到导航跳转到搜索

(此页面目前为草稿质量。它反映了截至 8.4 和 8.5 中期开发的当前状态)。

通过分离集群来优先排序数据库

在 pgsql-general 邮件列表中,有人想知道如何为不同的数据库(或数据库集)分配不同的优先级,以便一个数据库上的长时间运行查询不会延迟其他数据库中的重要工作。

PostgreSQL 没有提供任何内置的优先级控制,因此您需要使用操作系统级别的设施来实现您的需求。有一些复杂情况使得它比仅仅使用“renice”更难 - 请参阅 优先级 以获取解释。本质上,要实现真正有效的优先级排序,您需要运行独立的 PostgreSQL “集群”(即:一个具有自己的数据目录并监听特定端口或套接字文件的 postmaster),每个优先级级别一个。

你真的需要将它们分开吗?

在花费将您的数据库分成不同集群所需的时间和精力之前,请查看查询优化和数据库调整是否可以为您提供所需的性能。请参阅 性能优化

什么是集群?

在此上下文中,“集群”并不意味着像通常使用的那样,一群独立的机器一起工作。相反,在谈论 PostgreSQL 安装时,“集群”是指一组由一个 postmaster 控制的 PostgreSQL 数据库。该集群共享一个 postmaster、数据目录、后台写入器、共享内存块等。相同的 postgresql.confpg_hba.conf 适用于整个集群。对集群中任何数据库的所有连接都通过相同的端口或 unix 套接字进入 postmaster,postmaster 使用集群中相应的数据库启动一个后端来为连接提供服务。

虽然在一台机器上只有一个 PostgreSQL 集群是很典型的,并且大多数 PostgreSQL 的预装安装只提供了一个集群,但没有什么能阻止您创建多个集群。如果您有多个集群,管理工作会更多,因为每个集群都需要独立的备份、自动 vacuum 的独立调整等,但它也让您能够 调整 每个集群的不同,为它们分配不同的备份优先级等。特别是,您可以只对部分集群启用 PITR 风格的持续归档,这样您的关键数据库始终处于热备状态,而您的报告数据库只需偶尔备份。

由于每个集群都有自己的 postmaster,因此客户端必须连接到不同的端口(或 unix 套接字)才能访问不同的集群。如果这不可取,您可以在 postgresql.conf 中将集群绑定到特定 IP 地址,以便每个集群都监听同一个端口,但在具有多个 IP 地址的机器上监听不同的 IP 地址。

在一台机器上运行多个 PostgreSQL 集群有一个很大的缺点:每个集群都需要自己的共享内存分配,该分配的大小是固定的,并在集群启动时保留。这意味着您的高优先级集群无法在需要时从您的低优先级集群借用内存。谢天谢地,现在的内存很便宜。

这种资源分离意味着,除非您添加更多内存,否则两个(或更多)集群的总性能可能低于单个集群执行相同工作时的性能。但是,您的高优先级查询应该仍然运行得更快,除非它们需要大量内存。

(基于 Debian 的 Linux 系统,包括 Ubuntu,使管理多个集群变得容易。当您安装 PostgreSQL 时,Debian 打包系统将创建一个名为“main”的默认集群。您可以使用特定于 Debian 的 pg_createcluster 命令创建新集群。请参阅手册页。)

独立机器

最好的选择是将 PostgreSQL 实例分离到不同的物理机器上。它们将完全不会争夺资源。

一台机器上使用独立磁盘阵列的多个集群

如果您无法使用独立的机器,同一台机器上的多个集群实例,以及不同的物理独立磁盘 I/O 子系统,以及足够的 CPU,将有所帮助。您可以通过在启动 postmaster 时设置 nice 级别,并让其所有子进程继承该 nice 级别,非常有效地使用“nice”来优先排序 CPU 访问。

您通常希望每个集群都有一个独立的 RAID 控制器(如果您使用电池备份硬件 RAID),因为集群必须共享 RAID 控制器的写入缓存,而 RAID 控制器对操作系统的优先级一无所知。类似地,如果您使用软件 RAID,您将希望为每个集群创建完全独立的阵列。

要分离磁盘 I/O,只需将每个集群的数据目录放在存储在不同 RAID 阵列上的文件系统上即可。

一台机器上使用共享 CPU 和磁盘阵列的多个集群

如果您也无法分离 I/O 子系统,您将不得不求助于像“ionice”这样的 I/O 优先级系统,以便为集群分配不同的 I/O 优先级。同样,您可以在启动集群的 postmaster 时设置 I/O nice 级别,其所有子进程将继承该优先级。但是,您不应该指望这样做能取得很好的效果,因为由于多个竞争用户导致的寻道次数增加,磁盘 I/O 吞吐量会严重下降。

致谢

页面最初由 Ringerc 于 2009 年 11 月 26 日 02:23 (UTC) 创建。