基于`citus`的分布式数据库集群部署
基于citus的分布式数据库集群部署
实验目标
通过 Docker 容器搭建一个基于 PostgreSQL 和 Citus 插件的分布式数据库集群,包括一个协调器节点和多个工作节点,实现分布式数据库的搭建与数据分片测试。
实验环境
操作系统
Ubuntu1604
软件
docker、postgreSQL、citus插件
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集群
进入协调器配置环境
查看wk1和wk2的容器主机名
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_node、citus_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;

浙公网安备 33010602011771号