CitusDB是一个基于最新PostgreSQL(以下简称PG)构建的分布式数据库。它是一个PostgreSQL的扩展。它可对PG数据库进行伸缩以适应大数据的处理;可在集群中进行自动分片和碎片复制,运行在云端或者混合系统中。在使用过程中,它就像一个单一节点的PostgreSQL服务,对应用来说是透明的,因此,使用它在集群中可以轻松的添加节点。进行查询工作时,它可将查询分布到集群中的每个节点,可用于快速处理查询以及并行处理。
为了学习使用Citus,搭建如图1所示的分布式数据库测试环境,PC环境如表1所示。
同时在131与132服务器中新建TestDB数据库,分别建表github_events_single与github_events_double两张表,用于存储a与2a条数据。分布式数据库存储2a条数据。
接着,根据以下步骤搭建环境:
1. 安装citus扩展
分别在PC1与PC2上安装Citus扩展,键入以下命令:
# add postgresql-9.5-citus pgdg repository
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee -a /etc/apt/sources.list.d/pgdg.list
sudo apt-get install wget ca-certificates
wget --quiet --no-check-certificate -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
# install the server and initialize db
sudo apt-get -y install postgresql-9.5-citus
2. 配置worker2节点
在该节点上需要使用以下命令进行配置:
1) 切换至postgres用户下:sudo su – postgres
2) 设置环境变量:export PATH=$PATH:/usr/lib/postgresql/9.5/bin
3) 建文件夹并initdb:
cd ~
mkdir –p citus/worker2
initdb –D citus/worker2
4) 修改相应的配置文件
修改postgresql.conf文件:
echo "shared_preload_libraries = 'citus'" >> citus/worker2/postgresql.conf
echo "listen_addresses = '*'" >> citus/worker2/postgresql.conf
修改pg_hba.conf文件:
sudo vi citus/worker2/pg_hba.conf
新增:host all all 0.0.0.0/0 trust
(根据实际情况设置ip及掩码)
5) 建库
由于citus无法在worker node建库,所以要手工建库。
Postgres用户下:psql –p 5433
create database DisCitusDB;
\l //查看到刚才建立的数据库
\c DisCitusDB; //连接到DisCitusDB数据库
create extension citus;
6) 启数据库
pg_ctl -D citus/worker2 -o "-p 5433" -l worker_logfile start
3. 配置worker1节点
在该节点上需要使用以下命令进行配置:
1) 切换至postgres用户下:sudo su – postgres
2) 设置环境变量:export PATH=$PATH:/usr/lib/postgresql/9.5/bin
3) 建文件夹并initdb:
cd ~
mkdir –p citus/worker1
initdb –D citus/worker1
4) 修改相应的配置文件
修改postgresql.conf文件:
echo "shared_preload_libraries = 'citus'" >> citus/worker1/postgresql.conf
echo "listen_addresses = '*'" >> citus/worker1/postgresql.conf
修改pg_hba.conf文件:
sudo vi citus/worker1/pg_hba.conf
新增:host all all 0.0.0.0/0 trust
(根据实际情况设置ip及掩码)
5) 建库
由于citus无法在worker node建库,所以要手工建库。
Postgres用户下:psql –p 9800
create database DisCitusDB;
\l //查看到刚才建立的数据库
\c DisCitusDB; //连接到DisCitusDB数据库
create extension citus;
6) 启数据库
pg_ctl -D citus/worker1 -o "-p 9800" -l worker_logfile start
4. 配置Master节点
在该节点上需要使用以下命令进行配置:
1) 切换至postgres用户下:sudo su – postgres
2) 设置环境变量:export PATH=$PATH:/usr/lib/postgresql/9.5/bin
3) 建文件夹并initdb:
cd ~
mkdir –p citus/master
initdb –D citus/ master
4) 修改相应的配置文件
修改postgresql.conf文件:
echo "shared_preload_libraries = 'citus'" >> citus/ master /postgresql.conf
echo "listen_addresses = '*'" >> citus/ master /postgresql.conf
修改pg_hba.conf文件:
sudo vi citus/ master/pg_hba.conf
新增:host all all 0.0.0.0/0 trust
(根据实际情况设置ip及掩码)
5) 告诉master,worker node有哪些
echo "172.20.149.131 9800" >> citus/master/pg_worker_list.conf
echo "172.20.149.132 5433" >> citus/master/pg_worker_list.conf
6) 重启服务
sudo service postgresql reload
7) 验证master节点是否获取到子节点的信息
psql -p 5433 -c "select * from master_get_active_worker_nodes();"
8) 建库
由于citus无法在worker node建库,所以要手工建库。
Postgres用户下:psql
create database DisCitusDB;
\l //查看到刚才建立的数据库
\c DisCitusDB; //连接到DisCitusDB数据库
create extension citus;
9) 建表
--分布式表,存放2a条数据
CREATE TABLE github_events_hash
(
event_id bigint,
created_at timestamp
);
接下来,使用函数master_create_distributed_table()声明数据库表。
SELECT master_create_distributed_table('github_events_hash’, event_id ', 'hash');//第一个参数是表名,第二个参数是Distribution column,第三个参数说明这张表的使用的是哪种distributed方法。
SELECT master_create_worker_shards('github_events_hash’, 2, 1);
--非分布式表,存放a条数据
CREATE TABLE github_events_single
(
event_id bigint,
created_at timestamp
);
--非分布式表,存放2a条数据
CREATE TABLE github_events_double
(
event_id bigint,
created_at timestamp
);
10) 测试数据插入
CREATE OR REPLACE FUNCTION public.insert_testdata_to_single()
RETURNS void AS
$BODY$
declare
sql varchar;
str varchar;
num int;
begin
str='';
num=0;
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL) VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_ single ()');
insert into github_events_single select generate_series(1,10000000),clock_timestamp();
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL) VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_ single()');
end
$BODY$
LANGUAGE plpgsql ;
CREATE OR REPLACE FUNCTION public.insert_testdata_to_double()
RETURNS void AS
$BODY$
declare
sql varchar;
str varchar;
num int;
begin
str='';
num=0;
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL) VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_double()');
insert into github_events_double select generate_series(1,20000000),clock_timestamp();
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL) VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_double()');
end
$BODY$
LANGUAGE plpgsql ;
CREATE OR REPLACE FUNCTION public.insert_testdata_2kw()
RETURNS void AS
$BODY$
declare
sql varchar;
str varchar;
num bigint;
begin
str='';
num=0;
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL) VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_2kw()');
for num in 10000000..30000000 loop
sql= 'insert into github_events_hash values('|| num || ',''2016-1-1'');';
execute sql;
end loop;
INSERT INTO insert_operate_log(StartTime,EndTime,OperateSQL)
VALUES((select clock_timestamp()),(select clock_timestamp()),'insert_testdata_2kw()');
end
$BODY$
LANGUAGE plpgsql;
到此为止,已经配置master与worker节点的数据。
5. CRUD测试结果
1) 测试方法
采用对比方法。测试分布式表2a条数据、单表a条数据、单表2a条数据(a为正整数)在原有不同数量等级前提下,分别查询同一数量等级数据的结果响应时间平均值。
2) 测试结果
6. 总结
从上述CRUD测试结果得出以下结论:
①查询结论:在相同配置的机器前提下,无索引的三张测试表中,分布式数据库查询速度最快,而建立索引之后结果则相反,猜想原因是分布式数据库数据查找时需要判断数据所在的节点,而单机数据表不需要进行此项判断。
②插入结论:单机数据库的数据单条插入时间少于分布式数据库,猜想原因是分布式数据库数据插入时需要判断数据插入至哪个worker节点的数据库,而在单机数据库时不需要进行此项判断,故单机数据库数据入库时间少于分布式数据库。
③更新&&删除结论:分布式数据库单条更新与删除耗时小于单机数据库相应单条数据操作耗时。