不得不说,毕业设计push我学习了很多新鲜的知识
由于硬件条件不允许,我在两台虚拟机上部署了三个postgresql以组成一个协调节点和两个工作节点的集群,其中database-1节点上部署了一个工作节点,另外一个称为database-2.
在将database-2上的工作节点添加到协调节点时,遇到以下报错:
alfresco=# SELECT * FROM citus_add_node('database-2',5433);
WARNING: function assign_distributed_transaction_id(integer, integer, unknown) does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
ERROR: failure on connection marked as essential: database-2:5433
我们可以看到这里很奇怪的一个点是:SQL语句把我的两个参数看成了三个参数!!!
进一步查看具体的报错:
2025-02-10 09:12:50.399 UTC [37696] ERROR: relation "pg_dist_node_metadata" does not exist at character 51
2025-02-10 09:12:50.399 UTC [37696] STATEMENT: SELECT metadata ->> 'server_id' AS server_id FROM pg_dist_node_metadata
2025-02-10 09:12:50.401 UTC [37696] ERROR: function assign_distributed_transaction_id(integer, integer, unknown) does not exist at character 57
2025-02-10 09:12:50.401 UTC [37696] HINT: No function matches the given name and argument types. You might need to add explicit type casts.
2025-02-10 09:12:50.401 UTC [37696] STATEMENT: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;SELECT assign_distributed_transaction_id(0, 9, '2025-02-10 09:12:50.39956+00');
2025-02-10 09:18:27.824 UTC [38093] ERROR: relation "pg_dist_node_metadata" does not exist at character 51
2025-02-10 09:18:27.824 UTC [38093] STATEMENT: SELECT metadata ->> 'server_id' AS server_id FROM pg_dist_node_metadata
2025-02-10 09:18:27.851 UTC [38093] ERROR: function assign_distributed_transaction_id(integer, integer, unknown) does not exist at character 57
2025-02-10 09:18:27.851 UTC [38093] HINT: No function matches the given name and argument types. You might need to add explicit type casts.
2025-02-10 09:18:27.851 UTC [38093] STATEMENT: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;SELECT assign_distributed_transaction_id(0, 1, '2025-02-10 09:18:27.824706+00');
出现了metadata的问题
进一步发现是该工作节点并没有安装上Citus extension,安装后可正常运行
alfresco=# SELECT * FROM citus_get_active_worker_nodes();
node_name | node_port
------------+-----------
database-2 | 5433
database-1 | 5432
(2 rows)
Citus 是一个开源的 PostgreSQL 扩展,将 PostgreSQL 数据库转换为分布式数据库。它提供了 PostgreSQL 的所有优点,无论规模如何,从单个节点到大型分布式数据库集群。Citus 结合了并行性、在内存中保留更多数据和更高的 I/O 带宽,可以显著提高多租户 SaaS 应用程序、面向客户的实时分析仪表板和时间序列工作负载的性能。
分片和分布式表:Citus 支持将数据根据分片键自动分布到集群的不同节点上。
分布式查询引擎:Citus 可以并行化查询执行,并随集群中工作节点的数量线性扩展。
引用表和本地表:Citus 提供了引用表(在每个工作节点上复制)和本地表(存储在单个工作节点上),以满足不同的查询需求。
高可用性和备份:Citus 支持 PostgreSQL 的复制机制,提供高可用性和数据备份。
Citus 集群由一个协调节点(coordinator)和多个工作节点(workers)构成:
协调节点:存储元数据,接收客户端请求,并生成分布式执行计划。
工作节点:存储实际数据,执行协调节点发来的查询请求。
多租户数据库:Citus 支持为每个租户提供快速查询,分片逻辑在数据库中实现,而不是在应用程序中。
实时分析:Citus 支持对大型数据集的实时查询,适用于事件系统和时间序列数据。
高性能增删改查:Citus 可以处理高并发的增删改查操作。
数据仓库:Citus 可以作为数据仓库使用,支持大规模数据的存储和查询。
完整的 SQL 覆盖:Citus 支持完整的 SQL 功能,包括事务处理和 ACID 特性。
水平扩展:Citus 支持水平扩展,可以通过添加新的工作节点来处理更多数据。
高并发性能:Citus 可以在高并发下保持高性能,支持大量并发用户。
数据模型和 SQL 功能的选择:Citus 的高性能需要考虑数据模型和 SQL 功能的选择。
适用场景:Citus 适用于需要分布式处理和高并发的场景,但对于单节点 PostgreSQL 可以满足需求的场景,Citus 可能是不必要的。
Citus 是一个强大的 PostgreSQL 扩展,将 PostgreSQL 转换为分布式数据库,适用于处理大规模数据集和高并发场景。它提供了分片、分布式查询引擎、引用表和本地表等功能,支持多租户数据库、实时分析、高性能增删改查和数据仓库等应用场景。
Citus集群拓扑结构介绍https://zhuanlan.zhihu.com/p/374819244Citus Documentation
https://docs.citusdata.com/en/stable/index.html
不需要把软件安装两遍,创建两个实例即可
user: postgres
准备环境(有很多命令都是在postgresql目录下的)
export PATH=$PATH:/usr/lib/postgresql/15/bin
首先创建一个区别于之前工作目录的文件夹
mkdir /var/lib/postgresql/15/worker
初始化工作目录:会生成各种配置文件
initdb -D /var/lib/postgresql/15/worker
此时不能直接启动,需要修改postgresql.conf和pg_hba.conf文件
postgresql.conf文件
# -----------------------------
# PostgreSQL configuration file
# -----------------------------
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5433 # (change requires restart)
max_connections = 100 # (change requires restart)
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
# Add settings for extensions here
shared_preload_libraries = 'citus'
pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all md5
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
重启postgresql:
systemctl restart postgresql
由于postgresql的管理问题,有可能postgresql这个service的status显示为active,但是事实上仍有错误出现。为了避免这种情况,进一步查看它的主要service:
systemctl status [email protected]
没有问题后,启动服务:
pg_ctl -D /var/lib/postgresql/15/worker -l worker_logfile start
work_logfile会被创建在当前工作目录下,用于记录日志,有报错时可以查看
验证是否启动成功:
pg_ctl -D /var/lib/postgresql/15/worker -o "-p 5433" status
如配置成功则显示running
其余集群相关配置请参考官方文档:
Ubuntu or Debian — Single Nodehttps://docs.citusdata.com/en/stable/installation/single_node_debian.html
Ubuntu or Debian — Multi-Nodehttps://docs.citusdata.com/en/stable/installation/multi_node_debian.html