警告
TimescaleDB v2.13 是最后一个为 PostgreSQL 版本 13、14 和 15 提供多节点支持的版本。
多节点 TimescaleDB 允许您直接从访问节点管理您的集群。当您的环境设置完成后,您无需直接登录到数据节点来管理您的数据库。
当您执行管理任务时,例如添加新列、更改权限或在分布式超表上添加索引,您可以从访问节点执行该任务,它将应用于所有数据节点。但是,如果命令在常规表上执行,则该命令的效果仅在访问节点本地应用。同样,如果命令直接在数据节点上执行,则结果仅在该数据节点上可见。
创建或修改分布式数据库中的模式、角色、表空间和设置的命令也不会自动分发。这是因为这些对象和设置有时需要在访问节点上与数据节点上有所不同,甚至在数据节点之间有所不同。例如,数据节点可能具有独特的 CPU、内存和磁盘配置。节点差异使得无法假设单个配置适用于所有节点。此外,某些设置需要在公共可访问的访问节点上与数据节点上有所不同,例如具有不同的连接限制。角色可能在访问节点上没有 LOGIN
权限,但它需要在数据节点上具有此权限,以便访问节点可以连接。
角色和表空间也在同一实例上的多个数据库之间共享。其中一些数据库可能是分布式的,有些可能不是,或者配置了不同的数据节点集。因此,无法确定何时应将角色或表空间分发到数据节点,因为这些命令可以从不同的数据库中执行,而这些数据库不必是分布式的。
要从访问节点管理多节点集群,您可以使用 distributed_exec
函数。此函数允许完全控制在所有数据节点上创建和配置数据库设置、模式、角色和表空间。
本节的其余部分更详细地描述了如何在多节点环境中处理特定的管理任务。
在多节点环境中,您需要独立管理每个 PostgreSQL 实例上的角色,因为角色是实例级别的对象,在分布式和非分布式数据库之间共享,每个数据库都可以配置不同的数据节点集或不配置任何数据节点。因此,访问节点不会自动跨其数据节点分发角色或角色管理命令。当数据节点添加到集群时,假定它已经具有与其余节点保持一致所需的适当角色。如果不是这种情况,当您尝试创建或更改依赖于缺少或设置不正确的角色的对象时,可能会遇到意外错误。
为了帮助从访问节点管理角色,您可以使用 distributed_exec
函数。这对于在当前数据库中的所有数据节点上创建和配置角色非常有用。
当您创建分布式角色时,重要的是要考虑到与数据节点相比,同一角色可能需要在访问节点上进行不同的配置。例如,用户可能需要密码才能连接到访问节点,而集群内节点之间使用证书身份验证。您可能还希望为外部连接设置连接限制,但允许对数据节点的无限制内部连接。例如,以下用户可以使用密码对访问节点进行 10 个连接,但对连接到数据节点没有限制
CREATE ROLE alice WITH LOGIN PASSWORD 'mypassword' CONNECTION LIMIT 10;CALL distributed_exec($$ CREATE ROLE alice WITH LOGIN CONNECTION LIMIT -1; $$);
有关设置身份验证的更多信息,请参阅多节点身份验证部分。
某些角色也可以在访问节点上配置为没有 LOGIN
属性。这允许您在本地切换到该角色,但不能使用该用户从远程位置连接。但是,为了能够从访问节点以该用户身份连接到数据节点,数据节点需要配置启用 LOGIN
属性的角色。要为多节点设置创建非登录角色,请使用以下命令
CREATE ROLE alice WITHOUT LOGIN;CALL distributed_exec($$ CREATE ROLE alice WITH LOGIN; $$);
要允许新角色创建分布式超表,还需要授予其在数据节点上的使用权限,例如
GRANT USAGE ON FOREIGN SERVER dn1,dn2,dn3 TO alice;
通过授予在某些数据节点上使用权限,但不授予在其他数据节点上使用权限,您可以根据角色限制对数据节点子集的使用。
当您更改分布式角色时,请使用与创建角色相同的过程。角色需要在访问节点和数据节点上分两步进行更改。例如,按如下方式将 CREATEROLE
属性添加到角色
ALTER ROLE alice CREATEROLE;CALL distributed_exec($$ ALTER ROLE alice CREATEROLE; $$);
分布式数据库可以包含分布式和非分布式对象。通常,当发出命令以更改分布式对象时,它将应用于具有该对象(或其一部分)的所有节点。
但是,在某些情况下,设置应该因节点而异,因为节点的配置可能不同(例如,具有不同级别的 CPU、内存和磁盘容量),并且访问节点的作用与数据节点的作用不同。
本节介绍从分布式数据库内部执行命令时,分布式对象上的命令如何以及何时应用于所有数据节点。
ALTER DATABASE
命令仅在访问节点本地应用。这是因为数据库级别的配置通常需要在不同节点之间有所不同。例如,这是一个可能因节点的 CPU 功能而异的设置
ALTER DATABASE mydatabase SET max_parallel_workers TO 12;
即使数据库是同一分布式数据库的一部分,节点之间的数据库名称也可能不同。当您重命名数据节点的数据库时,还要确保更新访问节点上数据节点的配置,以便它引用新的数据库名称。
当您在访问节点上删除分布式数据库时,它不会自动删除数据节点上相应的数据库。在这种情况下,您需要直接连接到每个数据节点并在本地删除数据库。
分布式数据库不会在所有节点上自动删除,因为有关数据节点的信息位于访问节点上的分布式数据库中,但在执行删除命令时无法读取它,因为它无法在连接到数据库时发出。
此外,如果数据节点永久性地发生故障,您需要能够删除数据库,即使一个或多个数据节点没有响应。
如果可能,最好将数据完整地保留在数据节点上。例如,即使在访问节点上删除了数据库之后,您也可能想要备份数据节点。
或者,您可以在删除访问节点上的数据库之前,使用 drop_database
选项删除数据节点
SELECT * FROM delete_data_node('dn1', drop_database => true);
当您创建、更改或删除模式时,这些命令不会自动应用于所有数据节点。但是,当创建分布式超表时,如果其所属的模式在数据节点上不存在,则会创建缺少的模式。
要手动在所有数据节点上创建模式,请使用以下命令
CREATE SCHEMA newschema;CALL distributed_exec($$ CREATE SCHEMA newschema $$);
如果使用特定授权创建模式,则授权角色也必须在数据节点上存在,然后才能发出命令。同样的事情也适用于更改现有模式的所有者。
DROP OWNED
命令用于删除角色拥有的所有对象,并准备删除该角色。执行以下命令以准备在分布式数据库中的所有数据节点上删除角色
DROP OWNED BY alice CASCADE;CALL distributed_exec($$ DROP OWNED BY alice CASCADE $$);
但是请注意,在执行这些命令后,该角色可能仍然拥有其他数据库中的对象。
使用 GRANT
或 REVOKE
语句配置的权限在分布式超表上运行时应用于所有数据节点。当授予其他对象的权限时,需要使用 distributed_exec
手动分发该命令。
如果要应用于所有数据节点,则需要使用 distributed_exec
手动修改默认权限。默认权限引用的角色和模式需要在执行命令之前在数据节点上存在。
假定新数据节点已具有任何已更改的默认权限。默认权限不会自动追溯应用于新数据节点。
节点可能配置了不同的磁盘,因此需要在每个节点上手动配置表空间。特别是,访问节点可能没有与数据节点相同的存储配置,因为它通常不存储大量数据。因此,无法假设多节点集群中的所有节点都存在相同的表空间配置。
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面。