4.5.?uxmpp函数

4.5.1. 创建分布式表函数
4.5.2. 修改表相关函数
4.5.3. 节点管理函数
4.5.4. 资源查询函数
4.5.5. 故障修复函数

4.5.1.?创建分布式表函数

create_distributed_table

create_distributed_table()函数用于定义分布式表,如果分布方法是哈希,则直接创建分片。此函数参数有表名、分布列和分布方法。其中分布方法为可选参数,默认是哈希分布,哈希分布会根据分片数和复制因子创建分片。如果有数据,并将数据自动分发到worker节点。

注意

此函数可替换master_create_distributed_tablemaster_create_worker_shards的用法。

  • 参数

    SELECT create_distributed_table('table_name','distributed_column','distributed_method',colocate_with=>'options');
    table_name:需要分发的表的名称。
    distributed_column:需要分发的列。
    distributed_method:(可选)分发方法。允许的值是append或hash,默认是hash。
    colocate_with:(可选)指定协同表。

  • 返回值

    N/A

  • 示例

    假设给表github_event通过repo_id列进行分发。

    SELECT create_distributed_table('github_events','repo_id');

create_reference_table

create_reference_table()函数用于定义小型参考表或维度表。此函数的参数为表名,创建仅包含一个分片的分布式表,并复制到每个worker节点。

  • 参数

    SELECT  create_reference_table('table_name');
    table_name:需要分发的表的表名。

  • 返回值

    N/A

  • 示例

    假设将表test定义为参考表。

    SELECT  create_reference_table('test');

master_create_distributed_table

master_create_distributed_table()函数用于定义分布式表。此函数的参数为表名、分发列和分发方法。和master_create_worker_shards()一起使用。

注意

不推荐使用此函数,建议使用create_distributed_table

  • 参数

    SELECT master_create_distributed_table('table_name','distributed_column','distributed_method');
    table_name:需要分发的表的名称。
    distribution_column:要分发表的列。
    distribution_method:要分发表的方法。允许的值是append或hash。

  • 返回值

    N/A

  • 示例

    假设给表github_event通过repo_id列进行分发。

    SELECT master_create_distributed_table('github_events','repo_id','hash');

master_create_worker_shards

master_create_worker_shards()函数为hash分布指定分片总数和副本数。

注意

不推荐使用此函数,建议使用create_distributed_table

  • 参数

    SELECT master_create_worker_shards('table_name',shard_count,replocation_factor);
    table_name:要创建分片的hash表的表名。
    shard_count:要创建的分片总数。
    replocation_factor:每个分片数的副本数。

  • 返回值

    N/A

  • 示例

    假设给表github_event创建16个分片,每个分片有2个副本。

    SELECT master_create_worker_shards('github_events',16,2);

master_create_empty_shard

master_create_empty_shard()函数可用于为append分发的表追加空的分片,使用该函数前,首先用master_create_distributed_table函数将表按append方法分发,然后使用该函数进行空的分片追加。

  • 参数

    SELECT * FROM master_create_empty_shard('table_name');
    table_name:要为其创建分片追加的append分布式表的表名。

  • 返回值

    shard_id:返回新追加的分片的唯一ID。

  • 示例

    假设给表append分布方式的分布表empty追加一个空分片。

    SELECT * FROM master_create_empty_shard('empty');
    master_create_empty_shard 
    ---------------------------
                        103846
    (1 行记录)

4.5.2.?修改表相关函数

upgrade_to_reference_table

upgrade_to_reference_table()函数将分片总数为1的分布式表升级为参考表。

  • 参数

    SELECT  upgrade_to_reference_table ('table_name');
    table_name:分布式表的表名(分片总数为1)。

  • 返回值

    N/A

  • 示例

    假设表test1为分片总数等于1的分布式表,将其升级为参考表。

    SELECT  upgrade_to_reference_table ('test1');

master_append_table_to_shard

master_append_table_to_shard()函数可用于将UXDB的表中的数据拷贝到指定的append分布式表的某一个分片中。使用该函数需要先创建append分发方式的分布式表,然后对该表追加空分片(或者使用已有的分片,即必须有分片存在),最后使用该函数将某个表(表结构相近)中的数据拷贝到指定的分片中。

  • 参数

    SELECT * FROM master_append_table_to_shard(shard_id,'source_table_name','source_node_name',source_node_port);
    shard_id:需要拷贝数据的目的分片表的分片ID。
    source_table_name:需要拷贝数据的源表名称。
    source_node_name:源表所在节点。
    source_node_port:源表所在节点的端口。

  • 返回值

    shard_fill_ratio:该函数返回分片的填充率,该分片定义为当前分片大小与配置参数shard_max_size的比率。

  • 示例

    假设表em是一个本地表,且表结构和empty类似,将表em中的数据拷贝到empty_103846的分片表中。

    SELECT * FROM master_append_table_to_shard(103846,'em','192.168.1.82',5432);
    master_append_table_to_shard 
    ------------------------------
                      0.000450134
    (1 行记录)

master_apply_delete_command

master_apply_delete_command()函数用于删除与delete命令指定的条件匹配的分片。仅当分片中的所有行都与删除条件匹配时,此函数才会删除分片。由于该函数使用分片元数据来决定是否需要删除分片,因此它要求DELETE语句中的WHERE子句位于分发列上。如果未指定条件,则删除该表的所有分片。

注意

该函数适用于append分片方式的分布式表。

  • 参数

    SELECT * FROM master_apply_delete_command('delete_command');
    delete_command:有效的SQL DELETE命令。

  • 返回值

    deleted_shard_count:该函数返回与条件匹配并被删除的分片数。请注意,这是分片的数量,而不是删除的行数。

  • 示例

    表empty是以id为分布列的append分布式表,有3个分片,每个分片上各有一行数据。删除其中两个分片。

    SELECT * from  master_apply_delete_command('DELETE FROM empty WHERE id < 3'); 
    master_apply_delete_command 
    -----------------------------
                             2
    (1 行记录)

master_modify_multiple_shards

master_modify_multiple_shards()函数用于运行可能跨越多个分片的数据修改语句。限制:不能再事物块中调用;仅支持简单的运算符表达式

  • 参数

    SELECT * FROM master_modify_multiple_shards('modify_query');
    modify_query:简单的DELETE或UPDATE的sql。

  • 返回值

    update_shard_count:修改或删除的行数。

  • 示例

    假设表empty为分布式表,id为分布列,更新neme列的值。

    SELECT master_modify_multiple_shards('update empty set name = ''uxsino''');
     master_modify_multiple_shards 
    -------------------------------
                                 3
    (1 行记录)

4.5.3.?节点管理函数

master_add_node

master_add_node()函数作用是添加新的节点。

  • 参数

    SELECT * FROM master_add_node('node_name',node_port,group_id,'node_role','node_cluster');
    node_name:要添加的新节点的IP地址。
    node_port:要添加的新节点的端口。
    group_id:(可省略)服务器组,仅与流复制相关。默认值为0。
    node_role:(可省略)primary或secondary。默认primary。
    node_cluster:(可省略)集群名称。默认default。

  • 返回值

    ux_dist_node中的一行。

  • 示例

    添加新节点192.168.1.84:5432。

    select * from master_add_node('192.168.1.84',5432);
     nodeid | groupid |   nodename   | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster 
    --------+---------+--------------+----------+----------+-------------+----------+----------+-------------
          3 |       3 | 192.168.1.84 |     5432 | default  | f           | t        | primary  | default
    (1 行记录)

master_update_node

master_update_node()函数更改uxmpp元数据表ux_dist_node中注册的节点的主机名和端口。

  • 参数

    SELECT * FROM master_update_node('node_name',node_port,group_id,'node_role','node_cluster');
    node_id:需要更新的节点的ID,来自ux_dist_node表的nodeid。
    node_name:更新的新节点的IP。
    node_port:更新的新节点的端口。

  • 返回值

    N/A

  • 示例

    将192.168.1.84:5432节点更新为192.168.1.83:5432。

    SELECT * FROM master_update_node(3,'192.168.1.83',5432);
     master_update_node 
    --------------------
     
    (1 行记录)

master_add_inactive_node

该master_add_inactive_node函数与master_add_node类似,添加一个新节点。但是,它将新节点标记为非活动状态,即不会在其中放置任何分片。可查看表ux_dist_node的isactive值。

  • 参数

    SELECT * FROM master_add_inactive_node('node_name',node_port);
    node_name:要添加的新节点的IP地址。
    node_port:要添加的新节点的端口。
    group_id:(可省略)服务器组,仅与流复制相关。默认值为0。
    node_role:(可省略)primary或secondary。默认primary。
    node_cluster:(可省略)集群名称。默认default。

  • 返回值

    ux_dist_node中的一行。

  • 示例

    添加一个非活动状态的节点。

    SELECT * FROM master_add_inactive_node('192.168.1.84',5432);
     nodeid | groupid |   nodename   | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster 
    --------+---------+--------------+----------+----------+-------------+----------+----------+-------------
          4 |       4 | 192.168.1.84 |     5432 | default  | f           | f        | primary  | default
    (1 行记录)

master_activate_node

master_activate_node()函数将uxmpp中非活动状态的节点激活。可在master_add_inactive_node函数之后用。

  • 参数

    SELECT * FROM master_activate_node('node_name',node_port);
    node_name:要激活的节点的IP地址。
    node_port:要激活的节点的端口。

  • 返回值

    ux_dist_node中的一行。

  • 示例

    激活一个非活动状态的节点。查看isactive值。

    SELECT * FROM master_activate_node('192.168.1.84',5432);
     nodeid | groupid |   nodename   | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster 
    --------+---------+--------------+----------+----------+-------------+----------+----------+-------------
          4 |       4 | 192.168.1.84 |     5432 | default  | f           | t        | primary  | default
    (1 行记录)

master_disable_node

master_disable_node()函数与master_activate_node()函数相反。该函数将活动状态的节点标记为非活动状态,即反激活。

  • 参数

    SELECT * FROM master_disable_node('node_name',node_port);
    node_name:要反激活的节点的IP地址。
    node_port:要反激活的节点的端口。

  • 返回值

    N/A

  • 示例

    反激活一个活动状态的节点。

    SELECT * FROM master_disable_node('192.168.1.84',5432);
     master_disable_node 
    ---------------------
     
    (1 行记录)

master_add_secondary_node

master_add_secondary_node()函数是给一个现有的主节点新添加一个辅助节点。

  • 参数

    SELECT * FROM master_add_secondary_node('node_name',node_port,'primary_name',primary_port,'node_cluster');
    node_name:要添加的辅助新节点的IP地址。
    node_port:要添加的辅助新节点的端口。
    primary_name:主节点的IP地址。
    primary_port:主节点的端口。
    node_cluster:群集名称。默认default。

  • 返回值

    ux_dist_node中的一行。

  • 示例

    给主节点192.168.1.83:5432添加一个辅助节点。可查看noderole的值。

    SELECT * FROM master_add_secondary_node('192.168.1.85',5432,'192.168.1.83',5432);
     nodeid | groupid |   nodename   | nodeport | noderack | hasmetadata | isactive | noderole  | nodecluster 
    --------+---------+--------------+----------+----------+-------------+----------+-----------+-------------
          5 |       3 | 192.168.1.85 |     5432 | default  | f           | t        | secondary | default
    (1 行记录)

master_remove_node

master_remove_node()函数是删除指定的节点。如果删除的节点上存在分片,则此函数会报错。因此,在使用此函数前,需要将分片移出节点。

  • 参数

    SELECT * FROM master_remove_node('node_name',node_port);
    node_name:要删除的节点的IP地址。
    node_port:要删除的节点的端口。

  • 返回值

    N/A

  • 示例

    删除一个没有分片的节点。

    SELECT * FROM master_remove_node('192.168.1.85',5432);
    master_remove_node 
    --------------------
     
    (1 行记录)

4.5.4.?资源查询函数

master_get_active_worker_nodes

master_get_active_worker_nodes()函数时查看活动状态的节点。

  • 参数

    N/A

  • 返回值

    处于活动状态的节点列表。

    node_name:活动状态的节点IP。

    node_port:活动状态的节点端口。

  • 示例

    SELECT * FROM master_get_active_worker_nodes();
      node_name   | node_port 
    --------------+-----------
     192.168.1.83 |      5432
    (1 行记录)

master_get_table_metadata

master_get_table_metadata()可用于查看分布式表的相关分布元数据。包括标的oid,存储类型,分发发放,分发列,复制因子。最大分片大小和分片分发策略。

  • 参数

    SELECT * FROM master_get_table_metadata('table_name');
    table_name:要获取分布元数据的分布式表名。

  • 返回值

    元数据列表。

    logical_relid:分布式表的oid。此值引用ux_class系统目录表中的relfilenode列。

    part_storage_type:表的存储类型。可以是't'(标准表),'f'(外部表)或'c'(列存表)。

    part_method:表的分发类型。可以是'a'(append)或'h'(hash)。

    part_key:表的分发列。

    part_replica_count:当前分片复制因子。

    part_max_size:当前最大分片大小(以字节为单位)。

    part_placement_policy:分片分发策略。可以是1(本地节点优先)或2(循环)。

  • 示例

    SELECT * FROM master_get_table_metadata('empty');
     logical_relid | part_storage_type | part_method | part_key | part_replica_count | part_max_size | part_placement_policy 
    ---------------+-------------------+-------------+----------+--------------------+---------------+-----------------------
             57770 | t                 | a           | id       |                  1 |    1073741824 |                     2
    (1 行记录)

get_shard_id_for_distribution_column

get_shard_id_for_distribution_column()函数根据分发列的值确定给行所在的分片表。该函数在hash分布方式的分布式表上使用。不适用append分布方式。

  • 参数

    SELECT * FROM get_shard_id_for_distribution_column('table_name',distribution_value);
    table_name:分布式表名。
    distribution_value:分发列的值。

  • 返回值

    shardID:指定分发列的行所在表的分片ID。

  • 示例

    查看hash分布式表github_events中分布列值为5的行所在的分片表。

    SELECT  get_shard_id_for_distribution_column('github_events',5);
     get_shard_id_for_distribution_column 
    --------------------------------------
                                   102742
    (1 行记录)

column_to_column_name

column_to_column_name()函数查看分布式表的分布列。

  • 参数

    SELECT  column_to_column_name(logicalrelid,partkey )AS  dist_col_name FROM  ux_dist_partition WHERE  logicalrelid = 'tablename' :: regclass ;
    table_name:分布式表名。

  • 返回值

    distribution_column:指定分布式表的分发列。

  • 示例

    查看分布式表github_events的分发列。

    SELECT  column_to_column_name(logicalrelid,partkey )AS  dist_col_name FROM  ux_dist_partition WHERE  logicalrelid = 'github_events' :: regclass ;
     dist_col_name 
    ---------------
     repo_id
    (1 行记录)

ux_relation_size

ux_relation_size()函数获取指定分布式表所有分片使用的磁盘空间。不包括空闲空间(FSM)和和映射空间(VM)。仅当uxmpp.shard_replication_factor=1时生效。

  • 参数

    SELECT  ux_size_pretty(uxmpp_relation_size('table_name'));
    table_name:分布式表名。

  • 返回值

    table_size:指定分布式表的大小。

  • 示例

    查看分布式表github_events所有分片的大小。

    SELECT  ux_size_pretty(uxmpp_relation_size('github_events'));
     ux_size_pretty 
    ----------------
     16 kB
    (1 行记录)

ux_table_size

ux_table_size ()函数获取指定分布式表所有分片使用的磁盘空间,不包括索引,但是包括TOSTA、空闲空间(FSM)和和映射空间(VM)。仅当uxmpp.shard_replication_factor=1时生效。

  • 参数

    SELECT  ux_size_pretty(uxmpp_table_size('table_name'));
    table_name:分布式表名。

  • 返回值

    table_size:指定分布式表的大小。

  • 示例

    查看分布式表github_events所有分片的大小。

    SELECT  ux_size_pretty(uxmpp_table_size('github_events'));
     ux_size_pretty 
    ----------------
     272 kB
    (1 行记录)

ux_total_relation_size

ux_total_relation_size()函数获取指定分布式表所有分片使用的磁盘空间,包括索引和TOAST数据。仅当uxmpp.shard_replication_factor=1时生效。

  • 参数

    SELECT  ux_size_pretty(uxmpp_total_relation_size('table_name'));
    table_name:分布式表名。

  • 返回值

    table_size:指定分布式表的大小。

  • 示例

    查看分布式表github_events所有分片的大小。

    SELECT  ux_size_pretty(uxmpp_total_relation_size('github_events'));
     ux_size_pretty 
    ----------------
     272 kB
    (1 行记录)

4.5.5.?故障修复函数

master_copy_shard_placement

master_copy_shard_placement()用于修复故障分片。在操作期间导致某个分片变成非活动状态,然后通过该函数将活动的副本分片中的数据拷贝到故障的非活动分片,并使其变成活动状态,以确保新插入的数据分片正常。

  • 参数

    SELECT master_copy_shard_placement(shard_id,'source_node_name',source_node_port,'target_node_name',target_node_port);
    shard_id:要修复的分片的ID。
    source_node_name:正常的分片所在节点IP(“源”节点)。
    source_node_port:正常的分片所在节点IP端口。
    target_node_name:故障的分片所在节点IP(“目标”节点)。
    target_node_port:故障的分片所在节点端口。

  • 返回值

    N/A

  • 示例

    --创建测试表,并设置分片和副本
    CREATE TABLE test_table(id int, name varchar(16));
    SELECT master_create_distributed_table('test_table', 'id', 'hash');
    SELECT master_create_worker_shards('test_table', 2, 2);
    --插入数据
    INSERT INTO test_table VALUES(1,'a'),(2,'b'),(3,'c'),(4,'d');
    --断开其中一个节点(断网或停止集群)之后,进行写操作
    INSERT INTO test_table VALUES(4,'99');
    --查看分片分布情况数据shardstate字段值为3表示故障,1表示正常
    SELECT * from ux_dist_shard_placement;
    --恢复上面断开的节点,修复故障
    SELECT master_copy_shard_placement(102048, '192.168.1.84', 5432, '192.168.1.83', 5432);

    注意

    修复故障的时候涉及到worker于worker之间数据传输,因此需要将.uxpass文件添加到worker节点的uxdb用户主目录下(可以直接将master上.uxpass复制到各个worker节点)。

XML 地图 | Sitemap 地图