gogudb 使用手册 1.1 版
October 30, 2018 · View on GitHub
这是1.1版本的用户手册,主要内容包括:安装部署、使用接口以及使用案例三部分。
安装部署
安装前提
在安装gogudb之前,需要安装PG,安装PG的方式不限,但是需要的PG大版本是9.6或是10。目前gogudb支持的OS版本是centOS 7以上,并且该系统上安装了make这个工具(centos上默认自带了这个工具)。 在安装PG之后,需要设置环境变量,将pg的bin目录加入到path中来,使得shell能直接使用pg_config命令
安装二进制包
- 获取最新的二进制包,根据当前的OS、PG版本获取。
- 使用tar命令将其解压缩
- 解压之后,进入二进制包的所在目录,使用相应的权限执行make install命令,改命令会将so文件、sql文件、control复制到对应目录。注意:如果PG的版本和gogudb要求的PG版本不匹配,会报错,从而安装失败
- 详细源码安装请参照https://github.com/hangzhou-cstech/gogudb/blob/master/gogudb_source_install.md
配置gogudb
编辑PG的配置文件
vi /path_to/postgresql.conf 在配置文件中增加一行:
shared_preload_libraries='gogudb'
在修改了配置文件之后,需要重启该数据库的实例。
创建gogudb
在gogudb的数据库启动之后,运行 create externsion gogudb,即可完成gogudb的创建
使用接口
gogudb向用户提供了两大功能:一,创建远程数据源;二,配置分表规则;三,配置远程数据源的hash值区间。用户需要首先借助gogudb提供的gogudb_fdw来创建远程数据源,创建之后,用户在建表之前根据分表规则,需要向配置表里设置表的分表规则。当用户创建表的时候,gogudb会根据分表规则创建若干分片,并均分到各个远程数据源上。当创建基于HASH的分区表之前,用户需要配置远程数据源的hash值区间,创建之后,调用相应函数生效,然后就可以创建HASH方式的分区表了,否则会报错。
创建远程数据源
- 使用create server语句创建数据源,例如:
CREATE SERVER server_remote1 FOREIGN DATA WRAPPER gogudb_fdw OPTIONS(host '192.168.2.2',port '5432',dbname 'postgres');
创建了一个名为server_remote1的数据源,远程数据源的IP是192.168.2.2,端口是5432,数据库名是postgres
- 使用create user mapping语句来配置数据源的访问用户信息,例如:
create user mapping for current_user server server_remote1 options(user 'pgsql',password '');
设置当前用户访问server_remote1时,使用的登录用户是pgsql,密码为空。
配置表的分表规则
gogudb中有一张表 table_partition_rule定义了用户分表的规则,在创建分区表之前,用户需要在表中插入数据。在创建表的时候,gogudb会根据改变预先定义的规则,来创建分区表。该表主要包括下列字段:
- schema_name 类型TEXT NOT NULL,指定即将创建的父表所在的schema
- table_name 类型TEXT NOT NULL,指定即将创建的父表的名称,
- part_expr 类型TEXTTEXT NOT NULL,指定分表时使用的表达式(最简单的就是列名)
- part_type 类型INTEGER NOT NULL,分区类型,只能选择1或是2,1表示hash分区,2表示range分区
- range_interval 类型TEXT DEFAULT NULL, range分区时使用的间隔。
- range_start 类型TEXT DEFAULT NULL,range分区时使用起始值。
- part_dist 类型INTEGER,子表的总数量,最终创建远程子表时,子表会逐一分布到每个远程数据源上数量,尽量保证每个数据源上的子表数据量均匀一致。
- remote_schema 类型 TEXT DEFAULT NULL,子表在远程数据源上的schema,默认为public
- servers 类型TEXT[] DEFAULT NULL,子表分布的远程数据源名称列表,默认是系统内所有使用gogudb_fdw的远程的数据源列表。
配置远程数据源的HASH值区间
gogudb中有一张表 server_map定义了做hash值的范围和远程数据源的关系,这张表主要有下面三个字段:
- server_name, TEXT NOT NULL类型,子表分布的远程数据源名称列表,默认是系统内所有使用gogudb_fdw的远程的数据源列表。
- range_start,smallint NOT NULL类型,hash值范围的起始值(包括该值),最小为0;
- range_end,smallint NOT NULL类型,hash值范围的结束值(不包括该值),不小于range_start,不大于128; 用户向 pg_catalog.server_map插入数据源以及范围之后,需要执行
select reload_range_server_set()
来重新加载server_map表的数据,使之生效。
使用案例
准备测试环境的数据库实例
环境如下:
| 主机名 | IP | 数据库端口 | 数据库数据目录 |
|---|---|---|---|
| gogu01 | 192.168.3.46 | 5432 | /home/postgres/pgdaa |
| pg01 | 192.168.3.41 | 5432 | /home/postgres/pgdata |
| pg02 | 192.168.3.42 | 5432 | /home/postgres/pgdata |
其中gogu01作为googudb的运行实例,pg01和pg02作为gogudb的远程数据源
配置gogudb
编辑gogu01机器上(即gogudb)数据库的配置文件: vi /data/pgdata/postgresql.conf 在配置文件中增加一行:
shared_preload_libraries='gogudb'
安装gogudb
使用前面描述的方法,获得gogudb的二进制包之后使用make install安装
启动数据库:
启动gogudb数据库:
pg_ctl start -D /data/pgdata
创建extension
需要在gogudb的数据库中创建gogudb的extension
- 连接gogudb数据库: psql -d postgres
- 在连接会话中创建gogudb:
create extension gogudb;
创建远程数据源
创建两个数据源,分别指向拍pg01和pg02:
- 连接gogudb数据库: psql -d postgres
- 创建名为server_remote1的数据源:CREATE SERVER server_remote1 FOREIGN DATA WRAPPER gogudb_fdw OPTIONS(host '192.168.3.41',port '5432',dbname 'postgres');
- 创建名为server_remote2的数据源:CREATE SERVER server_remote2 FOREIGN DATA WRAPPER gogudb_fdw OPTIONS(host '192.168.3.42',port '5432',dbname 'postgres');
- 为server_remote1设置用户名密码:create user mapping for current_user server server_remote1 options(user 'pgsql',password '');
- 为server_remote2设置用户名密码:create user mapping for current_user server server_remote1 options(user 'pgsql',password '');
配置远程数据源的hash值分区
执行下列操作:
insert into _gogu.server_map values('server_remote1', 0, 64), ('server_remote2', 64, 128);
select _gogu.reload_range_server_set();
这就配置并生效了两台远程数据源server_remote1和server_remote2,server_remote1接受的hash值范围是[0,64), server_remote2接受的范围是[64,128)。
使用hash方式创建分区表
主要是先在table_partition_rule中插入表的分区规则,然后使用普通SQL来创建表。
- 连接gogudb数据库: psql -d postgres
- 插入分区规则:
insert into _gogu.table_partition_rule(schema_name, table_name, part_expr, part_type, part_dist, remote_schema) values('public', 'part_hash_test', 'id', 1,4,'public');
插入的记录指定了:将会在public的schema下创建一张表,表的分布字段是id,采用hash分区,总共4个分片,分片将分布到所有的gogudb_fdw的远程的数据源列表上,所在的schema为public
- 创建分区表:
postgres=# CREATE TABLE part_hash_test(id INT NOT NULL, payload REAL);
CREATE TABLE
*可以查看生成的分区表:
postgres=# \d+ part_hash_test
Table "public.part_hash_test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
---------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | not null | | plain | |
payload | real | | | | plain | |
Child tables: gogudb_partition_table._public_0_part_hash_test,
gogudb_partition_table._public_1_part_hash_test,
gogudb_partition_table._public_2_part_hash_test,
gogudb_partition_table._public_3_part_hash_test
postgres=# \dES gogudb_partition_table.*
List of relations
Schema | Name | Type | Owner
------------------------+------------------------+---------------+-------
gogudb_partition_table | _public_0_part_hash_test | foreign table | pgsql
gogudb_partition_table | _public_1_part_hash_test | foreign table | pgsql
gogudb_partition_table | _public_2_part_hash_test | foreign table | pgsql
gogudb_partition_table | _public_3_part_hash_test | foreign table | pgsql
*删除表:
postgres=# drop table part_hash_test cascade;
NOTICE: drop cascades to 4 other objects
DETAIL: drop cascades to foreign table gogudb_partition_table._public_0_part_hash_test
drop cascades to foreign table gogudb_partition_table._public_1_part_hash_test
drop cascades to foreign table gogudb_partition_table._public_2_part_hash_test
drop cascades to foreign table gogudb_partition_table._public_3_part_hash_test
DROP TABLE
使用range方式创建基于时间类型分区表
主要的步骤也是先向配置表中插入数据,然后使用普通的SQL来建表。
- 向分区配置表插入数据:
insert into _gogu.table_partition_rule(schema_name ,table_name ,part_expr ,part_type ,range_interval ,range_start ,part_dist, remote_schema) values('public', 'part_range_test', 'crt_time', 2, '2 month','2018-1-1 00:00:0', 6, 'public');
这个指定即将创建表的schema是pulic,表名是part_range_test,分表会使用的表达式是'crt_time,实际将会是一个timestamp类型的字段,分区的类型是range方式,分区间隔是'2 month',起始值是'2018-1-1 00:00:0',会创建6个分片,分片位于所有数据源上,schema为public。 *创建表:
postgres=# create table part_range_test(id int, info text, crt_time timestamp not null);
CREATE TABLE
*可以查看这个表由6个子表组成,实际是外部表,均分到2个外部数据源上:
postgres=# \d+ part_range_test
Table "public.part_range_test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
id | integer | | | | plain | |
info | text | | | | extended | |
crt_time | timestamp without time zone | | not null | | plain | |
Child tables: gogudb_partition_table._public_1_part_range_test,
gogudb_partition_table._public_2_part_range_test,
gogudb_partition_table._public_3_part_range_test,
gogudb_partition_table._public_4_part_range_test,
gogudb_partition_table._public_5_part_range_test,
gogudb_partition_table._public_6_part_range_test
postgres=# \dES gogudb_partition_table.*
List of relations
Schema | Name | Type | Owner
------------------------+-------------------------+---------------+-------
gogudb_partition_table | _public_1_part_range_test | foreign table | pgsql
gogudb_partition_table | _public_2_part_range_test | foreign table | pgsql
gogudb_partition_table | _public_3_part_range_test | foreign table | pgsql
gogudb_partition_table | _public_4_part_range_test | foreign table | pgsql
gogudb_partition_table | _public_5_part_range_test | foreign table | pgsql
gogudb_partition_table | _public_6_part_range_test | foreign table | pgsql
(6 rows)
*使用普通SQL来删除表:
postgres=# drop table part_range_test cascade;
NOTICE: drop cascades to 7 other objects
DETAIL: drop cascades to sequence part_range_test_seq
drop cascades to foreign table gogudb_partition_table._public_1_part_range_test
drop cascades to foreign table gogudb_partition_table._public_2_part_range_test
drop cascades to foreign table gogudb_partition_table._public_3_part_range_test
drop cascades to foreign table gogudb_partition_table._public_4_part_range_test
drop cascades to foreign table gogudb_partition_table._public_5_part_range_test
drop cascades to foreign table gogudb_partition_table._public_6_part_range_test
DROP TABLE
使用range方式创建基于数值类型分区表
- 向分区配置表插入数据:
insert into _gogu.table_partition_rule(schema_name, table_name, part_expr, part_type, part_dist, remote_schema, range_interval,range_start) values('public','part_range_num_test', 'id', 2, 4, 'public', '100', '0');
指定即将创建表的schema是pulic,表名是part_range_num_test,分表会使用的表达式是id,实际将会是一个int类型的字段,分区的类型是range方式,分区间隔是'100',起始值是'0',会创建4个分片,分片位于所有数据源上,schema为public。
- 创建表:
postgres=# CREATE TABLE part_range_num_test ( id integer NOT NULL, k integer DEFAULT 0 NOT NULL);、;
CREATE TABLE
- 可以查看这个表由4个子表组成:
postgres=# \d+ part_range_num_test
Table "public.part_range_num_test"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
id | integer | | not null | | plain | |
k | integer | | not null | 0 | plain | |
Child tables: gogudb_partition_table._public_1_part_range_num_test,
gogudb_partition_table._public_2_part_range_num_test,
gogudb_partition_table._public_3_part_range_num_test,
gogudb_partition_table._public_4_part_range_num_test
- 删除表
postgres=# drop table part_range_num_test cascade;
NOTICE: drop cascades to 5 other objects
DETAIL: drop cascades to sequence part_range_num_test_seq
drop cascades to foreign table gogudb_partition_table._public_1_part_range_num_test
drop cascades to foreign table gogudb_partition_table._public_2_part_range_num_test
drop cascades to foreign table gogudb_partition_table._public_3_part_range_num_test
drop cascades to foreign table gogudb_partition_table._public_4_part_range_num_test
drop table part_hash_test cascade;
注意事项
目前可以在父表执行的操作有:create index,drop index,vacuum,reindex, cluster,truncate only等,不能执行的操作有:rename 父表,rename 子表,rename子表使用的远程表,不能rename partition_table_rule中使用的schema,不能修改子表、或是远程表中表名,不能drop 子表或是远程表。此外,也不支持分区的合并与分裂、以及读写分离。