Title

基于`citus`的分布式数据库集群部署

基于citus的分布式数据库集群部署

实验目标

通过 Docker 容器搭建一个基于 PostgreSQL 和 Citus 插件的分布式数据库集群,包括一个协调器节点和多个工作节点,实现分布式数据库的搭建与数据分片测试。

实验环境

操作系统

Ubuntu1604

软件

dockerpostgreSQLcitus插件

docker镜像

citusdata/citus

实验步骤

容器搭建准备

拉取citus镜像

推荐镜像源 >>> 轩辕Docker<<< Ctrl+左键点击即可跳转超链接

docker pull citusdata/citus
创建citus的docker专属网络
docker network create citus-net

创建coordinator、worker容器

本次实验部署一个coordinator(协调器)节点和两个worker节点。

coordinator节点
docker run -d --name <citus-coordinator-name> \
  --network <net-name> -p <host-port>:<container-port> \
  -e POSTGRES_PASSWORD=<password> \
  citusdata/citus
解释:
  • -p:容器端口映射,这里将coordinator节点上的pg服务映射到宿主机的端口。

  • -e:环境变量设置,这里设置pg用户的密码。

  • -d --name:指定容器名称。

  • --network:指定docker网络组,这里是citus-net

示例:
docker run -d --name cn --network citus-net -p 5432:5432 -e POSTGRES_PASSWORD=123456 citusdata/citus

这里指定5432作为映射端口和用123456作为密码是不安全的,在实际的生产环境中,往往还需要考虑网络攻击等其他因素,可以使用如15432的端口和强密码来保证数据安全。

worker节点
worker-1
docker run -d --name wk1 --network citus-net -e POSTGRES_PASSWORD=123456 citusdata/citus
worker-2
docker run -d --name wk2 --network citus-net -e POSTGRES_PASSWORD=123456 citusdata/citus
检查

可以通过以下命令查看容器是否成功创建:

docker ps -a

-a表示列出详细状态

配置Citus集群

进入协调器配置环境
查看wk1wk2的容器主机名
sudo docker exec -it wk1 hostname -i
sudo docker exec -it wk2 hostname -i
进入协调器容器内的psql
docker exec -it cn psql -U postgres
  • -i:即 --interactive 的缩写,该选项用于保持标准输入(stdin)打开,即使没有连接到终端。这使得你可以向容器内的进程发送输入。
  • -t:即 --tty 的缩写,它会为容器分配一个伪终端(pseudo-TTY),模拟一个交互式的终端环境,让你能够像在本地终端一样与容器内的进程进行交互。
配置插件
-- 添加工作节点
SELECT * FROM citus_add_node('<wk1-hostname>', 5432);
SELECT * FROM citus_add_node('<wk2-hostname>', 5432);

-- 验证节点状态
SELECT * FROM citus_get_active_worker_nodes();

这里通过SELECT调用插件函数citus_add_nodecitus_get_active_worker_nodes

  • citus_add_node函数成功执行后psql会返回函数结果(已添加的节点数量)

     citus_add_node 
    ----------------
           1(节点数量)
    (1 row)
    
  • citus_get_active_worker_nodes函数成功执行后psql会返回函数结果(已添加的节点内容)

     node_name  | node_port 
    ------------+-----------
     172.18.0.4 |      5432
     172.18.0.3 |      5432
    (2 rows)
    

测试数据库

在协调器容器的psql工具内。

创建示例表
CREATE TABLE sensor_data (
    sensor_id int,
    log_time timestamp,
    value float
);
指定分布列(自动分片)
SELECT create_distributed_table('sensor_data', 'sensor_id');
插入测试数据
INSERT INTO sensor_data VALUES 
  (1, now(), 0.5), (2, now(), 0.8), 
  (3, now(), 1.2), (4, now(), 0.3);
查看数据分布
SELECT * FROM sensor_data;

验证分片分布

-- 查看分片分布情况
SELECT nodename, nodeport, count(*) as shard_count 
FROM citus_shards 
WHERE table_name = 'sensor_data'::regclass 
GROUP BY nodename, nodeport;
posted @ 2025-03-13 13:08  是胡某某啊  阅读(234)  评论(0)    收藏  举报