PostgreSQL
Trang này hướng dẫn cấu hình PostgreSQL cho ReputeCast: cơ sở dữ liệu, người dùng, kết nối và migration lược đồ. ReputeCast lưu mọi thứ trong PostgreSQL, kể cả hàng đợi tác vụ, và không cần extension nào.
Trước khi bắt đầu
Phần tiêu đề “Trước khi bắt đầu”- PostgreSQL 16, 17 hoặc 18, tự quản lý hoặc do một nhà cung cấp đám mây vận hành.
- Một tài khoản quản trị trên máy chủ đó (ví dụ
postgres) để tạo cơ sở dữ liệu và các role. - Stack Docker Compose đã chạy sẵn PostgreSQL 18 với superuser
reputecast, tự tạo mọi thứ dưới đây; trang này dành cho mọi cơ sở dữ liệu khác.
Tạo cơ sở dữ liệu
Phần tiêu đề “Tạo cơ sở dữ liệu”-
Với tài khoản quản trị, tạo người dùng của ứng dụng, cơ sở dữ liệu của người dùng đó và role mà phân khúc SQL chạy dưới quyền:
setup.sql CREATE ROLE reputecast LOGIN PASSWORD 'change-me';CREATE DATABASE reputecast OWNER reputecast;CREATE ROLE reputecast_segments NOLOGIN;GRANT reputecast_segments TO reputecast;Hãy tạo
reputecast_segmentsngay bây giờ, trước migration đầu tiên: xem phân khúc SQL. -
Trỏ ReputeCast đến cơ sở dữ liệu bằng
database.url(REPUTECAST_DATABASE__URL, hoặcDATABASE_URL):postgres://reputecast:[email protected]:5432/reputecast?sslmode=require- Dùng
sslmode=require(hoặcverify-fullvới CA của nhà cung cấp) khi cơ sở dữ liệu nằm trên máy khác; chỉ dùngsslmode=disabletrên cùng máy chủ hoặc trong một network Docker riêng. - Mã hóa phần trăm (percent-encode) các ký tự như
@,:và/trong mật khẩu, hoặc chọn mật khẩu không chứa chúng.
- Dùng
-
Chạy migration và tạo Chủ sở hữu đầu tiên bằng
reputecast install(Docker image làm cả hai việc này khi khởi động).
PostgreSQL được quản lý
Phần tiêu đề “PostgreSQL được quản lý”Cơ sở dữ liệu trên đám mây thường cấp cho bạn một tài khoản quản trị không phải superuser. ReputeCast vẫn hoạt động với tài khoản đó:
- Các migration không tạo extension nào và chỉ cần quyền sở hữu cơ sở dữ liệu.
- Tạo
reputecast_segmentscần đặc quyềnCREATEROLE. Nếu người dùng của ứng dụng không có đặc quyền này, hãy tạo role bằng tài khoản quản trị trước lần khởi động đầu tiên (bước 1 ở trên); nếu không, ReputeCast vẫn cài đặt bình thường nhưng phân khúc SQL sẽ bị tắt.
Chọn kích thước pool kết nối
Phần tiêu đề “Chọn kích thước pool kết nối”Mỗi tiến trình ReputeCast mở pool riêng với tối đa database.max_conns kết nối (mặc định 20). Các lệnh dòng lệnh mở
thêm vài kết nối trong lúc chạy (migrate và install 4, user 2). Hãy giữ tổng số dưới max_connections của
PostgreSQL (mặc định 100), chừa chỗ cho các công cụ của riêng bạn:
| Tiến trình | Số kết nối tối đa |
|---|---|
Một serve (mọi vai trò), pool mặc định |
20 |
Ba serve --role=web,ingest và một worker |
4 × 20 = 80 |
Hãy giảm database.max_conns cho mỗi tiến trình, hoặc tăng max_connections, khi bạn
thêm tiến trình.
Phân khúc SQL
Phần tiêu đề “Phân khúc SQL”Phân khúc SQL chạy câu SELECT của thành viên dưới role reputecast_segments, một role tự nó
không đọc được gì, bên trong một transaction chỉ đọc có statement timeout. Khi thiếu role này, trình tạo phân khúc báo
rằng phân khúc SQL đang bị tắt trên cơ sở dữ liệu này.
Các migration thiết lập phân khúc SQL khi role tồn tại và người dùng của ứng dụng là thành viên của role đó. Hãy tạo
role bằng các lệnh mà ReputeCast in ra, thay <app user> bằng người dùng trong database.url:
CREATE ROLE reputecast_segments NOLOGIN;GRANT reputecast_segments TO <app user>;-
Trước lần khởi động đầu tiên (khuyên dùng): chạy các lệnh này, rồi cài đặt ReputeCast. Không cần làm gì thêm.
-
Trên cơ sở dữ liệu đã chạy migration, chỉ chạy
reputecast migrate upthì chưa đủ: migration tạo segment runner (00151_segment_runner.sql) đã được ghi nhận là đã chạy. Sau hai lệnh trên, hãy chạy câu lệnh của migration đó một lần với người dùng của ứng dụng, rồi khởi động lại mọi tiến trình ReputeCast (mỗi tiến trình chỉ kiểm tra runner một lần, khi lần đầu cần đến nó):Với người dùng của ứng dụng (psql -U reputecast -d reputecast) DO $$BEGINIF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'reputecast_segments') THENRAISE NOTICE 'reputecast_segments role missing: SQL segments stay disabled';RETURN;END IF;IF NOT pg_has_role(current_user, 'reputecast_segments', 'MEMBER') THENRAISE NOTICE '% is not a member of reputecast_segments: SQL segments stay disabled', current_user;RETURN;END IF;BEGINCREATE SCHEMA IF NOT EXISTS reputecast_sql;EXECUTE $create$CREATE OR REPLACE FUNCTION reputecast_sql.segment_ids(query text) RETURNS SETOF uuidLANGUAGE plpgsql SECURITY DEFINERSET search_path = pg_temp, pg_catalogAS $fn$BEGINRETURN QUERY EXECUTE 'SELECT s.id::uuid FROM (' || query || ') s';END$fn$$create$;GRANT USAGE, CREATE ON SCHEMA reputecast_sql TO reputecast_segments;ALTER FUNCTION reputecast_sql.segment_ids(text) OWNER TO reputecast_segments;REVOKE CREATE ON SCHEMA reputecast_sql FROM reputecast_segments;REVOKE ALL ON FUNCTION reputecast_sql.segment_ids(text) FROM PUBLIC;EXECUTE format('GRANT EXECUTE ON FUNCTION reputecast_sql.segment_ids(text) TO %I', current_user);EXCEPTION WHEN insufficient_privilege THENRAISE NOTICE 'could not set up reputecast_sql.segment_ids: SQL segments stay disabled';END;END;$$;
Kiểm tra kết quả: SELECT to_regprocedure('reputecast_sql.segment_ids(text)') IS NOT NULL; trả về t khi phân khúc
SQL dùng được. Role này dùng chung cho mọi cơ sở dữ liệu trên máy chủ, và pg_dump không bao gồm role: hãy tạo role
trên máy chủ mới trước khi khôi phục bản sao lưu.
Migration
Phần tiêu đề “Migration”Tệp nhị phân mang theo mọi migration lược đồ: của chính ReputeCast, rồi đến của hàng đợi tác vụ.
reputecast migrate upáp dụng các migration đang chờ và inDatabase is up to date.;reputecast installvàserve --auto-migrate(mặc định của Docker image) cũng làm như vậy khi khởi động.reputecast migrate statusliệt kê từng migration cùng ngày áp dụng hoặcpending.reputecast migrate downchỉ hoàn tác migration ReputeCast mới nhất. Muốn lùi xa hơn, hãy khôi phục một bản sao lưu.- Một tiến trình khởi động không có
--auto-migratetrên cơ sở dữ liệu còn migration đang chờ sẽ ghi logdatabase has pending migrations; run `reputecast migrate up` or pass --auto-migratevà vẫn tiếp tục chạy.
Kiểm tra kết quả
Phần tiêu đề “Kiểm tra kết quả”/readyztrả vềready; nó trả về503 database unavailablekhi một lần ping cơ sở dữ liệu mất hơn 2 giây.reputecast migrate statuskhông có dòngpendingnào.- Trong Người đăng ký, rồi Phân khúc, một phân khúc ở chế độ SQL đếm được liên hệ.
Khắc phục sự cố
Phần tiêu đề “Khắc phục sự cố”connect to postgres: …khi khởi động: sai host, mật khẩu hoặcsslmode; hãy thử cùng URL bằngpsql.FATAL: sorry, too many clients already: tổng các pool vượt quámax_connections; hãy giảmdatabase.max_conns.- Phân khúc SQL vẫn tắt sau khi bạn đã tạo role: cơ sở dữ liệu đã chạy migration từ trước; hãy chạy câu lệnh trong phân khúc SQL rồi khởi động lại ReputeCast.
Liên quan
Phần tiêu đề “Liên quan”- Sao lưu và khôi phục
- Tham chiếu cấu hình:
database.urlvàdatabase.max_conns. - Nâng cấp ReputeCast: migration khi nâng cấp.