citus是什么
citus是postgres的分布式拓展,它能够以非常简单的配置实现分布式的postgres数据库并实扩容,还能够将SQL进行并行化处理,充分利用多台机器的资源,使用于大量数据的实时查询场景。
citus的基本概念
节点:Coordinator Node(协调节点)、Worker Node(工作节点)
表:Distributed Table(分布式表)、 Reference Table(引用表) 、Local Tables (本地表)
citus的节点分为工作节点和协调节点。
协调节点是我们连接使用的主节点,它的主要职责是连接所有的工作节点分发和协调数据,不会保存分布式表的数据。
工作节点是实际保存数据和执行SQL的主体,协调节点会将SQL处理后分发到对应的节点执行任务。
citus的表有三种类型:分布式表、引用表、本地表。
分布式表,顾名思义就是实现分布式存储的表,它的数据是根据实现创建分布式表时指定的字段作为key进行哈希,水平分布在所有的数据节点中,是citus最常用的分布式表。
引用表也是分布式表的一种,它的数据完整会被保存所有的工作节点中,所有工作节点都拥有该表的全部数据。
本地表不是分布式表,它是存储在协调节点上面的表,和普通postgres数据库的表一样。
实战体验
准备一台主节点、若干工作节点
我这边正好有四台Hosthatch虚拟机,都重装成debian11用来搭建实战。
协调节点 192.168.10.202
工作节点1 192.168.10.101
工作节点2 192.168.10.102
工作节点3 192.168.10.103
先安装postgres和citus拓展(所有节点都要执行下面的步骤)
apt update && apt install -y sudo gnupg2 #添加citus源 curl https://install.citusdata.com/community/deb.sh | sudo bash #添加postgresql源,我们要安装最新的postgresql-15 sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - #更新源 sudo apt-get update #安装postgresql-15、以及对应版本的citus拓展 sudo apt-get -y install postgresql-15 postgresql-15-citus-11.1
修改postgresql监听IP、添加四台节点互相信任(所有节点都要执行)
# 预加载citus扩展 sudo pg_conftool 15 main set shared_preload_libraries citus # 修改监听IP,这里我直接改了 *,如果是暴露在公网的建议只监听内网ip sudo pg_conftool 15 main set listen_addresses '*' # 修改添加四台节点互信 sudo vim /etc/postgresql/15/main/pg_hba.conf #在最底下追加下面内容 host all all 192.168.10.202/24 trust host all all 192.168.10.101/24 trust host all all 192.168.10.102/24 trust host all all 192.168.10.103/24 trust #重启 systemctl restart postgresql
完成了上面的步骤后,我们开始选择一个数据库添加citus拓展(所有节点都要执行)
# 我这边直接选择的postgres,如果要使用不同的库,所有节点都需要有该库存在 sudo -i -u postgres psql -c "CREATE EXTENSION citus;"
接下来在协调节点中执行相关函数,设置协调节点和添加工作节点(只在协调节点运行)
#设置协调节点 IP端口根据实际情况来 sudo -i -u postgres psql -c "SELECT citus_set_coordinator_host('192.168.10.202', 5432);" #添加工作节点 sudo -i -u postgres psql -c "SELECT * from citus_add_node('192.168.10.101', 5432);" sudo -i -u postgres psql -c "SELECT * from citus_add_node('192.168.10.102', 5432);" sudo -i -u postgres psql -c "SELECT * from citus_add_node('192.168.10.103', 5432);" #查看活跃的工作节点 sudo -i -u postgres psql -c "SELECT * FROM citus_get_active_worker_nodes();"
到此为止,我们前置配置相关的工作已经完成了,接下来就是创建分布式表并感受分布式的快乐了,比如下面的流程
#后续都是在协调节点执行 #创建表结构 CREATE TABLE IF NOT EXISTS key ( id uuid, word varchar NULL, url varchar NULL, description varchar null, PRIMARY KEY (id) ); #调用citus提供的函数创建分布式表 第一个参数是表名 第二个参数是依据该字段进行分片,将数据分配到所有的工作节点 SELECT create_distributed_table('key', 'id'); #这样就建立好了一个分布式表,使用它也是让程序直接连接协调节点,就像平常连接一个数据库那样直接使用即可