关于扩分区
扩分区意味着数据需要重新分布,这个操作比较费时。查阅了 PL/proxy 关于扩分区的内容,手册中给出的这条建议还是不错的:
预先分配分区: 假如在项目初期如果认为两台服务器可以承担负载,那么可以将数据表分成 8 个分区(当然也能多分些分区),每台服务器上操持四个,当数据量上升时,那么仅需将分区迁移到其它服务器,而不需要涉及到数据重分布。
我这里的实验是在 PL/Proxy 之一: 使用外部表 SQL/MED搭建 PL/Proxy 搭建的基础之上,扩两个数据节点,手工处理数据重分布。
环境信息
原来的架构
备注:之前的PL/Proxy 架构: 一个 proxy 节点,两个数据节点。
目标增加两个数据库
增加数据节点
创建表空间目录
1 2
mkdir -p /database/ pg93/pg_tbs/ tbs_db2 mkdir -p /database/ pg93/pg_tbs/ tbs_db3
创建表空间
1 2
create tablespace tbs_db2 owner proxy LOCATION '/database/pg93/pg_tbs/tbs_db2' ; create tablespace tbs_db3 owner proxy LOCATION '/database/pg93/pg_tbs/tbs_db3' ;
创建数据库
1 2
CREATE DATABASE db2 WITH OWNER = proxy TEMPLATE = template0 ENCODING = 'UTF8' TABLESPACE = tbs_db2; CREATE DATABASE db3 WITH OWNER = proxy TEMPLATE = template0 ENCODING = 'UTF8' TABLESPACE = tbs_db3;
在 db2, db3 创建以下表
1 2 3 4
CREATE TABLE users ( username text, email text );
创建 insert_user 函数,在 db2, db3 库上执行
1 2 3 4 5
CREATE OR REPLACE FUNCTION insert_user(i_username text , i_emailaddress text ) RETURNS integer AS $$ INSERT INTO users (username, email) VALUES ($1 ,$2 ); SELECT 1 ; $$ LANGUAGE SQL;
创建DDL 函数, 在 db2, db3 库上执行 ( 此步可选,为了维护方便)
1 2 3 4 5 6 7
CREATE OR REPLACE FUNCTION func_ddl(sql text ) RETURNS integer AS $$ begin execute sql ; return 1; end ; $$ LANGUAGE plpgsql;
给 server 添加数据节点配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
proxy=# Alter server proxy_srv options(add p2 'dbname=db2 host=127.0 .0 .1 ' ,p3 'dbname=db3 host=127.0 .0 .1 '); ALTER SERVER proxy=# /des+ List of foreign servers -[ RECORD 1 ]--------+------------------------------------------------------------------------------------------------------------------------------------------------------------- Name | proxy_srv Owner | postgres Foreign-data wrapper | plproxy Access privileges | postgres=U/postgres | proxy=U/postgres Type | Version | FDW Options | (connection_lifetime '1800 ', p0 'dbname=db0 host=127.0 .0 .1 ', p1 'dbname=db1 host=127.0 .0 .1 ', p2 'dbname=db2 host=127.0 .0 .1 ', p3 'dbname=db3 host=127.0 .0 .1 ') Description
测试
清理数据: proxy 节点执行
1 2 3 4 5 6 7 8 9 10 11 12
proxy=> select func_ddl('truncate table users;' ); NOTICE: PL/Proxy: dropping stale conn NOTICE: PL/Proxy: dropping stale conn NOTICE: PL/Proxy: dropping stale conn NOTICE: PL/Proxy: dropping stale conn func_ddl ---------- 1 1 1 1 (4 rows)
插入10000 条测试数据, proxy 节点执行
1 2 3 4 5 6 7
proxy=> select insert_user('user_' ||n, 'user_' ||n || '@163.com' ) from generate_series(1 ,10000 ) n; insert_user ------------- 1 1 1 ....
备注:省略输出内容。
数据验证, 各数据节点执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
db0 => select count(*) from users ; count ------- 2530 (1 row) db0 => /c db1 You are now connected to database "db1" as user "proxy" . db1 => select count(*) from users ; count ------- 2504 (1 row) db1 => /c db2 You are now connected to database "db2" as user "proxy" . db2 => select count(*) from users ; count ------- 2497 (1 row) db2 => /c db3 You are now connected to database "db3" as user "proxy" . db3 => select count(*) from users ; count ------- 2469 (1 row)
备注:可见数据均匀分布到了四个节点。
参考
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/239585.html