Citus简介
citus 是一个 PostgreSQL 插件。通过它,可以实现分布式 PostgreSQL安装和部署
本章我们将讨论 citus 的部署。分布式表
本章将通过一个讨论话题的示例来演示 citus 分布式表的设置coordinator节点的灾难处理
本章讨论 coordinator 的灾难处理。
分布式表
- 57833
- 2022-09-19T13:17:03+08:00
本章将通过一个讨论话题的示例来演示 citus 分布式表的设置。
数据表
表名 | 说明 |
---|---|
users | 用户信息 |
discussions | 讨论的话题 |
discussions.user_id
:由哪个用户发表的讨论discussions.parent_id
:所属的父讨论。如果为0
,则为一级讨论。
CREATE TABLE users (
id bigserial PRIMARY KEY,
email VARCHAR(255) NOT NULL,
nickname VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
is_del BOOLEAN NOT NULL DEFAULT FALSE
);
CREATE TABLE discussions(
id bigserial NOT NULL,
user_id bigint NOT NULL REFERENCES users (id),
parent_id bigint NOT NULL DEFAULT 0,
subject VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
is_del BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY(user_id,id)
);
注意,由于 citus 分布式要求,discussions
的主键是 (user_id,id)
分布式规则
分布式 users
表
SELECT create_distributed_table('users', 'id');
分布式 discussions
表
SELECT create_distributed_table('discussions', 'user_id');
特别注意!discussions
使用的是 user_id
作为分布式规则,而不是 id
。
示例数据
INSERT INTO users (email,nickname,password) VALUES
('[email protected]', '张三','$2a$12$E/yEAZ4y0xAau2ACJnNQZObBIV1nI2c0s.mISYvfyhX7k7Uk4NMa2'),
('[email protected]', '李四','$2a$12$NG4bwRBjCY63uIlULfS0zugZNdOfMsgGg8qMoDjQAh6xM8CDAaeCm'),
('[email protected]', '王五','$2a$12$orKK2bwsy6tzgmk/ccyMOeJqi0ZZ2dPWDzsdtrnAzmD3OL4ljt0/u'),
('[email protected]', '赵六','$2a$12$kTZVctim59ivCTpSr5VFA.1Ty1/vaM7z6Q8YDGgTqIRUyN2jfIj6e'),
('[email protected]', '钱七','$2a$12$uU9Z6C/V8UO4wku9rJosBuqarU4nFQe.5M5lI.HEA3oPzztA5wcAK');
INSERT INTO discussions (user_id,parent_id,subject,content) VALUES
(1, 0, 'axum中文网', 'AXUM中文网(axum.rs)为你提供了企业级Web开发中所需要的大部分知识'),
(2, 1, 'RE: axum中文网', '从基础知识到企业级项目的开发,都有完整的系列教程'),
(3, 1, 'RE: axum中文网', '更难得的是,除了文字教程,我们还录制了配套的视频教程,方便你以多种形式进行学习'),
(5, 0, 'RPC:实现Rust和Go进行跨语言调用', '本专题将讨论如何使用gRPC实现Rust和Go语言之间的跨语言调用'),
(4, 0, 'axum使用SeaORM', '本专题将带你体验 SeaORM 和 axum 开发'),
(5, 5, 'SeaORM简介', 'SeaORM 是一个关系型 ORM,用于帮助你像使用动态语言那样,在 Rust 中构建 Web 服务'),
(3, 5, '使用 SeaORM 查询数据', '本章我们将讨论如何使用 SeaORM 进行查询:查询条件、分页、查询单条记录等');