Postgres-XL的限制

  Postgres-XL是基于PostgreSQL的一个分布式数据库。

  相比于PostgreSQL,XL的表的数据是可以分布到不同的datanode上的,对存在于不同的datanode上的数据进行处理,目前还存在很多限制。当然可能在以后的新版本中,会突破这些限制。

  下面针对postgres-xl-10r1版本进行测试,看看目前还存在哪些限制。

1. 分布建不能更新

 1 select * from test2;
 2  id | name 
 3 ----+------
 4   1 | 1
 5   2 | 2
 6   5 | 5
 7   3 | 3
 8   4 | 4
 9 (5 rows)
10 
11 postgres=# update test2 set name='b' where id=2;                 
12 UPDATE 1
13 
14 postgres=# update test2 set id=5 where name='5';         
15 2018-11-07 18:13:49.533 CST [1831] ERROR:  could not plan this distributed update
16 2018-11-07 18:13:49.533 CST [1831] DETAIL:  correlated UPDATE or updating distribution column currently not supported in Postgres-XL.
17 2018-11-07 18:13:49.533 CST [1831] STATEMENT:  update test2 set id=5 where name='5';
18 ERROR:  could not plan this distributed update
19 DETAIL:  correlated UPDATE or updating distribution column currently not supported in Postgres-XL.
20 
21 postgres=# select * from test2;
22  id | name 
23 ----+------
24   1 | 1
25   5 | 5
26   2 | b
27   3 | 3
28   4 | 4
29 (5 rows)

 

2. 复杂查询

  在PostgreSQL,表数据只放在一台pc上,当两个表关联查询时,可以直接获取到表数据进行join。但是在Postgres-XL中,表数据是分布在不同的datanode上,datanode又可能分布在不同的pc上;这时候两个表进行关联查询需要从不同的datanode之间进行,如果是多个表进行关联查询,情况更加复杂了。

2.1 非分布键作为条件限制
 1 postgres=# select * from test1,test2;                                        
 2  id | name | id | name 
 3 ----+------+----+------
 4   1 | a    |  1 | 1
 5           .
 6           .
 7           .
 8   2 | b    |  2 | b
 9           .
10           .
11           .
12   4 | d    |  4 | 4
13 (40 rows)   
14 
15 postgres=# select * from test1,test2 where test1.name='b' and test2.name='b';
16  id | name | id | name 
17 ----+------+----+------
18   2 | b    |  2 | b
19 (1 row)
20 
21 postgres=# select * from test1,test2 where test1.name=test2.name;            
22 2018-11-08 11:08:08.939 CST [1510] ERROR:  cannot wait on a latch owned by another process
23 2018-11-08 11:08:08.939 CST [1405] LOG:  server process (PID 1510) was terminated by signal 11: Segmentation fault
24 2018-11-08 11:08:08.939 CST [1405] DETAIL:  Failed process was running: Remote Subplan
25 2018-11-08 11:08:08.939 CST [1405] LOG:  terminating any other active server processes
26 2018-11-08 11:08:08.940 CST [1436] WARNING:  terminating connection because of crash of another server process
27           .
28           .
29           .

  当where条件中直接判断两个表字段是否相等时,报错。多次尝试后,还出现过其他错误(例如:“ERROR:  Couldn't resolve SQueue race condition after 10 tries”),有时候也能执行成功,证明这一查询还是存在很大的问题。

 

2.2 非亲和表的限制

  亲和表,即两张表的分布类型和分布键都一致,称这两张表为亲和表。

 表test3和表test4都是以id列作为分布键、分布类型为Modulo,test3和test4是亲和表。

 1 postgres=# \d+ test3
 2                                                 Table "public.test3"
 3  Column |  Type   | Collation | Nullable |              Default              | Storage  | Stats target | Description 
 4 --------+---------+-----------+----------+-----------------------------------+----------+--------------+-------------
 5  id     | integer |           | not null | nextval('test3_id_seq'::regclass) | plain    |              | 
 6  name   | text    |           |          |                                   | extended |              | 
 7 Indexes:
 8     "test3_pkey" PRIMARY KEY, btree (id)
 9 Distribute By: MODULO(id)
10 Location Nodes: ALL DATANODES
11 
12 postgres=# \d+ test4
13                                    Table "public.test4"
14  Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
15 --------+---------+-----------+----------+---------+---------+--------------+-------------
16  id     | integer |           |          |         | plain   |              | 
17 Distribute By: MODULO(id)
18 Location Nodes: ALL DATANODES
19 
20 postgres=# select * from test3 order by id;
21  id | name 
22 ----+------
23   1 | a
24   2 | b
25   3 | cc
26   4 | dd
27   5 | ee
28   6 | ff
29 (6 rows)
30 
31 postgres=# select * from test4 order by id; 
32  id 
33 ----
34   1
35   2
36   4
37   6
38   8
39 (5 rows)
40 
41 postgres=# select * from test4 a inner join test3 b on a.id=b.id order by a.id;
42  id | id | name 
43 ----+----+------
44   1 |  1 | a
45   2 |  2 | b
46   4 |  4 | dd
47   6 |  6 | ff
48 (4 rows)

 

   下面是非亲和表test2与test4的内连接查询。结果是不正确的,而且有时执行查询会报错。

 1 postgres=# \d+ test2
 2                                    Table "public.test2"
 3  Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description 
 4 --------+---------+-----------+----------+---------+----------+--------------+-------------
 5  id     | integer |           | not null |         | plain    |              | 
 6  name   | text    |           |          |         | extended |              | 
 7 Indexes:
 8     "test2_pkey" PRIMARY KEY, btree (id)
 9 Distribute By: HASH(id)
10 Location Nodes: ALL DATANODES
11 
12 postgres=# select * from test2 order by id;
13  id  | name 
14 -----+------
15    1 | 1
16    2 | b
17    3 | 3
18    4 | 4
19    5 | 5
20    6 | 
21  111 | 
22  112 | 
23 (8 rows)
24 
25 postgres=# select * from test2 a inner join test4 b on a.id=b.id order by a.id;
26 2018-11-08 15:09:19.389 CST [1206] WARNING:  Unexpected data on connection, cleaning.
27  id | name | id 
28 ----+------+----
29   2 | b    |  2
30   4 | 4    |  4
31   6 |      |  6
32 (3 rows)

   同样,outer join也存在一样的问题,不支持非亲和表的关联查询。但是,非亲和表可以进行cross join关联查询(没有where条件)。

2.3 子查询限制

  子查询也受到非亲和表的限制,与2.2的情况基本一致,就不再去说明了。

 

  特殊说明:2.2和2.3中提到非亲和表的限制问题,我后来增加了一个节点datanode3。结果再进行非亲和表关联时都正常了,没有再报错(上面提到有两个报错),查出来的结果也完全正确。这什么情况,郁闷。后来再尝试把节点datanode3从集群中删掉,也没有重现分亲和表限制的问题。

 

 

3. 支持特性

  这里顺便提一下Postgres-XL支持的特性吧,方便记录一下在测试过程中测试到的项。

  • CTE(通用表表达式),支持,但是里面的sql也受到上面提到的限制问题
  • Windows function,支持,同上;
  • 集合操作,支持,同上;
  • 非分片列count(distinct),支持;
  • 支持跨分片更新;
  • 支持跨分片事务;

 

总结

   这次针对Postgres-XL去调研它目前存在的限制,主要还是在查询上限制比较大。在测试过程中,没有对所有的sql功能进行测试,也没有太深入去研究。

  如果在以上说明存在的限制(或者支持特性)有不符合pgxl实际情况的,可能是我个人的错误,欢迎大牛指出。

  希望Postgres-XL在以后的版本中,能把这些限制给解决掉,越做越完善。

 

转载于:https://www.cnblogs.com/plairst/p/9924873.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Postgres-XL是一个强大的分布式数据库集群,可以在大规模数据环境中提供高可用性和高性能。使用Postgres-XL集群,您可以将数据分布在多个节点上,并平衡负载以提高系统吞吐量。 手动配置Postgres-XL集群需要以下步骤: 1. 安装Postgres-XL:首先,您需要在每个节点上安装Postgres-XL软件。可以通过源代码编译或使用预编译的软件包进行安装。确保每个节点的Postgres-XL版本一致。 2. 配置Postgres-XL集群:在每个节点上,您需要编辑Postgres-XL的配置文件来设置集群的参数。配置文件通常位于“$PGXL_HOME/pgxc_ctl/pgxc_ctl.conf”。在配置文件中,您需要指定每个节点的主机名和端口号,以及其他相关参数,如共享存储的路径和主节点的IP地址。 3. 初始化集群:一旦配置文件正确设置,您可以使用pgxc_ctl工具来初始化集群。该工具位于“$PGXL_HOME/pgxc_ctl/pgxc_ctl”。在pgxc_ctl命令行中,您可以执行“init all”命令来初始化集群。此操作将创建必要的数据库对象和配置表,以管理集群。 4. 启动集群:一旦初始化完成,您可以使用pgxc_ctl工具来启动集群。在pgxc_ctl命令行中,您可以执行“start all”命令来启动集群。此操作将启动每个节点上的Postgres-XL进程,并将其连接到集群。 5. 验证集群:一旦集群启动,您可以使用任何标准的PostgreSQL客户端工具连接到集群,并执行SQL查询。您还可以使用pgxc_ctl工具来检查所有节点的状态,并确保它们正常运行。 6. 扩展集群:如果您需要扩展Postgres-XL集群以支持更多的节点和更大的数据库负载,您可以使用pgxc_ctl工具来添加新的节点和重新平衡数据。具体的扩展步骤取决于您的集群架构和需求。 总结而言,手动配置Postgres-XL集群需要安装软件、编辑配置文件、初始化集群、启动集群、验证集群以及可能的扩展集群。这些步骤可以确保您的Postgres-XL集群正确设置并可用于处理大规模数据工作负载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值