Citus 多CN部署与Citus MX

简介: Citus MX是Citus集群中横向扩展CN能力的技术,本文件聊一下Citus MX使用的话题

再谈Citus 多CN部署与Citus MX

Citus集群由Coordinator(CN节点)和Worker节点组成。CN节点上放元数据负责SQL分发; Worker节点上放实际的分片,各司其职。
但是,Citus里它们的功能也可以灵活的转换。

1. Worker as CN

当一个普通的Worker上存储了元数据后,就有了CN节点分发SQL的能力,可以分担CN的负载。
这样的Worker按官方的说法,叫做Citus MX节点。

配置Citus MX的前提条件为Citus的复制模式必须配置为streaming。即不支持在多副本的HA部署架构下使用

citus.replication_model = streaming

然后将普通的Worker变成Citus MX节点

select start_metadata_sync_to_node('127.0.0.1',9002);

默认情况下,Citus MX节点上也会分配分片。官方的Citus MX架构中,Citus MX集群中所有Worker都是Citus MX节点。

如果我们只想让少数几个Worker节点专门用于分担CN负载,那么这些节点上是不需要放分片的。
可以通过设置节点的shouldhaveshards属性进行控制。

SELECT master_set_node_property('127.0.0.1', 9002, 'shouldhaveshards', false);

2. CN as Worker

Citus里CN节点也可以作为一个Worker加到集群里。

SELECT master_add_node('127.0.0.1', 9001, groupid => 0);

CN节点作为Worker后,参考表也会在CN上存一个副本,但默认分片是不会存在上面的。
如果希望分片也在CN上分配,可以把CN的shouldhaveshards属性设置为true。

SELECT  master_set_node_property('127.0.0.1', 9001, 'shouldhaveshards', true);

配置后Citus集群成员如下:

postgres=# select * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards 
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------
      1 |       1 | 127.0.0.1 |     9001 | default  | f           | t        | primary  | default     | f              | t
      3 |       0 | 127.0.0.1 |     9000 | default  | t           | t        | primary  | default     | f              | t
      2 |       2 | 127.0.0.1 |     9002 | default  | t           | t        | primary  | default     | t              | f
(3 rows)

把CN作为Worker用体现了Citus的灵活性,但是其适用于什么场景呢?

官方文档的举的一个例子是,本地表和参考表可以Join。

这样的场景我们确实有,那个系统的表设计是:明细表分片,维表作参考表,报表作为本地表。
报表之所以做成本地表,因为要支持高并发访问,但是又找不到合适的分布键让所有SQL都以路由方式执行。
报表做成参考表也不合适,副本太多,影响写入速度,存储成本也高。

那个系统用的Citus 7.4,还不支持这种用法。当时为了支持报表和参考表的Join,建了一套本地维表,通过触发器确保本地维表和参考维表同步。

3. 分片隐藏

在Citus MX节点(含作为Worker的CN节点)上,默认shard是隐藏的,即psql的'd'看不到shard表,只能看到逻辑表。
Citus这么做,可能是担心有人误操作shard表。

如果想在Citus MX节点上查看有哪些shard以及shard上的索引。可以使用下面的视图。

  • citus_shards_on_worker
  • citus_shard_indexes_on_worker

或者设置下面的参数

citus.override_table_visibility = false

4. Citus是怎么隐藏分片的?

Citus的plan hook(distributed_planner)中篡改了pg_table_is_visible函数,将其替换成citus_table_is_visible
这个隐藏只对依赖pg_table_is_visible函数的地方有效,比如psql的\d。直接用SQL访问shard表是不受影响的。

static bool
ReplaceTableVisibleFunctionWalker(Node *inputNode)
{
...
        if (functionId == PgTableVisibleFuncId())
        {
            ...
            functionToProcess->funcid = CitusTableVisibleFuncId();
        ...

5. Citus多CN方案的限制和不足

  1. 不能和多副本同时使用
  2. Citus MX节点不能访问本地表
  3. 不能控制Citus MX节点上不部署参考表

6. 参考

相关文章
|
SQL 存储 运维
从Citus深度解密如何基于PostgreSQL做分布式数据库
从源码级别揭秘Citus如何基于PostgreSQL做一款分布式数据库,解决分布式场景的数据分片、分布式SQL、分布式事务、数据倾斜、数据迁移等难点问题,理解分布式领域设计的“取”与“舍”。
3154 3
从Citus深度解密如何基于PostgreSQL做分布式数据库
|
存储 SQL 安全
分布式 PostgreSQL,Citus(11.x) 效用函数
分布式 PostgreSQL,Citus(11.x) 效用函数
1040 0
|
SQL 关系型数据库 分布式数据库
Citus 简介,将 Postgres 转换为分布式数据库
【10月更文挑战第4天】Citus 简介,将 Postgres 转换为分布式数据库
593 4
|
JSON 安全 API
如何高效编写API接口:以Python与Flask为例
构建RESTful API的简明教程:使用Python的Flask框架,从环境准备(安装Python,设置虚拟环境,安装Flask)到编写首个API(包括获取用户列表和单个用户信息的路由)。运行API服务器并测试在`http://127.0.0.1:5000/users`。进阶话题包括安全、数据库集成、API文档生成和性能优化。【6月更文挑战第27天】
875 7
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
1349 4
|
传感器 数据采集 物联网
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
1236 0
|
SQL 关系型数据库 分布式数据库
从Citus深度解密如何基于PostgreSQL做分布式数据库
前言分布式数据库能够解决海量数据存储、超高并发吞吐、大表瓶颈以及复杂计算效率等单机数据库瓶颈难题,当业务体量即将突破单机数据库承载极限和单表过大导致性能、维护问题时,分布式数据库是解决上述问题的高性价比方案。数据库作为分布式改造的最大难点,就是"和使用单机数据库一样使用分布式数据库",这也一直是广大...
6275 0
从Citus深度解密如何基于PostgreSQL做分布式数据库
|
存储 安全 Android开发
Android 动态权限请求的设计与实现
【4月更文挑战第6天】在现代安卓应用开发中,用户隐私和安全性日益受到重视。因此,操作系统引入了动态权限请求机制,要求应用在运行时请求特定权限而非安装时一次性获取所有权限。本文将详细探讨Android动态权限请求的关键概念、设计原则以及实现过程,旨在帮助开发者构建更加安全且用户体验友好的应用。通过深入分析Android系统权限模型及其演变,我们将展示如何在实际项目中有效地实施动态权限请求,并处理可能遇到的挑战。
489 0
|
算法 决策智能 索引
二部图问题
二部图问题
407 0
|
域名解析 网络协议 应用服务中间件
Harbor使用公网证书
Harbor使用公网证书

热门文章

最新文章