9.3 版本主要升级内容

协调器节点向worker连接时,若是瞬间业务量比较大,会出现达到最大连接数的错误,不太友好。

9.3 版本修复了这个问题,新增如下参数进行控制

citus.max_shared_pool_size(int)
允许连接到每一个worker节点的连接数量,默认 0

0:自动设置。即不会出现超过最大连接数错误的。
-1: 禁用该功能
其他:设置为该值

自动设置时,会将协调器节点的max_connections作为连接数的参考指标,因此协调器与worker的内存和最大连接数不一致的时候,自动设置的功能便不适合。

强制删除Citus节点

在某些情况下,比如worker节点宕机等情况发生时,允许丢失部分数据,以使服务可用时可能会用到。

  • 删除节点报错
test=# select master_remove_node('localhost', '1602');
ERROR:  you cannot remove the primary node of a node group which has shard placements
  • 查询节点的groupid
test=# select * from pg_dist_node;
 nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards 
--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------
      1 |       1 | localhost |     1601 | default  | f           | t        | primary  | default     | f              | t
      2 |       2 | localhost |     1602 | default  | f           | t        | primary  | default     | f              | t
(2 rows)

  • 删除关联信息
test=# delete from pg_dist_placement where groupid = 2;
-- 这个地方在删除前,也可以把pg_dist_placement备份一下
-- pg_dist_shard 最好也删除一下,要不全表扫描的时候也会报错
  • 删除节点
test=# select master_remove_node('localhost', '1602');
 master_remove_node 
--------------------

(1 row)

PostgreSQL容灾和新型两地三中心

本文将简诉PostgreSQL容灾方案,新型两地三中心的方案

PostgreSQL容灾方案

容灾可以选择同步或是异步模式。同步模式下无丢失数据风险,会损失一点点性能。异步模式下,会少量丢失数据,不会损失性能。

通常的方案(同步/异步模式均可):

  1. 一主一备流复制 ...Read more...

cluster table using index 根据索引重排表的物理存储顺序

最近家里有些事情,才开始进行更新

重排表物理存储顺序

语法

CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER [VERBOSE]

描述

根据索引的信息,编排表的物理存储顺序。操作是一次性的,意味着当操作结束后,新产生的数据,不会进行编排,当表依据索引进行编排后,PostgreSQL会记录该索引,当执行 CLUSTER table_name 时,会自动引用先前的索引。当 CLUSTER 不加任何参数时,会对该数据库下该用户的所有表(编排过的表)进行编排,若是超级用户,则会对所有表进行编排。此操作不能在事务中使用。操作过程中会加 ACCESS EXCLUSIVE 锁。

作用

当随机只读取一条记录时,表的物理存储顺序是不重要的。如果你访问很多数据并通过索引分组,或是根据索引键进行范围查询,或是一个索引有多条记录,重编排数据会很有用,因为当根据索引读取表的第一条数据时,其他所需数据也存在于改page中,这节省了磁盘和内存的使用,从而提高性能。

该 CLUSTER 会根据统计信息等内容选择索引扫描或顺序扫描对表数据进行重排序。

当根据索引进行扫描,会对表数据和索引数据进行临时copy处理,因此磁盘需要table size+index size的空间进行临时数据存储。

当进行顺序扫描时,会产生排序的临时文件,因此需要 table size * 2 + index size的空间进行临时数据存储,当然可以使用 enable_sort 禁止使用次方法。

示例

test=# create table aa(id int primary key);
CREATE TABLE
test=# select relname,relfilenode from pg_class where relname ~ 'aa';
 relname | relfilenode 
---------+-------------
 aa      |       33007
 aa_pkey |       33010
(2 rows)

test=# cluster aa using aa_pkey ;
CLUSTER
test=# select relname,relfilenode from pg_class where relname ~ 'aa';
 relname | relfilenode 
---------+-------------
 aa      |       33012
 aa_pkey |       33015
(2 rows)
-- relfilenode发生了改变

9.0.0_9.1.2更新内容

有些内容描述不清晰的未收录
修复的bug未收录

9.x 版本新增加不少内容,而这些内容在手册和CHANGELOG中并为体现,我比较倾向按点进行总结,后续会进行一些内容的更新.

9.0.0

  • 支持PostgreSQL 12
  • 添加UDFs函数,帮助PostgreSQL升级
  • 增加create_distributed_function UDF函数,创建分布式函数
  • 参考表之间,可以建立外键
  • MX模式下,允许本地执行
  • MX模式下,允许函数/存储过程的使用
  • 增加citus.enable_create_type_propagationsn参数,创建类型时,不自动传播
  • 增加citus.single_shard_commit_protocol参数,单分片多副本的提交协议
  • 增加EXPLAIN (SUMMARY) 语法,输出planing的时间信息
  • 支持生成列
  • mx模式支持smallserial和serial
  • master_update_node兼容mx模式
  • 传播alter function/create function/reindex语句
  • adaptive适配器使用2pc当没有副本的情况下
  • 增加pg_dist_object系统表

9.1.0

  • 创建插件自动传播
  • 修改role自动传播
  • 允许在多个分片间返回RECORD
  • 允许子查询HAVING
  • replication_modle是statement时不允许创建分布式函数
  • 废弃real-time执行器

9.1.1

  • fix bug

9.1.2

  • fix bug

参与到Citus的开发中

如何参与到Citus的研发工作当作

代码相关

通常来讲,我们仅需要两个仓库便可以

  • citus代码仓库
https://github.com/citusdata/citus

citus的代码在这个仓库。

  • 代码格式化仓库
https://github.com/citusdata/tools

代码编写后,需要执行citus_indent以使代码风格更加优美

代码下载后:
1. 安装uncrustify库(大于0.68版本)
2. make
3. sudo make install
4. man citus_indent查看帮助手册
citus_indent --diff 可以直接格式化 git add 的文件, git diff --cached 可以查看格式化后的文件

该–diff 指令需在ciuts代码的根目录使用,在下属子目录,例如src/xx会失败

  • 格式化单个文件
uncrustify src/lzzhang.c  -c /usr/local/etc/citustools/citus-style.cfg

订阅邮件

在github仓库,点击眼镜图标(watch),便可以收到相关邮件。

提交代码

克隆代码

点击fork按钮,将代码fork到自己的github空间

编写代码

  1. 下载自己空间的citus代码
  2. 编写代码
  3. 提交代码至自己的空间

提交到Citus

点击自己空间代码主页的New pull request按钮就提交到了Citus的Pull Requests中

CLA认证

大的公司的项目,通常都需要签署这个。
1. PR里会有一个连接点击进去认证就可以
2. 点击认证后会提示24小时之内会收到邮件,这个是手工的,可能需要等待几天的时间
3. 收到认真邮件,按邮件步骤完成
4. 等待citus认真通过,这个也是手工的,可能也要等待几天
5. 微软CLA认真,这个只需要点击一次就可以。

开始你的写作吧

国内的邮箱有的时候不太方便,比如给pg发邮件的时候,是收不到回复的,用gmail会好一些。