spqplugin_v2使用

前提条件

1.一个CN以及若干DN节点服务器运行正常,openGauss能够正常启动

2.所有节点网络互通

3.线程池关闭(目前暂不兼容)

部署

1.openGauss部署

1.1 CN节点

修改cn节点数据目录/postgresql.conf,添加如下参数

password_encryption_type = 1
enable_pbe_optimization = OFF
shared_preload_libraries = 'spq'
port = cn节点port

修改完上述配置后,需要重启openGauss进程,命令例如(若openGauss未启动则启动即可,命令为实例,其他启动方式也可以)

gs_ctl restart -D CN节点数据目录

1.2 DN节点

修改dn节点数据目录/postgresql.conf 添加如下参数

password_encryption_type = 1
shared_preload_libraries = 'spq'
port = dn节点port
listen_addresses = 'localhost,当前DN节点网卡IP'

修改dn节点数据目录/pg_hba.conf 添加如下行,接收来自cn节点的所有用户连接(此处代码逻辑控制)

# TYPE  DATABASE        USER            ADDRESS          METHOD
host    all             all             CN节点IP/32  trust

此处要注意,如果是使用单机多docker方式部署(DN和CN节点都在该机器上,但为不同docker容器),则DN节点的pg_hba.conf中CN节点IP要配置为ifconfig命令输出中,docker0的IP,例如下面示例中的172.17.0.1

$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:a6ff:fe5e:19cb  prefixlen 64  scopeid 0x20<link>
        ether 02:42:a6:5e:19:cb  txqueuelen 0  (Ethernet)
        RX packets 23556  bytes 1778105 (1.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23323  bytes 2091561 (1.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

修改完上述配置后,需要重启openGauss进程,命令例如(若openGauss未启动则启动即可,命令为示例,其他启动方式也可以)

gs_ctl restart -D 当前DN节点数据目录

查看每个DN节点的防火墙是否开启,若开启则需要对CN节点放通其openGauss的监听端口

# 查看firewalld是否开启,若输出包含Active: active (running)则说明firewalld正在运行,否则我们需要对CN节点IP放通openGauss监听端口。
systemctl status firewalld

# DN节点向CN节点IP放通端口
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=CN节点IP port port=当前DN节点openGauss端口 protocol=“tcp” accept'
firewall-cmd --reload

注意,对每个DN节点都要进行如上配置

2.spq配置

2.1 加载插件

连接CN节点和所有DN节点的openGauss执行如下sql,加载spq插件,注意所有节点的openGauss都需要执行。

create extension spq;

2.2 节点配置

连接CN节点,添加节点配置

-- 设置自身为CN节点
SELECT * from spq_set_coordinator_host('127.0.0.1', CN节点端口号);
-- 添加所有DN节点
SELECT * from spq_add_node('DN1 IP', DN1端口号);
SELECT * from spq_add_node('DN2 IP', DN2端口号);
...

--查询所有节点
SELECT * from pg_dist_node;
SELECT * FROM spq_get_active_worker_nodes();

2.3 分布式表使用示例

创本地表

CREATE TABLE IF NOT EXISTS public.pg_vector_collection (id BIGINT PRIMARY KEY, embedding vector(4));
ALTER TABLE public.pg_vector_collection ALTER COLUMN embedding SET STORAGE PLAIN;
ALTER TABLE public.pg_vector_collection SET (parallel_workers = 32);
-- 查询表的分片分布情况:
SELECT * from pg_dist_shard;

转分布式表

SELECT create_distributed_table('pg_vector_collection', 'id', shard_count:=4);
-- 查询表的分片分布情况:
SELECT * from pg_dist_shard;

插数据

INSERT INTO public.pg_vector_collection 
VALUES(1,'[1,2,3,4]'),(2,'[1,2,3,4]'),(3,'[1,2,3,4]'),(4,'[1,2,3,4]'),(5,'[1,2,3,4]'),(6,'[1,2,3,4]'),(7,'[1,2,3,4]');

建索引

CREATE INDEX IF NOT EXISTS  "opengauss_index"  ON public. pg_vector_collection USING  "hnsw"  (embedding  "vector_cosine_ops" ) WITH ( "m" = "16", "ef_construction" = "200" );

查询

SELECT * FROM public.pg_vector_collection ORDER BY embedding <=> '[1,2,3,4]' LIMIT 5;

删表

drop table pg_vector_collection;

函数与参数参考

分布式表相关

  • create_distributed_table(table_name, distribution_column, shard_count)

    描述:把local表转化为分布式表,注意除了指定的分布列,表的其它列不能有PRIMARY KEY、UNIQUE约束,对于分布式列而言,要求其比较collation是明确的,即相同的value必须有相同的hash值。

    参数说明:

    • table_name:转分布式表的表名
    • distribution_column:指定的分片列名
    • shard_count:分片数量,不指定时默认为spq.shard_count

    返回值类型:N/A

    示例:

    -- 创建local表
    openGauss=# create table t1(id int primary key, b varchar(10));
    -- 将local表转为分布式表
    openGauss=# select create_distributed_table('t1', 'id', shard_count:=4);
    
  • alter_distributed_table(table_name, distribution_column, shard_count)

    描述:修改分布式表的分布列、分片数量。

    参数说明:

    • table_name:分布式表的表名
    • distribution_column:指定的分片列名
    • shard_count:分片数量,不指定时默认为spq.shard_count

    返回值类型:N/A

    示例:

    -- 修改分片数量
    openGauss=# select alter_distributed_table('t1', shard_count:=8);
    
  • undistribute_table(table_name)

    描述:把分布式表转回local表

    参数说明:

    • table_name:分布式表的表名

    返回值类型:N/A

    示例:

    -- 修改分片数量
    openGauss=# select undistribute_table('t1');
    
  • rebalance_table_shards()

    描述:按照每个DN节点分片数量平衡的策略,对分布式表分片进行重新分布。

    参数说明:N/A

    返回值类型:N/A

    示例:

    -- 加入一个新的DN节点
    select spq_add_node('127.0.01', 5432);
    -- 重分布
    openGauss=# select rebalance_table_shards();
    
  • spq_rebalance_start()

    描述:作用同rebalance_table_shards,调用后立即返回,数据重分布任务将在后台异步进行。

    参数说明:N/A

    返回值类型:N/A

    示例:

    -- 加入一个新的DN节点
    select spq_add_node('127.0.01', 5432);
    -- 重分布
    openGauss=# select spq_rebalance_start();
    

节点管理相关

  • spq_set_coordinator_host(host text, port integer default current_setting('port')::int)

    描述:将某节点设置为CN节点,每个集群仅需要一个读写CN。

    参数说明:

    • host:当前CN的ip地址、域名或endpoint等
    • port:CN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_set_coordinator_host('127.0.01', 5432);
    
  • spq_add_node(nodename text, nodeport integer)

    描述:添加DN节点,该节点被立即激活,可以立刻被使用。

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_add_node('127.0.01', 5432);
    
  • spq_add_inactive_node(nodename text, nodeport integer)

    描述:添加DN节点,该节点不会被立即激活,即分布式表的分片不会落在这个节点上。

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_add_inactive_node('127.0.01', 5432);
    
  • spq_activate_node(nodename text, nodeport integer)

    描述:激活某个非活跃节点,在spq_add_inactive_node之后使用。

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_activate_node('127.0.01', 5432);
    
  • spq_disable_node(nodename text, nodeport integer)

    描述:与spq_activate_node相反的操作,将某个激活节点变为非激活节点。

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_disable_node('127.0.01', 5432);
    
  • spq_update_node(node_id int, new_node_name text, new_node_port integer)

    描述:更新某个节点的IP和端口。

    参数说明:

    • node_id:节点在pg_dist_node表中的node id
    • new_node_name:节点的新ip地址、域名或endpoint等
    • new_node_port:节点的新openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_update_node(1, '127.0.01', 5432);
    
  • spq_remove_node(nodename text, nodeport integer)

    描述:移除某个节点,要求当前节点不存在数据分片。

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:N/A

    示例:

    openGauss=# select spq_remove_node('127.0.01', 5432);
    
  • spq_is_coordinator()

    描述:查询当前节点是否是CN节点

    参数说明:N/A

    返回值类型:bool

    示例:

    openGauss=# select spq_is_coordinator();
     spq_is_coordinator
    --------------------
     t
    
  • spq_get_active_worker_nodes()

    描述:获取集群中活跃的DN节点信息

    参数说明:N/A

    返回值类型:record

    示例:

    openGauss=# select spq_get_active_worker_nodes();
     spq_get_active_worker_nodes
    -----------------------------
     (127.0.0.1,5432)
     (127.0.0.1,5532)
    
  • spq_check_connection_to_node(nodename text, nodeport integer)

    描述:检查节点的连通性

    参数说明:

    • nodename:当前DN的ip地址、域名或endpoint等
    • nodeport:DN节点的openGauss端口号

    返回值类型:bool

    示例:

    openGauss=# select spq_check_connection_to_node('127.0.0.1', 5432);
     spq_check_connection_to_node
    ------------------------------
     t
    

全文索引

  • enable_bm25_global_idf

    描述:控制分布表执行BM25索引查询时是否自动收集分布式全局统计信息,并使用全局逆文档频率(IDF)和平均文档长度(avgdl)计算文档得分。该参数在CN节点设置,仅对分布表的BM25查询生效。

    参数类型:USERSET

    取值范围:

    • on:自动收集分布式全局统计信息,并使用全局IDF和avgdl计算BM25得分。
    • off:使用各分片的本地统计信息计算BM25得分。

    默认值:off

    设置建议:默认情况下,分布表的BM25索引使用各分片的本地统计信息计算得分。当分片间数据分布不均衡时,本地统计信息可能导致查询结果召回率下降。对于存在明显数据倾斜的分布表,建议在CN节点开启该参数,使BM25查询使用全局文档数量等统计信息,提升查询召回率,使查询效果接近单机表。

    示例:

    openGauss=# set enable_bm25_global_idf = on;
    SET
    

系统表及视图说明

  • pg_dist_node

    描述:系统表,存储集群中所有节点的信息

    列名

    类型

    描述

    nodeid

    integer

    节点唯一标识

    groupid

    integer

    唯一标识一组节点

    nodename

    text

    节点IP或域名
    nodeport

    integer

    节点端口
    noderack

    text

    当前版本不使用
    hasmetadata

    boolean

    是否有元数据,CN节点为true,DN节点为false
    isactive

    boolean

    该节点是否被使用
    nodecluster

    name

    该节点所属spq cluster的名字
    metadatasynced

    boolean

    元数据是否同步。CN节点为true,DN节点为fasle
    shouldhaveshards

    boolean

    是否可以存储分片数据。CN节点为false,DN节点为true

    示例:

    openGauss=# select * from pg_dist_node;
    nodeid | groupid | nodename  | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards 
    --------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------
         1 |       0 | 127.0.0.1 |    15432 | default  | t           | t        | primary  | default     | t              | f
         2 |       1 | 127.0.0.1 |    15532 | default  | f           | t        | primary  | default     | f              | t
         3 |       2 | 127.0.0.1 |    15632 | default  | f           | t        | primary  | default     | f              | t
    (3 rows)
    
  • pg_dist_partition

    描述:系统表,存储分布式表的定义

    列名

    类型

    描述

    logicalrelid

    regclass

    分布式表表名

    partmethod

    char

    当前版本唯一值为'h',代表hash分区

    partkey

    text

    分区列的信息
    colocationid

    integer

    当前版本不使用
    repmodel

    char

    当前版本不使用
    autoconverted

    boolean

    当前版本不使用

    示例:

    openGauss=# select * from pg_dist_partition;
    logicalrelid | partmethod |                                                        partkey                                                         | colocationid | repmodel | autoconverted 
    --------------+------------+------------------------------------------------------------------------------------------------------------------------+--------------+----------+---------------
    t1           | h          | {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 1 :location -1} |            1 | s        | f
    (1 row)
    
  • pg_dist_shard

    描述:系统表,存储分布式表每个分片的信息

    列名

    类型

    描述

    logicalrelid

    regclass

    分布式表表名

    shardid

    bigint

    分片编号

    shardstorage

    char

    存储类型,当前仅支持't',即普通表
    shardminvalue

    text

    当前shard的hash分区的最小hash值
    shardmaxvalue

    text

    当前shard的hash分区的最大hash值

    示例:

    openGauss=# select * from pg_dist_shard;
     logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue 
    --------------+---------+--------------+---------------+---------------
     t1           |   62025 | t            | -2147483648   | -1073741825
     t1           |   62026 | t            | -1073741824   | -1
     t1           |   62027 | t            | 0             | 1073741823
     t1           |   62028 | t            | 1073741824    | 2147483647
    (4 rows)
    
  • pg_dist_placement

    描述:系统表,存储分布式表每个分片的位置信息

    列名

    类型

    描述

    placementid

    bigint

    自增唯一标识

    shardid

    bigint

    分片编号

    shardstate

    int

    分片状态
    shardlength

    bigint

    对于hash分区,恒为0
    groupid

    integer

    唯一标识一组节点

    示例:

    openGauss=# select * from pg_dist_placement;
     placementid | shardid | shardstate | shardlength | groupid 
    -------------+---------+------------+-------------+---------
               1 |   62025 |          1 |           0 |       1
               2 |   62026 |          1 |           0 |       2
               3 |   62027 |          1 |           0 |       1
               4 |   62028 |          1 |           0 |       2
    (4 rows)
    
    
  • spq_shards

    描述:视图,查看所有的分片信息

    列名

    类型

    描述

    table_name

    regclass

    表名
    shardid

    bigint

    分片编号

    shard_name

    text

    分片名

    table_type

    text

    表类型
    nodename

    text

    节点IP或域名
    nodeport

    integer

    节点端口
    shard_size

    bigint

    分片大小

    示例:

    openGauss=# select * from spq_shards;
     table_name | shardid | shard_name | table_type  | nodename  | nodeport | shard_size 
    ------------+---------+------------+-------------+-----------+----------+------------
     t1         |   62025 | t1_62025   | distributed | 127.0.0.1 |    15532 |       8192
     t1         |   62026 | t1_62026   | distributed | 127.0.0.1 |    15632 |       8192
     t1         |   62027 | t1_62027   | distributed | 127.0.0.1 |    15532 |          0
     t1         |   62028 | t1_62028   | distributed | 127.0.0.1 |    15632 |       8192
    (4 rows)
    
  • spq_tables

    描述:视图,查看所有分布式表信息

    列名

    类型

    描述

    table_name

    regclass

    表名
    table_type

    text

    表类型

    distribution_column

    text

    分片列

    table_size

    text

    表大小
    shard_count

    bigint

    分片数量
    table_owner

    name

    属主
    access_method

    name

    当前版本不使用

    示例:

    openGauss=# select * from spq_tables;
     table_name | table_type  | distribution_column | table_size | shard_count | table_owner | access_method 
    ------------+-------------+---------------------+------------+-------------+-------------+---------------
     t1         | distributed | a                   | 24 kB      |           4 | openGauss   | 
    (1 row)