Centos7搭建分布式Postgresql集群(Citus MX)来处理地理数据(PostGIS)

本文的分布式Postgresql集群是通过citus扩展实现的,Citus是PostgreSQL的扩展(not a fork),采用shared nothing架构,节点之间无共享数据,由协调器节点和Work节点构成一个数据库集群。相比单机PostgreSQL,Citus可以使用更多的CPU核心,更多的内存数量,保存更多的数据。通过向集群添加节点,可以轻松的扩展数据库。
Citus支持新版本PostgreSQL的特性,并保持与现有工具的兼容 Citus使用分片和复制在多台机器上横向扩展PostgreSQL。它的查询引擎将在这些服务器上执行SQL进行并行化查询,以便在大型数据集上实现实时(不到一秒)的响应。
其实我了解到citus没几个月,当时因为程序不太支持Hive(后端的包没给对Hadoop的版本)就准备使用其他的数据库做数据仓库,几经抉择选中了Postgresql,而为了能支撑“大量”的数据就去找该数据库搭建集群的教程。
难受的是,Postgresql主从我几次折腾还是没能成功,虽然主从模式没有成功但功夫不负有心人让我找到了Citus。当时我只是基于测试的目的只在虚拟机上面搭建了一个简单的集群就搁置了,这不最近因为需要使用Postgis扩展来处理地理数据了,本来是打算使用OpenGauss搭建集群的,苦于arm架构下二进制包是openeuler系统的,暂时不得不使用Postgresql来解决问题了。

于是又只好对Citus进行一番测试了,苦于不能在实际的arm环境上面进行测试,下面的“教程”是在x86架构下进行的。。。。。。

开门见山,我就不这么多废话了,直接上步骤吧。
一、配置YUM源
官方源:

echo '[postgresql]
name=postgresql
baseurl=https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-7-x86_64/
gpgcheck=0
enable=1' > /etc/yum.repos.d/postgresql.repo

清华大学镜像源

echo '[postgresql]
name=postgresql
baseurl=https://mirrors.tuna.tsinghua.edu.cn/postgresql/repos/yum/13/redhat/rhel-7-x86_64/
gpgcheck=0
enable=1' > /etc/yum.repos.d/postgresql.repo

二、安装postgresql13

yum install -y postgresql13-server

三、修改数据目录

修改默认的数据目录可有可无,看数据盘何在或者挂载的目录。不知道使用软连接可以不可以呢?修改了默认目录不知道要不要像mysql那样selinux会有影响。

创建目录
mkdir /home/pg_data
chown -R postgres:postgres /home/pg_data
chmod 700 /home/pg_data

修改启动参数
vi /usr/lib/systemd/system/postgresql-13.service

将
Environment=PGDATA=/var/lib/pgsql/13/data/
修改为
Environment=PGDATA=/home/pg_data

重载
systemctl daemon-reload

四、初始化

/usr/pgsql-13/bin/postgresql-13-setup initdb

五、安装citus

yum install -y  citus_13

六、安装postgis

yum install postgis30_13

缺少依赖

--> 解决依赖关系完成
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:SFCGAL
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:libgeotiff16
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:libgdal.so.28()(64bit)
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:libSFCGAL.so.1()(64bit)
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:gdal32-libs >= 3.2.2
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:geos39 >= 3.9.1
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:libproj.so.19()(64bit)
错误:软件包:postgis30_13-3.0.3-7.rhel7.x86_64 (postgresql)
          需要:proj72 >= 7.2.1
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

增加YUM源

不像编译了,要太多的依赖一步一步的编译,直接使用rpm安装算了。

echo '


[postgresql-common]
name=postgresql common
baseurl=https://mirrors.tuna.tsinghua.edu.cn/postgresql/repos/yum/common/redhat/rhel-7-x86_64/
gpgcheck=0
enable=1' >>  /etc/yum.repos.d/postgresql.repo

重新安装postgis

yum install -y postgis30_13

七、配置citus

编辑pg_hba.conf文件

trust设置集群间直接连接,其他使用密码连接(md5,或者其他也可以)。注意顺序,刚开始我就是因为顺序导致添加节点报ssl相关错误解决后就是没有密码的错误的。

vi /home/pg_data/pg_hba.conf

# correspond to 24, 20, and 16-bit blocks in Private IPv4 address spaces.
host    all             all             172.30.88.0/24         trust

host    all             all             0.0.0.0/0         md5

编辑postgresql.conf文件

vi /home/pg_data/postgresql.conf
# 将listen_addresses修改为 listen_addresses = '*'

或者直接追加

echo "

listen_addresses = '*'
shared_preload_libraries = 'citus'
" >> /home/pg_data/postgresql.conf

启动postgresql(重启)

systemctl restart postgresql-13

启用citus

 

sudo -i -u postgres psql -c "CREATE EXTENSION citus;"

多CN模式(Citus MX)

商业版功能,社区版也没说不可以吧?!

echo "

citus.replication_model = streaming
" >> /home/pg_data/postgresql.conf

其中一个节点提示致命错误: 无法加载库 "/usr/pgsql-13/lib/citus.so": libzstd.so.1: 无法打开共享对象文件: 没有那个文件或目录在不正常节点yum provides */libzstd.so.1显示hadoop-3.0.0+cdh6.3.2-1605554.el7.x86_64 : Hadoop is a software platform for processing vast amounts of data,在正常节点显示libzstd-1.4.0-1.el7.x86_64 : Zstd shared library没有安装该包,奇怪,难度是因为hadoop-3.0.0+cdh6.3.2冲突了?

添加节点

sudo -i -u postgres psql -c "SELECT * from citus_add_node('paas-201', 5432);"
sudo -i -u postgres psql -c "SELECT * from citus_add_node('paas-202', 5432);"
sudo -i -u postgres psql -c "SELECT * from citus_add_node('paas-203', 5432);"
sudo -i -u postgres psql -c "SELECT * from citus_add_node('paas-241', 5432);"

查看节点

sudo -i -u postgres psql -c "SELECT * FROM citus_get_active_worker_nodes();"

然后将普通的Worker变成Citus MX节点

sudo -i -u postgres psql -c "select start_metadata_sync_to_node('paas-202',5432);"

默认情况下,Citus MX节点上也会分配分片。官方的Citus MX架构中,Citus MX集群中所有Worker都是Citus MX节点。

如果我们只想让少数几个Worker节点专门用于分担CN负载,那么这些节点上是不需要放分片的。
可以通过设置节点的shouldhaveshards属性进行控制。

sudo -i -u postgres psql -c "SELECT master_set_node_property('paas-202', 5432, 'shouldhaveshards', false);"
sudo -i -u postgres psql -c "SELECT master_set_node_property('paas-201', 5432, 'shouldhaveshards', false);"

八、简单使用

创建表

CREATE TABLE "public"."username" (
  "id" varchar(255) NOT NULL,
  "name" varchar(255),
  "dwmc" varchar(255),
  PRIMARY KEY ("id")
);

id作为分片列,默认分片方法为hash

SELECT create_distributed_table('username', 'id', 'hash');

设置分片个数及每个分片副本数
….没有搜索到相关语句,只能通过配置文件设置副本或者分片或者sql后才执行create_distributed_table了。

查看某个节点上的分片

select * from pg_dist_shard_placement where nodename='paas-202';

重新分配分片(节点变化)

SELECT rebalance_table_shards('username');

其他:

#-----查看work节点
SELECT * from master_get_active_worker_nodes();
#-----元数据查看
SELECT * from master_get_table_metadata('username');
#-----分区查看
SELECT * from pg_dist_partition;
#-----分片查看
SELECT * from pg_dist_shard;
#-----分片分布查看
SELECT * from pg_dist_shard_placement;
#-----移动分片
SELECT master_copy_shard_placement(shardid, 'good_host', 5432, 'bad_host', 5432);

测试ing……不知道要趟多少坑啊!

 

ChiuYut

2021年6月21日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!