Citus 11.0 đã chính thức phát hành! Đây là plugin mở rộng PostgreSQL cho phép mở rộng cơ sở dữ liệu theo dạng phân tán. Với Citus, bạn có thể tạo bảng phân tán hoặc sao chép tự động qua cụm các nút PostgreSQL. Phiên bản 11.0 mang đến nhiều cải tiến quan trọng giúp nâng cao khả năng mở rộng.
Tính năng nổi bật nhất của Citus 11.0 là hỗ trợ truy vấn phân tán từ bất kỳ nút nào trong cụm nhờ cơ chế đồng bộ schema và metadata tự động. Chúng tôi đã chia sẻ chi tiết về phiên bản thử nghiệm trong bài viết trước, nhưng đây là tin vui cho người dùng phiên bản mã nguồn mở - toàn bộ tính năng giờ đây đều được công khai.
- https://mp.weixin.qq.com/s/AAUG6FxVnVUNPekx70bXog
- https://www.citusdata.com/blog/2022/03/26/test-drive-citus-11-beta-for-postgres/
Trong các phiên bản trước, chúng tôi thường phát hành hai phiên bản: mã nguồn mở và phiên bản doanh nghiệp. Tuy nhiên, Citus 11.0 chỉ có duy nhất một phiên bản vì toàn bộ tính năng đã được mở mã nguồn hoàn toàn!
Điều này cho phép bạn:
-
Cân bằng phân mảnh mà không làm chậm ghi dữ liệu
-
Quản lý vai trò trong toàn cụm
-
Phân tách khách hàng thành các phân mảnh riêng biệt Tất cả đều được xây dựng trên nền tảng cải tiến lớn của Citus 11.0: khả năng truy vấn phân tán từ mọi nút.
-
https://docs.citusdata.com/en/latest/admin_guide/cluster_management.html?highlight=rebalance#rebalance-shards-without-downtime
Trong bài viết này, chúng tôi sẽ tập trung vào:
- Các tính năng doanh nghiệp được chuyển sang mã nguồn mở
- Truy vấn phân tán từ mọi nút
- Tính năng thử nghiệm ẩn: trigger!
Để xem toàn bộ cập nhật, hãy truy cập trang tổng quan phiên bản 11.0.
Các tính năng doanh nghiệp khác đã được mở mã nguồn
Khi chuyển hướng từ phần mềm doanh nghiệp sang nhà cung cấp dịch vụ đám mây, chúng tôi đã tích hợp toàn bộ phát triển mới vào dự án mã nguồn mở Citus trên GitHub. Việc mở mã nguồn giúp người dùng tương tác trực tiếp với cộng đồng, kiểm tra mã nguồn và tránh bị khóa hệ thống.
- https://www.citusdata.com/blog/2016/03/24/citus-unforks-goes-open-source/
- https://docs.microsoft.com/azure/postgresql/hyperscale/
- https://github.com/citusdata/citus
Phiên bản 10 đã công khai tính năng cân bằng phân mảnh, cho phép mở rộng cụm bằng cách di chuyển dữ liệu đến các nút mới.
Citus 11.0 tiếp tục mở rộng mã nguồn với:
- Cân bằng phân mảnh không làm chậm ghi (dùng replication logic)
- Hỗ trợ đa người dùng (phân quyền, an ninh cấp hàng)
- Phân tách khách hàng đa thuê bao
- Kiểm soát xác thực chi tiết giữa các nút
- Tối ưu tải dữ liệu
- https://docs.citusdata.com/en/stable/admin_guide/cluster_management.html#rebalance-shards-without-downtime
- https://www.citusdata.com/updates/v11-0/#multi-user
- https://docs.citusdata.com/en/stable/admin_guide/cluster_management.html#tenant-isolation
- https://docs.citusdata.com/en/stable/admin_guide/cluster_management.html#connection-management
- https://docs.citusdata.com/en/stable/develop/api_metadata.html#connection-pooling-credentials
- https://docs.citusdata.com/en/stable/performance/performance_tuning.html#scaling-out-data-ingestion
Tính năng cân bằng phân mảnh không làm chậm ghi
Đây là tính năng mã nguồn mở mới nhất: di chuyển phân mảnh không gây nghẽn ghi. Trong phiên bản 10, việc di chuyển phân mảnh sẽ chặn các thao tác ghi. Citus 11 sử dụng replication logic để di chuyển dữ liệu, chỉ gây ra độ trễ ngắn khi mở rộng cụm. Yêu cầu tiên quyết là tất cả bảng PostgreSQL phải có khóa chính.
Bây giờ, tính năng cân bằng phân mảnh không làm chậm ghi đã được công khai, bạn sẽ nhận được trải nghiệm đầy đủ khi chạy Citus trên môi trường quản lý.
Truy vấn phân tán từ mọi nút
Citus 11 giới thiệu tính năng đồng bộ schema và metadata tự động.
Trong kiến trúc Citus tiêu chuẩn, ứng dụng truy vấn qua nút coordinator. Tuy nhiên, khi cần xử lý lượng lớn hoặc truy vấn phức tạp, Citus 11 cho phép xử lý trên bất kỳ nút nào nhờ đồng bộ metadata.
Điều này có nghĩa:
- Không cần thay đổi ứng dụng: Tiếp tục định tuyến truy vấn như trước
- Ứng dụng dữ liệu nặng có thể cân bằng tải qua các nút worker
- https://www.citusdata.com/blog/2022/03/26/test-drive-citus-11-beta-for-postgres/#section2
Cập nhật lên Citus 11
Quy trình nâng cấp đơn giản:
- Cập nhật gói và khởi động lại PostgreSQL
- Thực thi lệnh trên tất cả nút:
ALTER EXTENSION citus UPDATE;
- Sau khi nâng cấp, kết nối đến coordinator và chạy:
CALL citus_finish_citus_upgrade();
Lệnh thứ hai là mới trong Citus 11, đảm bảo metadata đồng bộ trên toàn cụm. Đề xuất gọi hàm này sau mỗi lần nâng cấp Citus.
Các tính năng bị loại bỏ
-
Phân mảnh lỗi thời (shard placement invalidation): Không còn hỗ trợ
-
Bảng phân tán kiểu append: Chỉ đọc từ Citus 11.0
-
Bảng phân tán cstore_fdw: Không khuyến khích, nên chuyển sang phương pháp cột
-
https://www.citusdata.com/blog/2021/03/06/citus-10-columnar-compression-for-postgres/
Vị trí phân mảnh của tôi ở đâu?
Trong Citus 11, khi kết nối đến bất kỳ nút worker nào, bạn sẽ thấy:
\d
Danh sách quan hệ
┌────────┬──────────────┬───────┬───────┐
│ Schema │ Tên │ Kiểu │ Chủ sở hữu │
├────────┼──────────────┼───────┼───────┤
│ public │ citus_tables │ view │ marco │
│ public │ ref │ table │ marco │
│ public │ test │ table │ marco │
└────────┴──────────────┴───────┴───────┘
So với trước đây:
\d
Danh sách quan hệ
┌────────┬──────────────┬───────┬───────┐
│ Schema │ Tên │ Kiểu │ Chủ sở hữu │
├────────┼──────────────┼───────┼───────┤
│ public │ citus_tables │ view │ marco │
│ public │ ref_102040 │ table │ marco │
│ public │ test_102105 │ table │ marco │
│ public │ test_102107 │ table │ marco │
└────────┴──────────────┴───────┴───────┘
Chúng tôi ẩn phân mảnh khỏi danh sách mặc định để tránh nhầm lẫn. Nếu cần, bạn có thể bật hiển thị bằng:
-- Chỉ hiển thị cho pgAdmin và psql:
set citus.show_shards_for_app_name_prefixes to 'pgAdmin,psql';
-- Hiển thị cho tất cả ứng dụng:
set citus.show_shards_for_app_name_prefixes to '*';
Tính năng thử nghiệm: Trigger trên bảng phân tán
Trigger PostgreSQL giờ đây có thể hoạt động trên các nút worker nhờ đồng bộ metadata. Tuy nhiên, để tránh vấn đề giao dịch, trigger chỉ nên truy cập các bảng cùng vị trí.
Ví dụ:
CREATE TABLE data (key text primary key, value jsonb);
SELECT create_distributed_table('data','key');
CREATE TABLE data_audit (operation text, key text, new_value jsonb, change_time timestamptz default now());
SELECT create_distributed_table('data_audit','key', colocate_with := 'data');
CREATE OR REPLACE FUNCTION audit_trigger()
RETURNS trigger
AS $$
DECLARE
BEGIN
INSERT INTO data_audit VALUES (TG_OP, Coalesce(OLD.key, NEW.key), NEW.value);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
SET citus.enable_unsafe_triggers TO on;
CREATE TRIGGER data_audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON data
FOR EACH ROW EXECUTE FUNCTION audit_trigger();
Việc sử dụng trigger trên Citus giúp giảm số lượng truy vấn phân tán và tăng khả năng mở rộng tổng thể.