在CentOS系统上使用citus搭建分布式数据库系统

1.概述

1.1什么是Citus

 Citus is an extension to Postgres that intelligently distributes your database & your queries across multiple nodes. However you query and however your data is organized, Citus scales your per-query performance, not just the number of queries you can run. Available as open source, as enterprise software you can run anywhere, and as a fully-managed database as a service.

 Citus是Postgres的一个扩展。Citus的优势在于:无论你的数据和查询怎么组织,它都可以智能的将你的数据库以及查询分布在多个节点上。Citus可以优化你的每个查询的表现,不仅仅是你能运行的查询数量。Citus是一个开源,可在任何地点运行的企业软件,同时也是一个提供数据库全方位管理的服务。

 All queries to a Citus database cluster are managed by the Citus coordinator node, which looks just like single-node Postgres to the application—modulo the performance benefits from scaling out. The Citus coordinator is equipped with a distributed SQL engine that transforms SQL queries & routes the transformed queries to the correct shards on the correct worker nodes. In this animation, the co-located join and update scenarios are examples of single-tenant SQL queries, hence they only need to query a subset of shards on a subset of the worker nodes. Whereas the distributed aggregate and distributed transaction scenarios need to access shards across multiple nodes.

 所有对于Citus数据库集群的查询都要经过Citus协调节点的管理。这个协调节点看起来就像应用层的一个单postgres节点,目的是通过缩小规模将功能模块化。此Citus协调节点备有一个既可翻译SQL查询,又可将翻译后的查询分发到各个正确节点上对应分片的分布式SQL引擎。在这个过程中,那些级联和更新的情况就演变为单一的SQL查询,因此他们只需要在一个工作节点的集合中寻找某个小节点中的分片。而分布式集群和分布式事务都需要通过多节点的方式访问分片。

1.2 Citus包括些什么

  1. coordinator node 协调节点</br>存储元数据,不存储实际数据。向各个工作节点发送查询请求,并汇总结果。对于应用程序而言是服务端,对工作节点来说是客户端。
  2. worker node 工作节点</br>存储实际数据。执行协调节点发来的查询请求。原则上不能作为直接为应用系统服务。但是可以直接操作工作节点上的表。

1.3 分片与副本

  • 分片(shards): 将同一个逻辑表中的数据,分别存储到不同的物理表中。这个物理表被称为分片。同一个工作节点可以有多个分片,甚至可以将一个逻辑表分为多个分片,并将这多个分片都存在同一工作节点上。

    分片的原则
    设计者要清除数据如何分部。数据如何划分,那些数据应该分布式存放,那些不应该分布式存放,那些需要冗余等。
    策略:
     ● 完备性:所有的全局数据都要映射到某个片上;
     ● 可重构:所有的片段必须能重新构成全局数据;
     ● 不相交:划分的各个片段无交集。

  • 副本(placement):分片的冗余。

2搭建Citus分布式数据库

2.1准备部分

1.使用三个计算机名节点,一个master 两个segment

主机名称 IP地址
master 192.168.32.144
segment1 192.168.32.145
segment2 192.168.32.146

2.搭建三个CentOS系统,并安装PostgreSQL数据库。修改host主机名和ip地址

3.除此之外,还要修改etc/hosts下的内容

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.32.144   master
192.168.32.145   segment1
192.168.32.146   segment2
#目的是告诉系统各自的IP叫什么主机名,如何去进行通信

2.2安装Citus(master + segment 1 + segmengt 2)

首先将Citus源码放入目录,并解压缩。通过命令进入源码目录

cd citus -realease-7.5/

在运行configure前,要通过pg_config获取postgresql的环境信息,故此处配置PG_CONFIG环境变量

export PG_CONFIG = /usr/local/postgresql/bin/pg_config

运行configure命令,生成编译安装环境

./configure

编译 运行

make && make install

3加载Citus插件(master + segment 1+segment 2)

Citus以插入的方式让postgreSQL支持分布式部署,在加载Citus之前需要先配置potgreSQL并启动,下面简述方法。

3.1 配置PostgreSQL

添加postgres用户,创建目录,同时进入目录。

useradd postgres
mkdir -p /home/postgres/pgdata/
cd /home/postgres/pgdata

初始化数据库环境

/usr/local/postgresql/bin/initdb -D /home/postgres/pgdata

修改postgresql.conf文件

vim /home/postgres/pgdata/postgresql.conf
listen_address='*'
shared_preload_libraries = 'citus'

配置远程访问权限

vim /home/postgres/pgdata/pg_hba.conf
#让所有的IP地址可信
host       all        all       0.0.0.0/0      trust

创建一个citus测试用数据库

/usr/local/postgresql/bin/createdb testcitus

启动postgresql数据库

/usr/local/postgresql/bin/pg_ctl -D /home/postgres/pgdata/ -l logfile start

3.2加载citus插件(master + segment1 + segment2)

切换到root用户目录下

su - 
sudo -i -u postgres /usr/local/postgresql/bin -d testcitus -c "create extension citus"
#if success
CREATE EXTENSION

切换到postgres用户

su - postgres

使用psql连接testcitus数据库

/usr/local/postgresql/bin/psql -d testcitus

使用 \dx命令查看已加载的插件:

testcitus=# \dx
                      List of installed extensions
    Name      |    Version    |     Schema    |            Description
--------------+---------------+---------------+------------------------------
   citus      |    7.5-7      |  pg_catalog   |   Citus distriuted database
  plpgsql     |     1.0       |  pg_catalog   |  PL/pgSQL procedural language
(2 raws)                                   

4单master部署(master)

截止目前,所有的数据库都加载了citus插件,master已经使用psql连接到本机的testcitus数据库。在单master方式下,只有master节点可以对全局数据进行操作,包括DDL和DML语句
使用master_add_node()函数添加worker有两个参数,第一个参数为节点名称,第二个参数为数据库节点监听的端口号。

testcitus=# select * from master_add_node('pg1',5432);
testcitus=# select * from master_add_node('pg2',5432);

通过master_get_active_worker_nodes()函数可以查看加入的workers节点;

testcitus=# select * from master_get_active_worker_nodes();
  node_name  |  node_port
     gp2     |    5432
     gp1     |    5432

创建用户数据表:

create table test(id int primary key,id2 int);

这时候创建的表只存在于master节点上,其他节点还无法进行访问
创建表的分布,可以先使用master_create_worker_distributed_table()函数定义表,然后使用master_create_worker_shards()函数创建表,在workers节点上创建分片和副本,或者使用create_distributed_table()函数完成上面两个函数的功能,下面介绍第一种方法。

master_create_distributed_table()函数:

参数名称 描述
参数1 table_name 分布表的名称
参数2 distribution_column 表中用于数据分布算法的字段名称,通过哦给出的字段计算数据的分布
参数3 distribution_method 数据分布算法,取值:append、hash、range

master_create_worker_shards()

参数名称 描述
参数1 table_name 表的名字
参数2 shard_count 分片的个数,每个节点可以设置多个分片
参数3 replication_factor 每个分片的副本数量

定义分布表并创建分片副片的命令如下:

select master_create_distributed_table('test','id','hash');
select master_create_worker_shards('test',2,1);

如果上述命令不能执行,就systemctl stop firewalld.service #停止firewall

执行完成后可以再master节点上查看pg_dist_partition中的信息,pg_dist_partition表中会有存放每个分布表的定义,当创建表的分片和副本后,可以通过pg_dist_shard_placement视图查看到所有的分片信息,并可以在works节点上查看到创建的分片表。

使用这种方式部署后可以再master节点上进行表的增删改查等操作,在workers节点是看不到创建的test表的,所以无法在workers节点查询全局的数据,只能查询该节点上分片表的数据,当然也可以在workers节点上对分片表中的数据进行增删改查的访问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容