PL/Proxy之三: 增加数据节点

关于扩分区

扩分区意味着数据需要重新分布,这个操作比较费时。查阅了 PL/proxy 关于扩分区的内容,手册中给出的这条建议还是不错的:

预先分配分区: 假如在项目初期如果认为两台服务器可以承担负载,那么可以将数据表分成 8 个分区(当然也能多分些分区),每台服务器上操持四个,当数据量上升时,那么仅需将分区迁移到其它服务器,而不需要涉及到数据重分布。

我这里的实验是在 PL/Proxy 之一: 使用外部表 SQL/MED搭建 PL/Proxy 搭建的基础之上,扩两个数据节点,手工处理数据重分布。

环境信息

原来的架构

1
2
3
proxy  
db0
db1

备注:之前的PL/Proxy 架构: 一个 proxy 节点,两个数据节点。

目标增加两个数据库

1
2
db2  
db3

增加数据节点

创建表空间目录

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

(0)
上一篇 2022年2月12日
下一篇 2022年2月12日

相关推荐

发表回复

登录后才能评论