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

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节点上对分片表中的数据进行增删改查的访问。

你可能感兴趣的:(在CentOS系统上使用citus搭建分布式数据库系统)