背景
随着大数据技术的发展,我们现在开发的软件系统管理的数据量越来越大,特别是随着软件Saas的发展,各种软件都在向多租户平台发展,而当前大部分程序员是熟悉SQL语言的程序员,或者说只能够在SQL上进行开发,使用NoSQL、NewSQL数据库开发所花费的学习成本也是比较高的,随之,分布式关系型数据库诞生,今天给大家介绍的基于PostgreSQL的citus分布式数据库,就是一种适合Saas化、多租户平台的数据库。
Python语言,作为当前大数据环境下流行的计算机语言,其简单、高效的编程思想,与PostgreSQL的结合也非常紧密,PostgreSQL自身支持PL/Python语言进行数据库编程,所以,我们在使用PostgreSQL数据库开发时特别喜欢使用PL/Python语言进行数据库的存储过程、触发器等编程,尤其时它更容易与机器学习相结合,可以实现在数据库中进行机器学习运算。
Citus简介
citus是PostgreSQL的一个sharding插件,可以把PostgreSQL变成一个分布式数据库。目前在苏宁有大量的生产应用运行在PostgreSQL+citus的环境中。
citus是一款基于PostgreSQL的开源分布式数据库,自动继承了PostgreSQL强大的SQL支持能力和应用生态(不仅仅是客户端协议的兼容还包括服务端扩展和管理工具的完全兼容)。
和其他类似的基于PostgreSQL的分布式方案,比如GreenPlum,PostgreSQL-XL,PostgreSQL-XC相比,citus最大的不同在于citus是一个PostgreSQL扩展而不是一个独立的代码分支。
因此,citus可以用很小的代价和更快的速度紧跟PostgreSQL的版本演进;同时又能最大程度的保证数据库的稳定性和兼容性。
另外,Citus不仅仅可以用于OLAP,也可以用于OLTP,属于 HTAP , 是未来数据库发展的一个方向。 HTAP 既可以处理在线交易事务,又可以处理在线实时分析 。
PL/Python 过程语言
PL/Python 过程语言允许用Python编写 PostgreSQL 函数。 其优势就是简单易用,能够大量简化复杂的计算,同时天然与大数据、机器学习相结合。
环境规划
IP | 角色 | 端口 |
---|---|---|
192.168.0.101 | worker | 5432 |
192.168.0.102 | worker | 5432 |
192.168.0.103 | worker | 5432 |
192.168.0.104 | worker | 5432 |
192.168.0.105 | worker | 5432 |
192.168.0.100 | coordinate | 5432 |
-
coordinate
协调节点,一般称为cn,存储所有元数据,不存实际数据,该节点直接对用户开放,等于一个客户端。
-
worker
工作节点,不存储元数据,存储实际数据。执行协调节点发来的查询请求。一般不直接对用户开放。
操作系统
本例选择Debian 10作为基础操作系统
版本选择
通过查阅官方网站,目前建议选择版本
软件 | 版本 |
---|---|
PostgreSQL | 14.1 |
citus | 10.2.3 |
Python | 3.7 |
环境搭建
1.编译安装PostgreSQL
请到PostgreSQL官方网站下载源码
在规划安装的每台机器上编译安装PostgreSQL
1.1安装依赖库
apt-get install make gcc g++ gdb automake apt-get install build-essential gdb bison flex zlib1g-dev libreadline-dev
1.2创建用户
groupadd postgres useradd -g postgres postgres
1.3准备源代码
将源代码上传到服务器/usr/local,并解压缩。
tar zxvf postgresql-14.1.tar.gz chown postgres postgresql-14.1 -R mkdir /usr/local/pgsql chown postgres /usr/local/pgsql
1.4源代码配置、编译、安装
以postgres用户进行操作
su postgres cd postgresql-14.1 ./configure --prefix=/usr/local/pgsql --with-python make make install
当OS中有多个python版本,需要指定python路径,./configure参数加上PYTHON=/usr/bin/python3 指定python文件
2.初始化数据库并配置集群
在每台机器上以postgres用户进行操作
2.1初始化数据库
以root用户操作
mkdir /u01/pgsql/data -p chown postgres /u01/pgsql -R
以postgres用户操作
su postgres cd /usr/local/pgsql/bin ./initdb -E UNICODE -D /u01/pgsql/data
2.2配置监听地址与端口参数
以postgres用户操作
vi /u01/pgsql/data/postgresql.conf
修改对应参数:
listen_addresses='*' port=5432 data_directory='/u01/pgsql/data' hba_file='/u01/pgsql/data/pg_hba.conf' ident_file='/u01/pgsql/data/pg_ident.conf'
2.3配置远程连接
-
cn节点:
以postgres用户操作
vi /u01/pgsql/data/pg_hba.conf
添加一行:
host all all 0.0.0.0/0 password
-
worker节点:
以postgres用户操作
vi /u01/pgsql/data/pg_hba.conf
添加一行:
host all all 192.168.0.0/24 trust
2.4安装citus
在每个节点上将下载的citus源代码上传并解压缩。
以root用户操作:
apt-get install curl apt-get install libcurl4-openssl-dev apt-get install liblz4-dev apt-get install libzstd-dev
以postgres用户操作:
cd citus-10.2.3 export PATH=$PATH:/usr/local/pgsql/bin ./configure make make install
2.5集群配置
1.在每个节点上以postgres用户执行
echo "shared_preload_libraries = 'citus'" >> /u01/pgsql/data/postgresql.conf
2.启动节点
以root用户执行
-
启动worker节点
su postgres -c "/usr/local/pgsql/bin/pg_ctl -D /u01/pgsql/data -l /u01/pgsql/data/server.log start"
-
启动cn节点
su postgres -c "/usr/local/pgsql/bin/pg_ctl -D /u01/pgsql/data -l /u01/pgsql/data/server.log start"
3.创建数据库
在所有节点以postgres用户执行:
cd /usr/local/pgsql/bin psql postgres=#create database 数据库名; postgres=# \c 数据库名 数据库名=# create extension citus;
4.为cn节点修改用户密码
在cn节点上执行
su postgres cd /usr/local/pgsql/bin ./psql postgres postgres=# \password postgres Enter new password: Enter it again: postgres=#
5.协调节点新增工作节点
以后的管理操作仅仅在协调节点(cn)上操作
psql -d 数据库名 psql Type "help" for help. 数据库名=#SELECT * from master_add_node('192.160.0.101', 5432); 数据库名=#SELECT * from master_add_node('192.160.0.102', 5432); 数据库名=#SELECT * from master_add_node('192.160.0.103', 5432); 数据库名=#SELECT * from master_add_node('192.160.0.104', 5432); 数据库名=#SELECT * from master_add_node('192.160.0.105', 5432);
6.查看工作节点
SELECT * FROM master_get_active_worker_nodes();
3.创建分片表
--创建数据表 create table shiptrack(gid serial primary key,tracktime timestamp without time zone); --配置分片策略,设置分片数,5个主机,设置分片5,每个主机一张表 set citus.shard_count=5; --配置副本数 set citus.shard_replication_factor=2; --将数据表配置为分片表 SELECT create_distributed_table('shiptrack', 'gid', 'hash'); --查看分片分布 SELECT * from pg_dist_shard_placement order by shardid, placementid;
4.配置PL/Python
CREATE EXTENSION plpython3u;
5.编写一个简单的PL/Python函数进行测试
CREATE FUNCTION testpython () RETURNS text AS $$ txt = 'Hello world!' plpy.info(txt) return txt $$ LANGUAGE plpython3u;