padjee Asked: 2022-10-20 07:57:20 +0800 CST2022-10-20 07:57:20 +0800 CST 2022-10-20 07:57:20 +0800 CST postgresql 数据库集群与具有多个数据库的一台服务器 772 原谅我愚蠢的问题。 我想知道 postgreSQL 数据库集群(1 个服务器、N 个数据库、N 个端口)与一台服务器托管多个数据库(1 个服务器、N 个数据库、1 个端口)之间有什么区别? 我已经阅读了集群here以及here和this。我只是不明白。对我来说更奇怪的是(由于我缺乏知识),在 OpDash 上它说集群可以同时运行不同版本的 postgres。:( 现实世界中是否有任何数据库集群使用示例?假设我想用主从复制做高可用性,我需要数据库集群吗? 请赐教或指出方向/文章。 谢谢 postgresql 1 个回答 Voted Best Answer Vérace 2022-10-20T09:19:19+08:002022-10-20T09:19:19+08:00 PostgreSQL集群是 Oracle 用语中的“实例”,(这不是“正常”定义 - 见下文)在一台机器上工作。 除了两个模板(见下文)之外,您可以拥有一个只有一个数据库的 PostgreSQL 实例(集群)。要拥有一个工作系统,您将拥有 3 个数据库 - 两个模板和一个“工作”数据库。 您创建的所有 PostgreSQL 数据库(即公司、组织...)都可以有一个或多个您也可以创建的模式。任何数据库都可以有多个模式 - 功能的逻辑分离 - 人力资源、会计等,即在您的整个公司/组织内。 您将获得postgres数据库,template0并且template1默认情况下。您永远不应该触摸template0- 它会使您的系统无法运行 - 这是关于如何从模板复制数据库的博客。模板是“骨架”——您可以从中创建数据库——所有设置(来自postgresql.conf)和系统目录都在那里,但没有普通的表!\d如果您从 template1 中发出 a ,您将收到以下消息:Did not find any relations. 在同一台机器上,您可以根据需要(在合理范围内)使用不同的端口拥有许多集群(PostgreSQL 定义 - 请参阅下面的集群讨论)。生产机器通常使用 5432,而开发/UAT 机器可能有一些使用不同端口的集群(即实例)——运行小型测试数据库并不是很占用资源! 所有这些数据库都可以有自己的(一组)模式 - 因此您可以(例如)在端口 5432、5433 和 5434 上运行3 个( PostgreSQL 定义的)集群,每个集群都有一个 hr 模式,一个会计模式(尽可能多的模式 - 在合理范围内)。 您没有义务创建 (a) 模式 - 它有助于将大型数据库逻辑分离为其组成部分(参见hr/accts...) 重新集群! 我想我看到了集群/数据库/模式混淆的原因! PostgreSQL 非常古老——它源自 Ingres: Ingres 最初是加州大学伯克利分校的一个研究项目,从 1970 年代初开始,到 1985 年结束。 这比甲骨文 1979 年的第一个版本早了整整十年。它使用的词汇比大多数系统的文档都要旧。 请注意我使用的术语: 系统catalogs(而不是更常见的系统“表”) relations(同样,而不是“表” ——PostgreSQL 区分了系统表(目录)和普通表(关系))。 PostgreSQL 的人喜欢使用其他术语,即在其他系统和一般用法中,tuple它们在很大程度上被“记录”和/或“行”所attribute取代,并被“列”所取代。这种变化可能是由无处不在的电子表格推动的! 这些术语源自关系微积分,该微积分源自Ted Codd使用数学语言撰写的论文。Ingres 系统的创始人是学者Michael Stonebraker,因此保留了(可能被认为是)过于学术的术语。 如今,“ cluster”被认为是: 计算机集群是一组协同工作的计算机,因此可以将它们视为单个系统。 这不是PostgreSQL 的定义——可能源于旧的用法——我找不到任何链接,所以这是我的猜测! PostgreSQL 集群的最佳定义是 PostgreSQL自己的定义: 数据库集群是由正在运行的数据库服务器的单个实例管理的数据库集合。 请注意,多台机器没有任何意义——它是正在运行的数据库服务器的单个实例!一台机器上可以有许多(PostgreSQL)集群(即实例)——在某些方面,PG 定义与更普遍接受的集群定义相反(释义): Normal definition: Many machines, one system PostgreSQL definiton: Many systems, one machine 再HA 使用 Master/Slave 进行复制将自动使两个 PostgreSQL 集群位于不同的机器上——这可能涉及多个数据库,但正如我所说,在 PROD 中,它通常专用于一个数据库(除了你的骨架模板,你不能删除)。 您必须提供故障转移配置,然后您就拥有了现代意义上的集群——多台机器,一个系统。对 PostgreSQL 高可用性的完整讨论本身就是一个答案,并且有许多不同的选项 - 我会阅读 PostgreSQL 自己对此的看法,以及PostgresPro(PostgreSQL 世界中的大人物)的这篇文章,它提供了一个列表可以完成这项工作的 4 个系统: 最后,还有Percona,(见这里)和ManyNines(在撰写本文时有点过时 - 2022 年 10 月 20 日) - 在(开源)数据库世界中都很重要。 您需要阅读所有这些帖子,点击链接并确保您了解每个系统的优缺点以及您和您的利益相关者可以/想要做出的妥协(预算、RTO/RPO、专业知识)。 关于“集群”的最后一句话: 最后,为了增加一点复杂性,现在有“本地”分布式的 PostgreSQL 系统。有TimescaleDB和Citusdata - 它们是“分布式 PostgreSQL”。这些通过分片来工作——即不同机器上的不同数据块,同时保持(用户指定的,通常是素数)级别的冗余。 他们的 HA 解决方案似乎是基于云的(Citusdata 归微软所有) - 请参见此处(Timescale)和此处Citus。两者都基于令人惊叹的 PostgreSQL扩展系统,这毫无价值!你可能也想看看那里。 类似的系统还有 CockroachDB、Yugabyte 和 TiDB。 最后,来自另一组重量级人物的集群定义(第 2 页顶部): 一个数据库集群由 N 个数据库实例组成,这些实例运行在 N 个物理上独立的机器上,不共享任何组件,并通过网络相互连接。每个实例都包含一个完整的数据副本,并且能够启动和维护任意时间点快照事务。 所以,这些家伙的定义与之前的所有定义都不同……你想想……
PostgreSQL集群是 Oracle 用语中的“实例”,(这不是“正常”定义 - 见下文)在一台机器上工作。
除了两个模板(见下文)之外,您可以拥有一个只有一个数据库的 PostgreSQL 实例(集群)。要拥有一个工作系统,您将拥有 3 个数据库 - 两个模板和一个“工作”数据库。
您创建的所有 PostgreSQL 数据库(即公司、组织...)都可以有一个或多个您也可以创建的模式。任何数据库都可以有多个模式 - 功能的逻辑分离 - 人力资源、会计等,即在您的整个公司/组织内。
您将获得
postgres
数据库,template0
并且template1
默认情况下。您永远不应该触摸template0
- 它会使您的系统无法运行 - 这是关于如何从模板复制数据库的博客。模板是“骨架”——您可以从中创建数据库——所有设置(来自postgresql.conf
)和系统目录都在那里,但没有普通的表!\d
如果您从 template1 中发出 a ,您将收到以下消息:Did not find any relations.
在同一台机器上,您可以根据需要(在合理范围内)使用不同的端口拥有许多集群(PostgreSQL 定义 - 请参阅下面的集群讨论)。生产机器通常使用 5432,而开发/UAT 机器可能有一些使用不同端口的集群(即实例)——运行小型测试数据库并不是很占用资源!
所有这些数据库都可以有自己的(一组)模式 - 因此您可以(例如)在端口 5432、5433 和 5434 上运行3 个( PostgreSQL 定义的)集群,每个集群都有一个 hr 模式,一个会计模式(尽可能多的模式 - 在合理范围内)。
您没有义务创建 (a) 模式 - 它有助于将大型数据库逻辑分离为其组成部分(参见hr/accts...)
重新集群!
我想我看到了集群/数据库/模式混淆的原因!
PostgreSQL 非常古老——它源自 Ingres:
这比甲骨文 1979 年的第一个版本早了整整十年。它使用的词汇比大多数系统的文档都要旧。
请注意我使用的术语:
系统
catalogs
(而不是更常见的系统“表”)relations
(同样,而不是“表” ——PostgreSQL 区分了系统表(目录)和普通表(关系))。PostgreSQL 的人喜欢使用其他术语,即在其他系统和一般用法中,
tuple
它们在很大程度上被“记录”和/或“行”所attribute
取代,并被“列”所取代。这种变化可能是由无处不在的电子表格推动的!这些术语源自关系微积分,该微积分源自Ted Codd使用数学语言撰写的论文。Ingres 系统的创始人是学者Michael Stonebraker,因此保留了(可能被认为是)过于学术的术语。
如今,“
cluster
”被认为是:这不是PostgreSQL 的定义——可能源于旧的用法——我找不到任何链接,所以这是我的猜测!
PostgreSQL 集群的最佳定义是 PostgreSQL自己的定义:
请注意,多台机器没有任何意义——它是正在运行的数据库服务器的单个实例!一台机器上可以有许多(PostgreSQL)集群(即实例)——在某些方面,PG 定义与更普遍接受的集群定义相反(释义):
再HA
使用 Master/Slave 进行复制将自动使两个 PostgreSQL 集群位于不同的机器上——这可能涉及多个数据库,但正如我所说,在 PROD 中,它通常专用于一个数据库(除了你的骨架模板,你不能删除)。
您必须提供故障转移配置,然后您就拥有了现代意义上的集群——多台机器,一个系统。对 PostgreSQL 高可用性的完整讨论本身就是一个答案,并且有许多不同的选项 - 我会阅读 PostgreSQL 自己对此的看法,以及PostgresPro(PostgreSQL 世界中的大人物)的这篇文章,它提供了一个列表可以完成这项工作的 4 个系统:
最后,还有Percona,(见这里)和ManyNines(在撰写本文时有点过时 - 2022 年 10 月 20 日) - 在(开源)数据库世界中都很重要。
您需要阅读所有这些帖子,点击链接并确保您了解每个系统的优缺点以及您和您的利益相关者可以/想要做出的妥协(预算、RTO/RPO、专业知识)。
关于“集群”的最后一句话:
最后,为了增加一点复杂性,现在有“本地”分布式的 PostgreSQL 系统。有TimescaleDB和Citusdata - 它们是“分布式 PostgreSQL”。这些通过分片来工作——即不同机器上的不同数据块,同时保持(用户指定的,通常是素数)级别的冗余。
他们的 HA 解决方案似乎是基于云的(Citusdata 归微软所有) - 请参见此处(Timescale)和此处Citus。两者都基于令人惊叹的 PostgreSQL扩展系统,这毫无价值!你可能也想看看那里。
类似的系统还有 CockroachDB、Yugabyte 和 TiDB。
最后,来自另一组重量级人物的集群定义(第 2 页顶部):
所以,这些家伙的定义与之前的所有定义都不同……你想想……