本文的分布式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日