182 ngày PostgreSQL
Tuần 0: Nền tảng SQL và Thiết kế Cơ sở dữ liệu
Ngày 1
Cơ sở dữ liệu quan hệ là gì:
Khái niệm bảng, hàng, cột, kiểu dữ liệu, khóa chính/khóa ngoại.
Sự khác biệt giữa CSDL quan hệ (RDBMS) và NoSQL, khi nào chọn loại nào.
Ngôn ngữ SQL: DDL, DML, DQL, DCL, TCL.
Bài tập:
Liệt kê 5 hệ quản trị CSDL quan hệ phổ biến và so sánh ngắn gọn.
Vẽ một bảng ví dụ (khách hàng) và xác định khóa chính.
Ngày 2
Thiết kế dữ liệu và mô hình ER:
Thực thể, thuộc tính, mối quan hệ (1-1, 1-n, n-n).
Vẽ sơ đồ Entity-Relationship Diagram (ERD).
Chuẩn hóa dữ liệu (1NF, 2NF, 3NF, BCNF) và khi nào nên phi chuẩn hóa (denormalization).
Bài tập:
Thiết kế ERD cho hệ thống bán hàng đơn giản (khách hàng, sản phẩm, đơn hàng).
Chuẩn hóa một bảng dữ liệu bị trùng lặp thông tin về dạng 3NF.
Ngày 3
Câu lệnh SELECT cơ bản:
SELECT, WHERE, ORDER BY, LIMIT/OFFSET, DISTINCT.
Các toán tử so sánh, logic, IS NULL, IN, BETWEEN, LIKE.
Alias (AS) cho cột và bảng.
Bài tập:
Viết các truy vấn lọc, sắp xếp, phân trang trên một bảng mẫu.
Viết truy vấn tìm các bản ghi có giá trị NULL và xử lý bằng COALESCE.
Ngày 4
JOIN và tổng hợp dữ liệu cơ bản:
INNER JOIN, LEFT/RIGHT JOIN cơ bản (sẽ đào sâu ở Ngày sau).
GROUP BY, HAVING, các hàm tổng hợp COUNT/SUM/AVG/MIN/MAX.
Sự khác nhau giữa WHERE và HAVING.
Bài tập:
Viết truy vấn tổng doanh thu theo khách hàng bằng JOIN + GROUP BY.
Viết truy vấn đếm số đơn hàng theo trạng thái và lọc bằng HAVING.
Ngày 5
DDL/DML và ràng buộc dữ liệu:
CREATE TABLE, ALTER TABLE, DROP TABLE.
INSERT, UPDATE, DELETE, TRUNCATE.
Các ràng buộc: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL, DEFAULT.
Bài tập:
Tạo schema hoàn chỉnh cho ERD đã thiết kế ở Ngày 2, kèm ràng buộc khóa ngoại.
Thêm/xóa/sửa cột bằng ALTER TABLE trên bảng đã tạo.
Ngày 6
Tư duy giao dịch (transaction) và tính toàn vẹn dữ liệu (giới thiệu):
Vì sao cần transaction, ví dụ chuyển khoản ngân hàng.
Khái niệm ACID ở mức tổng quan (sẽ đào sâu ở Ngày 11 và Ngày 41).
Các lỗi phổ biến của người mới: quên WHERE trong UPDATE/DELETE, N+1 query.
Bài tập:
Viết ví dụ minh họa vì sao thiếu transaction có thể làm mất tính nhất quán dữ liệu.
Liệt kê 5 sai lầm SQL phổ biến của người mới và cách tránh.
Ngày 7
Ôn tập Tuần 0:
Tổng hợp SQL cơ bản, thiết kế ERD, chuẩn hóa.
Chuẩn bị công cụ: cài Git, một trình soạn thảo (VS Code), Docker (sẽ dùng ở các tuần sau).
Bài tập tổng hợp: từ ERD tới schema hoàn chỉnh, insert dữ liệu mẫu, viết 5 truy vấn báo cáo.
Tuần 1: Làm quen PostgreSQL và cài đặt
Ngày 8
Giới thiệu về PostgreSQL:
PostgreSQL là gì? Ưu/nhược điểm so với MySQL, SQL Server, Oracle, và các CSDL "distributed SQL" hiện đại (CockroachDB, YugabyteDB).
Lịch sử phát triển PostgreSQL (từ Ingres/Postgres tới PostgreSQL hiện đại).
Các tính năng nổi bật (ACID, MVCC, khả năng mở rộng, hỗ trợ nhiều kiểu dữ liệu, extension ecosystem).
Chu kỳ phát hành: một major version mỗi năm, hỗ trợ 5 năm; tình trạng hiện tại PostgreSQL 17 (2024), PostgreSQL 18 (9/2025, AIO, virtual generated columns, uuidv7()), PostgreSQL 19 đang trong giai đoạn beta.
Kiến trúc PostgreSQL:
Tổng quan kiến trúc client-server, process-per-connection.
Các tiến trình chính (postmaster, backend, bgwriter, wal writer, autovacuum, checkpointer, logical replication launcher).
Cấu trúc bộ nhớ chia sẻ (shared buffers, WAL buffers) và bộ nhớ theo tiến trình (work_mem).
Bài tập:
So sánh PostgreSQL với MySQL/SQL Server và ít nhất một CSDL distributed SQL hiện đại.
Tìm hiểu lịch sử các phiên bản chính, tóm tắt 3 tính năng nổi bật nhất của PostgreSQL 17 và 18.
Vẽ sơ đồ kiến trúc PostgreSQL và giải thích chức năng từng thành phần.
Ngày 9
Cài đặt PostgreSQL:
Cài từ mã nguồn, từ gói nhị phân (apt/yum/brew), qua PGDG repository (bản mới nhất chính thức).
Cài đặt bằng Docker/Docker Compose (cách phổ biến nhất để học và dev hiện nay).
Yêu cầu hệ thống, lựa chọn phiên bản (nên học trên bản mới nhất được hỗ trợ, ví dụ 17/18).
Hướng dẫn cài trên Windows, macOS, Linux.
Bài tập:
Cài PostgreSQL bằng Docker Compose với volume lưu trữ dữ liệu bền vững.
Cài PostgreSQL từ mã nguồn trên một máy ảo Linux.
Tìm hiểu các tùy chọn cấu hình trong postgresql.conf và pg_hba.conf.
Ngày 10
Cấu hình PostgreSQL:
Các tham số quan trọng (listen_addresses, port, max_connections, shared_buffers, work_mem, maintenance_work_mem, wal_level, max_wal_size, archive_mode).
Phương thức xác thực (trust, password, md5, scram-sha-256, ident, peer) và pg_hba.conf.
Cấu hình logging (log_destination, logging_collector, log_directory, log_rotation_age/size, log_min_duration_statement).
Bài tập:
Điều chỉnh tham số để tối ưu cho một ứng dụng web tải trung bình.
Cấu hình xác thực SCRAM-SHA-256 (mặc định khuyến nghị hiện nay thay vì md5).
Thiết lập ghi log ra file có xoay vòng (log rotation).
Ngày 11
Kết nối đến PostgreSQL:
Dùng psql, các tham số kết nối, connection string/URI (postgresql://user:pass@host:port/db).
Các lệnh psql cơ bản (\l, \dt, \du, \d, \df, \ef, \timing, \x).
Công cụ GUI: pgAdmin, DBeaver, TablePlus.
Kiểu dữ liệu cơ bản:
Số (integer, bigint, smallint, serial/identity, numeric).
Ký tự (char, varchar, text).
Thời gian (timestamp, timestamptz, date, time, interval).
Bài tập:
Kết nối bằng psql, thực hiện các lệnh liệt kê database/bảng/view/function.
Dùng pgAdmin hoặc DBeaver để thao tác cơ bản.
Tạo bảng với nhiều kiểu dữ liệu khác nhau, chèn dữ liệu.
Ngày 12
Kiểu dữ liệu:
Boolean, enum, mảng (array), JSON/JSONB, UUID (và uuidv7() mới trong PostgreSQL 18 - sắp xếp theo thời gian, tốt cho index hơn UUID v4).
Hình học (point, line, polygon), mạng (inet, cidr, macaddr), tiền tệ (money).
Generated columns: STORED (từ PG12) và virtual generated columns (mới trong PostgreSQL 18, tính toán tại thời điểm query thay vì lưu trữ).
Domain (kiểu dữ liệu tùy biến với ràng buộc) và composite type.
Bài tập:
Tạo bảng sản phẩm với cột enum trạng thái và cột mảng màu sắc.
Dùng các hàm/toán tử JSON và JSONB để truy vấn dữ liệu bán cấu trúc.
Tạo cột generated (stored) tính tổng tiền = số lượng * đơn giá, và một cột virtual generated column tương đương, so sánh hành vi.
Tạo domain kiểu email có ràng buộc CHECK định dạng.
Ngày 13
Toán tử:
Số học, so sánh, logic, chuỗi (||, LIKE, ILIKE, SIMILAR TO), pattern matching (
, ~*, !, !~*).Phạm vi (BETWEEN, IN), bitwise (&, |, #, ~, <<, >>).
Toán tử JSON/JSONB (->, ->>, #>, @>, ?, ?|, ?&).
Bài tập:
Viết truy vấn dùng đa dạng toán tử trên dữ liệu mẫu.
Tìm hiểu thứ tự ưu tiên toán tử, dùng ngoặc đơn kiểm soát thứ tự.
Dùng toán tử phạm vi và bitwise trong các truy vấn thực tế (ví dụ permission bitmask).
Ngày 14
Index:
Khái niệm index, lợi ích và chi phí (write amplification).
Các loại index (B-tree, Hash, GiST, GIN, BRIN, SP-GiST).
Tạo/quản lý index (CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX, DROP INDEX).
Dùng EXPLAIN để xem PostgreSQL có dùng index hay không.
PostgreSQL 17 cải thiện B-tree cho tìm kiếm nhiều giá trị (IN list) hiệu quả hơn.
Bài tập:
Tạo index trên các cột thường dùng trong WHERE, đo hiệu năng trước/sau.
So sánh CREATE INDEX thường và CREATE INDEX CONCURRENTLY trên bảng lớn.
Dùng pg_stat_user_indexes để tìm index không được sử dụng (dead index).
Tuần 2: Views, Functions, Triggers, MERGE và Quản lý Transaction
Ngày 15
Views:
Khái niệm, lợi ích, CREATE VIEW / CREATE OR REPLACE VIEW / DROP VIEW.
Materialized view, updatable view, security_barrier view.
Dùng view để đơn giản hóa truy vấn và bảo mật dữ liệu.
Bài tập:
Tạo view tổng hợp dữ liệu từ nhiều bảng (ví dụ doanh thu theo tháng).
Tạo view lọc dữ liệu theo người dùng cụ thể.
Tạo materialized view và thiết lập REFRESH MATERIALIZED VIEW CONCURRENTLY.
Ngày 16
Functions:
Khái niệm, các loại (scalar, aggregate, table, window function).
CREATE FUNCTION: tham số, kiểu trả về, thân hàm, IMMUTABLE/STABLE/VOLATILE.
Ngôn ngữ thủ tục (PL/pgSQL, PL/Python, PL/Perl).
Bài tập:
Viết scalar function tính tuổi từ ngày sinh.
Viết aggregate function tính trung bình cộng tùy chỉnh.
Viết table function trả về danh sách sản phẩm theo khoảng giá.
Ngày 17
Triggers:
Khái niệm, loại trigger (BEFORE, AFTER, INSTEAD OF), sự kiện (INSERT, UPDATE, DELETE, TRUNCATE).
CREATE TRIGGER, transition tables (REFERENCING OLD TABLE/NEW TABLE cho statement-level trigger).
Dùng trigger để validate dữ liệu, đồng bộ bảng, audit log.
Bài tập:
Viết trigger tự động cập nhật updated_at.
Viết trigger validate dữ liệu trước khi insert/update.
Viết trigger đồng bộ dữ liệu giữa hai bảng và một trigger audit log dùng transition table.
Ngày 18
Quản lý Transaction:
Khái niệm transaction, thuộc tính ACID.
BEGIN, COMMIT, ROLLBACK, SAVEPOINT.
Mức cô lập (READ COMMITTED, REPEATABLE READ, SERIALIZABLE) và các hiện tượng dirty read/non-repeatable read/phantom read.
Deadlock: nguyên nhân, cách PostgreSQL phát hiện và xử lý.
Bài tập:
Viết đoạn PL/pgSQL cho transaction chuyển tiền giữa hai tài khoản.
Thử nghiệm các mức cô lập khác nhau và quan sát kết quả bằng 2 phiên psql song song.
Tạo tình huống deadlock có chủ đích và quan sát log PostgreSQL.
Ngày 19
UPSERT và MERGE:
INSERT ... ON CONFLICT DO UPDATE/DO NOTHING (upsert cổ điển).
MERGE statement (chuẩn SQL, có từ PostgreSQL 15, mở rộng RETURNING trong PostgreSQL 18) để gộp INSERT/UPDATE/DELETE theo điều kiện khớp.
RETURNING clause để lấy lại dữ liệu vừa thay đổi.
Bài tập:
Viết upsert bằng ON CONFLICT cho bảng tồn kho.
Viết MERGE đồng bộ bảng đích từ bảng nguồn (nếu khớp thì UPDATE, không khớp thì INSERT).
Dùng RETURNING để lấy id vừa insert mà không cần truy vấn lại.
Ngày 20
Tìm kiếm toàn văn (Full Text Search):
Khái niệm, thành phần (document, query, rank).
Kiểu dữ liệu/toán tử (tsvector, tsquery, @@, @>, <@), generated column tsvector.
Cấu hình (ngôn ngữ, từ điển, parser), so sánh với pg_trgm và extension trigram cho tìm kiếm gần đúng.
Bài tập:
Tạo bảng bài báo, dùng full text search tìm bài chứa từ khóa.
Viết truy vấn tìm bài chứa cả "PostgreSQL" và "performance", có xếp hạng ts_rank.
Tạo index GIN trên cột tsvector để tăng tốc tìm kiếm.
Ngày 21
Phân quyền (Authorization) và Quản lý database:
Đối tượng phân quyền (bảng, view, function, schema), loại quyền, GRANT/REVOKE.
Role mặc định (pg_read_all_data, pg_write_all_data, pg_signal_backend).
CREATE/ALTER/DROP DATABASE, template database (template0, template1).
Bài tập:
Tạo user mới, cấp quyền SELECT trên một bảng cụ thể theo nguyên tắc least privilege.
Tạo schema mới, cấp quyền CREATE cho một role.
Tạo database mới từ template1 và đổi chủ sở hữu.
Tuần 3: Sao lưu và Phục hồi, High Availability, Load Balancing, Replication
Ngày 22
Sao lưu và phục hồi (Backup and Restore):
Loại sao lưu (physical, logical), công cụ chuẩn (pg_dump, pg_dumpall, pg_basebackup, pg_restore).
Incremental backup với pg_basebackup (mới từ PostgreSQL 17, dùng WAL summarization) để giảm thời gian/dung lượng backup.
Point-in-time recovery (PITR) bằng WAL archiving.
Công cụ backup cấp production: pgBackRest và Barman (parallel backup/restore, retention policy, incremental/differential, kiểm tra tính toàn vẹn).
Bài tập:
Thực hiện backup đầy đủ và một incremental backup bằng pg_basebackup.
Cài đặt pgBackRest hoặc Barman, cấu hình retention policy và thực hiện PITR.
Diễn tập khôi phục toàn bộ cluster từ backup + WAL archive, đo RTO/RPO thực tế.
Ngày 23
High Availability (HA):
Khái niệm HA, RTO/RPO, so sánh các giải pháp (Patroni, repmgr, pg_auto_failover).
Distributed consensus store cho failover (etcd, Consul, ZooKeeper) - vai trò trong Patroni.
HA trên Kubernetes: giới thiệu CloudNativePG và Zalando Postgres Operator.
Bài tập:
Thiết lập một cụm PostgreSQL HA dùng Patroni + etcd trên Docker Compose.
Thử triển khai một cluster PostgreSQL bằng CloudNativePG trên Kubernetes (minikube/kind).
So sánh Patroni, repmgr, pg_auto_failover và CloudNativePG theo tiêu chí độ phức tạp/độ tin cậy/hệ sinh thái.
Ngày 24
Load Balancing và Connection Pooling:
Kỹ thuật load balancing (round robin, least connections), tách read/write traffic.
Công cụ: HAProxy, Pgpool-II.
Connection pooling chuyên sâu: PgBouncer (session/transaction/statement pooling mode), so sánh với PgCat và Odyssey (pooler thế hệ mới, hỗ trợ sharding).
Bài tập:
Cài đặt và cấu hình HAProxy để route traffic tới primary/replica.
Cài PgBouncer ở transaction pooling mode, đo tác động lên throughput với pgbench.
So sánh PgBouncer với PgCat trên cùng một workload benchmark.
Ngày 25
Replication:
Physical replication (streaming, file-based log shipping) và Logical replication (publisher/subscriber/publication/subscription).
Logical replication (PostgreSQL 16-18): row filters, column lists, failover của logical slot (sync_replication_slots), pg_upgrade giữ nguyên logical replication slot khi upgrade major version (từ PostgreSQL 17).
Xử lý xung đột trong logical replication.
Bài tập:
Thiết lập physical (streaming) replication giữa hai node.
Thiết lập logical replication có row filter và column list.
Thử nghiệm pg_upgrade một cụm có logical replication và kiểm tra slot vẫn hoạt động sau khi upgrade.
Ngày 26
Monitoring (giới thiệu):
Chỉ số cần giám sát (CPU, memory, disk, network, database activity).
Công cụ (pg_stat_activity, pg_stat_statements, pgBadger).
pg_stat_io (từ PostgreSQL 16) - thống kê I/O chi tiết theo backend type/context/object, quan trọng hơn khi PostgreSQL 18 có AIO subsystem mới.
Bài tập:
Dùng pg_stat_activity giám sát hoạt động đang diễn ra.
Dùng pg_stat_statements xác định truy vấn tốn tài nguyên nhất.
Dùng pg_stat_io để phân tích tỉ lệ hit/miss buffer theo loại I/O.
Ngày 27
Logging và Bảo mật cơ bản:
Loại log, cấu hình logging, phân tích log bằng pgBadger.
Mối đe dọa bảo mật, biện pháp cơ bản (cập nhật phiên bản, mật khẩu mạnh, phân quyền chặt).
Cấu hình firewall bảo vệ PostgreSQL, mã hóa dữ liệu nhạy cảm (giới thiệu, đào sâu ở Tuần 15).
Bài tập:
Cấu hình PostgreSQL ghi log ra syslog từ xa, xoay vòng log.
Dùng pgBadger phân tích log, tìm vấn đề hiệu suất.
Cài đặt firewall (ufw/iptables) chỉ cho phép IP tin cậy kết nối tới port 5432.
Ngày 28
Ôn tập và thực hành:
Xem lại kiến thức Tuần 3 (backup, HA, replication, monitoring, bảo mật cơ bản).
Bài tập tổng hợp: dựng một cụm HA có backup tự động (pgBackRest) + logical replication cho reporting + PgBouncer trước ứng dụng.
Tuần 4: Production Tooling - Container, Kubernetes và Quản lý Schema
Ngày 29
PostgreSQL trong Docker:
Image chính thức postgres, biến môi trường, volume, healthcheck.
Docker Compose cho môi trường dev/test nhiều service (app + PostgreSQL + PgBouncer).
Multi-stage build cho ứng dụng dùng PostgreSQL.
Bài tập:
Viết docker-compose.yml gồm PostgreSQL + PgBouncer + ứng dụng mẫu.
Cấu hình healthcheck và volume backup tự động trong Compose.
Viết Dockerfile tùy biến image PostgreSQL với extension cài sẵn (ví dụ pgvector).
Ngày 30
PostgreSQL trên Kubernetes:
StatefulSet, PersistentVolumeClaim, khái niệm Operator pattern.
CloudNativePG: kiến trúc, tính năng (backup tự động lên S3, failover, rolling upgrade).
So sánh CloudNativePG, Zalando Postgres Operator, Crunchy PGO.
Bài tập:
Triển khai cluster PostgreSQL 3 node bằng CloudNativePG trên kind/minikube.
Cấu hình backup tự động lên object storage (MinIO giả lập S3).
Thử nghiệm switchover và rolling upgrade minor version không downtime.
Ngày 31
Quản lý phiên bản schema (Schema Migration):
Tại sao cần migration tool thay vì chạy SQL tay.
Công cụ: Flyway, Liquibase, Sqitch, và Alembic (Python/SQLAlchemy).
Chiến lược migration an toàn: forward-only, tránh breaking change, expand-contract pattern.
Bài tập:
Thiết lập Flyway cho một project, viết migration tạo bảng + seed dữ liệu.
Thực hành expand-contract: đổi tên cột không downtime qua nhiều bước migration.
So sánh Flyway/Liquibase/Sqitch theo tiêu chí ngôn ngữ, versioning, rollback.
Ngày 32
Zero-downtime schema changes:
ALTER TABLE nào cần ACCESS EXCLUSIVE lock, cách tránh khóa bảng lớn.
Thêm cột NOT NULL an toàn (thêm cột nullable → backfill → thêm constraint NOT VALID → VALIDATE CONSTRAINT).
Đổi kiểu dữ liệu cột lớn không downtime bằng bảng shadow + trigger hoặc logical replication.
Bài tập:
Thêm cột NOT NULL vào bảng hàng triệu dòng mà không khóa bảng lâu.
Thêm foreign key bằng NOT VALID + VALIDATE CONSTRAINT để tránh full table scan chặn write.
Lên kế hoạch đổi kiểu dữ liệu một cột PK mà không downtime.
Ngày 33
Kiểm thử cơ sở dữ liệu (Database Testing):
pgTAP: viết unit test cho schema, function, trigger, RLS policy.
Testing container (Testcontainers) để chạy test tích hợp với PostgreSQL thật.
Seed data và fixture cho môi trường test.
Bài tập:
Cài pgTAP, viết test kiểm tra cấu trúc bảng và ràng buộc.
Viết test cho một function PL/pgSQL bằng pgTAP.
Viết test tích hợp bằng Testcontainers gọi ứng dụng thật với PostgreSQL trong container.
Ngày 34
Load testing và Benchmark:
pgbench: kịch bản TPC-B mặc định, custom script.
k6 hoặc Locust để load test tầng ứng dụng gọi PostgreSQL, mô phỏng traffic thực.
Đọc kết quả benchmark: TPS, latency percentile (p50/p95/p99).
Bài tập:
Chạy pgbench với custom script mô phỏng workload đọc/ghi thực tế.
Viết kịch bản k6 gọi API có truy vấn PostgreSQL, đo p95/p99 latency.
So sánh hiệu năng trước/sau khi thêm index hoặc bật connection pooling.
Ngày 35
Ôn tập và thực hành:
Xem lại Docker/Kubernetes, migration tool, zero-downtime change, testing, benchmark.
Bài tập tổng hợp: đóng gói một ứng dụng mẫu có CI chạy Flyway migration + pgTAP test + pgbench benchmark tự động.
Tuần 5: Performance Tuning, PostgreSQL Internals, và Extensibility
Ngày 36
Performance Tuning:
EXPLAIN và EXPLAIN ANALYZE: đọc cost, rows, width, actual time, buffers.
pg_stat_activity, pg_stat_statements, pg_stat_user_tables/pg_statio_user_tables.
Bài tập:
Phân tích một truy vấn phức tạp bằng EXPLAIN (ANALYZE, BUFFERS), tìm cách tối ưu.
Dùng pg_stat_statements xác định truy vấn tốn tài nguyên nhất và tối ưu.
Tìm hiểu thêm công cụ giám sát hiệu suất khác (pgBadger).
Ngày 37
Performance Tuning (tiếp):
Tham số hiệu suất quan trọng (shared_buffers, work_mem, effective_cache_size, maintenance_work_mem, max_wal_size, wal_buffers).
Caching (shared buffers vs OS cache), memory overcommit, huge pages.
Bài tập:
Điều chỉnh tham số cấu hình cho ứng dụng thực tế của bạn.
Thử nghiệm nhiều giá trị shared_buffers/work_mem để tìm giá trị tối ưu.
Cấu hình huge pages trên Linux và đo tác động.
Ngày 38
PostgreSQL Internals:
Quá trình xử lý truy vấn: parser, analyzer, rewriter, planner, optimizer, executor.
Loại kế hoạch truy vấn (seq scan, index scan, bitmap scan, nested loop/hash/merge join).
System catalogs (pg_class, pg_attribute, pg_index, pg_database, pg_tablespace).
Bài tập:
Dùng EXPLAIN để hiểu cách PostgreSQL thực thi truy vấn.
Truy vấn system catalogs lấy thông tin bảng/cột/index.
Tìm hiểu cấu trúc dữ liệu nội bộ (heap, index, buffer pool).
Ngày 39
PostgreSQL Internals (tiếp):
Write-Ahead Logging (WAL): cấu trúc, WAL archiving.
MVCC: Transaction ID (XID), Command ID (CID), snapshot, visibility rules.
Bài tập:
Tìm hiểu tham số WAL (wal_level, max_wal_size, archive_mode) và tác động.
Thử các mức cô lập transaction khác nhau, quan sát hành vi MVCC.
Tìm hiểu công cụ giám sát WAL (pg_stat_archiver, pg_stat_wal_receiver).
Ngày 40
Extensibility:
User-defined functions bằng PL/pgSQL, PL/Python, PL/Perl, PL/Tcl.
User-defined types: định nghĩa toán tử và hàm cho kiểu dữ liệu mới.
Bài tập:
Viết hàm PL/pgSQL tính lãi suất kép.
Viết aggregate function tính trung vị.
Tạo kiểu dữ liệu số phức, định nghĩa toán tử số học cho nó.
Ngày 41
Extensibility (tiếp):
Extension: CREATE/ALTER/DROP EXTENSION, extension phổ biến (PostGIS, pg_trgm, hstore, pgvector).
Foreign Data Wrapper (FDW): postgres_fdw, mysql_fdw, oracle_fdw, file_fdw.
Bài tập:
Cài PostGIS, làm việc với dữ liệu không gian.
Cài pg_trgm, thực hiện tìm kiếm gần đúng.
Tạo FDW truy cập dữ liệu từ một PostgreSQL/MySQL khác.
Ngày 42
Logical Replication (đào sâu cấu trúc):
So sánh logical vs physical replication.
Publication, subscription, logical replication slot.
Cấu hình và giám sát (pg_stat_replication, pg_stat_subscription).
Bài tập:
Thiết lập logical replication giữa hai node.
Tạo publication cho một bảng cụ thể với row filter.
Giám sát bằng pg_stat_replication và pg_stat_subscription_stats.
Tuần 6: Advanced SQL, Window Functions, CTE, MERGE và Stored Procedures
Ngày 43
Advanced SQL - Joins và Subqueries:
INNER/LEFT/RIGHT/FULL JOIN, CROSS JOIN, NATURAL JOIN, ON vs USING.
Subquery (correlated/non-correlated) trong WHERE/FROM/SELECT, LATERAL JOIN.
Bài tập:
Viết truy vấn INNER JOIN lấy khách hàng và đơn hàng.
Viết truy vấn LEFT JOIN lấy tất cả khách hàng kể cả chưa đặt hàng.
Viết truy vấn dùng LATERAL JOIN lấy top-N sản phẩm mỗi danh mục.
Ngày 44
Window Functions:
RANK, DENSE_RANK, ROW_NUMBER, NTILE.
SUM/AVG/MIN/MAX/COUNT dạng window, FIRST_VALUE/LAST_VALUE/LAG/LEAD.
Cú pháp OVER, PARTITION BY, ORDER BY, frame clause (ROWS/RANGE BETWEEN).
Bài tập:
Xếp hạng nhân viên theo doanh số bằng RANK.
Tính tổng doanh thu tích lũy theo tháng (running total).
Tính thay đổi doanh số so với tháng trước bằng LAG, và trung bình động 3 tháng bằng frame clause.
Ngày 45
Common Table Expressions (CTE):
Cú pháp WITH, CTE đệ quy (WITH RECURSIVE).
Chia nhỏ truy vấn phức tạp; lưu ý CTE không còn tối ưu hóa (materialize) mặc định từ PostgreSQL 12.
Bài tập:
Tính tổng doanh thu theo danh mục sản phẩm bằng CTE.
Tìm tất cả cấp quản lý của một nhân viên bằng CTE đệ quy.
Tạo dãy Fibonacci và một truy vấn duyệt cây thư mục bằng CTE đệ quy.
Ngày 46
MERGE và Stored Procedures:
MERGE với nhiều điều kiện WHEN MATCHED/NOT MATCHED, MERGE ... RETURNING (PostgreSQL 18).
CREATE PROCEDURE, tham số, biến, điều khiển luồng, transaction control bên trong procedure (COMMIT/ROLLBACK, khác function).
Bài tập:
Viết MERGE đồng bộ hai bảng tồn kho với nhiều nhánh điều kiện.
Viết stored procedure chèn nhân viên mới với transaction control.
Viết procedure tính tổng doanh thu theo danh mục và commit theo từng batch.
Ngày 47
Cursors:
Khái niệm, loại cursor (implicit, explicit), DECLARE/OPEN/FETCH/CLOSE.
Khi nào dùng cursor và khi nào nên tránh (thường set-based tốt hơn).
Bài tập:
Duyệt bảng nhân viên bằng cursor và in thông tin từng dòng.
Viết procedure dùng cursor cập nhật lương theo phòng ban theo batch.
Viết lại bài 2 theo cách set-based (không cursor) và so sánh hiệu năng.
Ngày 48
Error Handling:
BEGIN/EXCEPTION/END, SQLSTATE, SQLERRM, RAISE.
Thiết kế xử lý lỗi cho ứng dụng production (retry logic, idempotency).
Bài tập:
Xử lý ngoại lệ khi insert bản ghi trùng lặp.
Viết procedure cập nhật lương xử lý trường hợp nhân viên không tồn tại.
Thiết kế một hàm idempotent an toàn khi gọi lại nhiều lần (ví dụ xử lý webhook).
Ngày 49
Ôn tập và thực hành:
Xem lại window function, CTE, MERGE, procedure, cursor, error handling.
Bài tập tổng hợp: xây báo cáo doanh thu phân tầng dùng CTE đệ quy + window function + MERGE để đồng bộ bảng tổng hợp.
Tuần 7: Performance Tuning, Security, và PostgreSQL Internals
Ngày 50
Indexing:
Chiến lược lập index đa cột (thứ tự cột quan trọng), covering index (INCLUDE clause), index-only scan.
Partial index, expression index.
Bài tập:
Tạo index đa cột tối ưu cho một tập truy vấn thường dùng.
Tạo covering index (INCLUDE) để đạt index-only scan.
Tạo partial index cho truy vấn chỉ lọc theo trạng thái "active".
Ngày 51
Table Partitioning:
Range/List/Hash partitioning, cách chọn chiến lược.
Partition pruning, tạo/quản lý bảng con tự động (pg_partman).
Bài tập:
Tạo bảng partition theo range (tháng) cho dữ liệu bán hàng.
Tạo bảng partition theo list (quốc gia) cho dữ liệu khách hàng.
Cài pg_partman để tự động tạo/xóa partition theo thời gian.
Ngày 52
Security - Row/Column Level Security:
Row Level Security (RLS): CREATE POLICY, USING, WITH CHECK, FORCE ROW LEVEL SECURITY.
Column-level privilege (GRANT trên cột cụ thể) và kỹ thuật ẩn cột qua view.
Bài tập:
Tạo policy RLS chỉ cho phép người dùng xem dữ liệu phòng ban của mình.
Cấp quyền SELECT chỉ trên một số cột cụ thể cho một role.
Kết hợp RLS với multi-tenant SaaS (mỗi tenant chỉ thấy dữ liệu của mình).
Ngày 53
PostgreSQL Internals - Buffer Management & Background Processes:
Buffer pool, thuật toán thay thế trang (clock sweep).
Tiến trình nền: background writer, checkpointer, autovacuum, và vai trò từng tiến trình.
Bài tập:
Tìm hiểu tham số buffer pool (shared_buffers, effective_cache_size) và tác động.
Dùng pg_buffercache giám sát buffer pool.
Cấu hình tiến trình nền để tối ưu hiệu suất/độ tin cậy.
Ngày 54
Query Planning and Optimization:
Các bước lập kế hoạch (parse, rewrite, plan, optimize), chiến lược tối ưu (join order, index selection).
Genetic Query Optimizer (geqo) cho truy vấn nhiều join.
Bài tập:
Dùng EXPLAIN hiểu cách PostgreSQL tối ưu truy vấn.
Thử nghiệm tùy chọn geqo và quan sát tác động.
Áp dụng kỹ thuật viết truy vấn hiệu quả để giúp planner ra kế hoạch tốt.
Ngày 55
Transaction Management và Concurrency Control:
Giai đoạn transaction (begin, active, prepared, committed, aborted), pg_xact.
Vấn đề đồng thời (dirty/non-repeatable/phantom read), MVCC trong PostgreSQL.
Bài tập:
Giám sát transaction đang hoạt động bằng pg_stat_activity/pg_locks.
Thử nghiệm các mức cô lập, quan sát hành vi.
Tìm hiểu kỹ thuật tránh/xử lý deadlock trong PostgreSQL.
Ngày 56
Ôn tập và thực hành:
Xem lại indexing, partitioning, RLS, internals, concurrency.
Bài tập tổng hợp: thiết kế bảng lớn có partition + index tối ưu + RLS cho hệ thống multi-tenant.
Tuần 8: Procedural Languages, Server Programming Interface, và Logical Decoding
Ngày 57
PL/pgSQL:
Cấu trúc DECLARE/BEGIN/END, kiểu dữ liệu (scalar, composite, record, refcursor).
Cấu trúc điều khiển (IF, CASE, LOOP, FOR, WHILE), xử lý ngoại lệ.
Bài tập:
Viết hàm PL/pgSQL tính tổng hai số.
Viết thủ tục cập nhật thông tin nhân viên.
Viết trigger PL/pgSQL kiểm tra tính hợp lệ dữ liệu.
Ngày 58
PL/Python:
- Cài đặt/cấu hình, cấu trúc cơ bản, dùng thư viện Python, truy cập dữ liệu PostgreSQL.
Bài tập:
Viết hàm PL/Python tính giai thừa.
Viết hàm PL/Python gửi email thông báo (qua mock/test server).
Tìm hiểu thư viện Python phổ biến dùng trong PL/Python (NumPy, pandas).
Ngày 59
Server Programming Interface (SPI):
Giới thiệu SPI, hàm cơ bản (SPI_connect, SPI_exec, SPI_fetchrow, SPI_finish).
Xử lý kết quả, quản lý bộ nhớ trong SPI.
Bài tập:
Viết hàm C dùng SPI lấy danh sách bảng trong một schema.
Viết hàm C dùng SPI chèn bản ghi mới.
Tìm hiểu hàm SPI (SPI_prepare, SPI_execp).
Ngày 60
Logical Decoding:
Khái niệm, lợi ích (CDC - Change Data Capture, audit, tích hợp hệ thống).
Output plugin, logical replication slot, pg_recvlogical, wal2json.
Bài tập:
Thiết lập logical decoding trên một server.
Dùng pg_recvlogical nhận thay đổi, ghi vào file.
So sánh output plugin test_decoding và wal2json cho một use case CDC thực tế.
Ngày 61
CDC production với Debezium:
Kiến trúc Debezium + Kafka Connect dùng logical decoding của PostgreSQL.
So sánh CDC qua logical decoding với trigger-based CDC.
Bài tập:
Cài đặt Debezium connector cho PostgreSQL, stream thay đổi bảng ra Kafka topic.
Xử lý trường hợp schema evolution (thêm/xóa cột) khi dùng Debezium.
So sánh độ trễ, chi phí vận hành giữa CDC và logical replication thuần.
Ngày 62
Background Worker Processes:
- Khái niệm, ví dụ (autovacuum, logical replication apply worker), tạo/quản lý.
Bài tập:
Tìm hiểu các background worker có sẵn.
Tạo background worker đơn giản in thông báo log mỗi phút.
Tìm hiểu cách dùng background worker cho tác vụ phức tạp (sao lưu, đồng bộ dữ liệu).
Ngày 63
Ôn tập và thực hành:
Xem lại PL/pgSQL, PL/Python, SPI, logical decoding, CDC, background worker.
Bài tập tổng hợp: xây pipeline CDC từ PostgreSQL sang một hệ thống phân tích dữ liệu.
Tuần 9: Query Optimization, System Catalogs, và Frontend/Backend Protocol
Ngày 64
Cost-based Optimization:
- Ước tính chi phí kế hoạch truy vấn, tham số ảnh hưởng (cpu_tuple_cost, random_page_cost, seq_page_cost).
Bài tập:
Xem chi tiết chi phí kế hoạch truy vấn bằng EXPLAIN.
Điều chỉnh tham số chi phí, quan sát tác động lên kế hoạch chọn.
Áp dụng chiến lược viết truy vấn hiệu quả.
Ngày 65
Genetic Query Optimizer (GEQO):
- Hoạt động, cấu hình (enable_geqo, geqo_threshold, geqo_effort).
Bài tập:
Kích hoạt GEQO, thử nghiệm với truy vấn nhiều join.
Điều chỉnh tham số GEQO để tối ưu hiệu suất.
Tìm trường hợp sử dụng GEQO hiệu quả nhất.
Ngày 66
System Catalogs:
- pg_class, pg_attribute, pg_index, pg_database, pg_tablespace; view hệ thống (pg_tables, pg_indexes, pg_views).
Bài tập:
Truy vấn danh sách bảng trong một schema.
Truy vấn danh sách index trên một bảng.
Tạo view tùy chỉnh hiển thị thông tin bảng và index.
Ngày 67
Frontend/Backend Protocol:
Giao thức TCP/IP, loại tin nhắn (StartupMessage, Authentication, Query, Parse, Bind, Execute).
Wire protocol 3.2 (cập nhật đầu tiên từ 2003, PostgreSQL 18) và sslnegotiation=direct để giảm round-trip TLS.
Bài tập:
Dùng Wireshark quan sát tin nhắn trao đổi giữa client và server.
Tìm hiểu định dạng chi tiết của các loại tin nhắn.
So sánh thời gian bắt tay TLS truyền thống với sslnegotiation=direct.
Ngày 68
PostgreSQL Coding Conventions và đóng góp mã nguồn mở:
- Quy tắc đặt tên, định dạng mã nguồn, quy trình gửi patch cho cộng đồng PostgreSQL.
Bài tập:
Đọc và tìm hiểu PostgreSQL Coding Conventions.
Xem xét mã nguồn PostgreSQL, xác định cách quy tắc được áp dụng.
Viết một đoạn C đơn giản tuân thủ coding convention.
Ngày 69
Xác thực hiện đại: OAuth và SSO:
OAuth 2.0 client authentication (mới trong PostgreSQL 18) - xác thực qua identity provider bên ngoài.
So sánh với LDAP/Kerberos/SCRAM (sẽ đào sâu ở Tuần 15).
Bài tập:
Cấu hình OAuth authentication cho PostgreSQL 18 với một identity provider thử nghiệm.
So sánh trải nghiệm vận hành OAuth với SCRAM-SHA-256.
Đánh giá rủi ro bảo mật khi dùng OAuth cho kết nối database trực tiếp từ ứng dụng.
Ngày 70
Ôn tập và thực hành:
Xem lại query optimization, system catalogs, protocol, xác thực hiện đại.
Bài tập tổng hợp: viết báo cáo phân tích kế hoạch truy vấn chi tiết cho 3 truy vấn chậm nhất trong hệ thống thật.
Tuần 10: Native Language Support, Procedural Language Handler, FDW và Migration Tooling
Ngày 71
Native Language Support (NLS):
Locale, encoding, collation; hàm NLS (to_char, to_date, to_timestamp, to_number).
ICU collation (khuyến nghị hiện nay thay vì libc collation cho tính nhất quán đa nền tảng).
Bài tập:
Đổi locale database sang tiếng Việt.
Dùng hàm NLS định dạng ngày tháng/số theo locale người dùng.
Tạo cột dùng ICU collation và so sánh kết quả sắp xếp với libc collation.
Ngày 72
Writing a Procedural Language Handler:
- Thành phần (call handler, inline handler, validator), các bước tạo handler.
Bài tập:
Tìm hiểu các PL handler có sẵn.
Nghiên cứu mã nguồn PL/pgSQL handler.
Thử viết PL handler đơn giản cho một ngôn ngữ kịch bản (ví dụ Lua).
Ngày 73
Writing a Foreign Data Wrapper (FDW):
- Thành phần FDW, các bước tạo, tạo server/user mapping/foreign table.
Bài tập:
Tìm hiểu các FDW có sẵn.
Nghiên cứu mã nguồn file_fdw.
Thử viết FDW đơn giản đọc dữ liệu từ file CSV.
Ngày 74
Data migration giữa các hệ CSDL:
Công cụ: pgloader (từ MySQL/SQLite/CSV sang PostgreSQL), AWS DMS, ora2pg (từ Oracle).
Chiến lược migration production: dual-write, backfill, cutover.
Bài tập:
Dùng pgloader migrate một database MySQL mẫu sang PostgreSQL.
Lên kế hoạch dual-write + backfill + cutover cho một migration không downtime.
Kiểm tra tính toàn vẹn dữ liệu sau migration (checksum, row count).
Ngày 75
ORM và raw SQL trong production:
Khi nào dùng ORM (SQLAlchemy, Prisma, TypeORM, Hibernate) và khi nào nên viết raw SQL/dùng query builder.
Vấn đề N+1 query, lazy loading, connection leak khi dùng ORM sai cách.
Bài tập:
Viết cùng một truy vấn phức tạp bằng ORM và bằng raw SQL, so sánh kế hoạch truy vấn sinh ra.
Phát hiện và sửa lỗi N+1 query trong một đoạn code ORM mẫu.
Thiết lập connection pool đúng cách cho ORM kết hợp PgBouncer.
Ngày 76
GEQO và FDW (thực hành tổng hợp):
- Kết hợp FDW với truy vấn liên CSDL (federated query), đánh giá hiệu năng.
Bài tập:
Thử nghiệm truy vấn liên CSDL qua postgres_fdw giữa hai instance.
Đánh giá hiệu năng FDW so với ETL định kỳ.
Tìm trường hợp nên/không nên dùng FDW trong kiến trúc production.
Ngày 77
Ôn tập và thực hành:
Xem lại NLS, PL handler, FDW, migration tooling, ORM.
Bài tập tổng hợp: migrate một ứng dụng từ MySQL sang PostgreSQL không downtime, kèm kiểm tra toàn vẹn dữ liệu.
Tuần 11: PostgreSQL Internals - Storage, Lock Manager, Transaction Manager, Checkpoint
Ngày 78
Hệ thống lưu trữ:
- Heap (page, tuple, item pointer), các loại index, Buffer Pool.
Bài tập:
Tìm hiểu tham số lưu trữ (fillfactor, autovacuum_vacuum_scale_factor).
Dùng pg_filedump xem cấu trúc file heap.
Tìm kỹ thuật giảm thiểu bloat trong heap.
Ngày 79
Lock Manager:
- Loại khóa (shared, exclusive, access exclusive), cấp độ khóa, deadlock.
Bài tập:
Dùng pg_locks xem khóa đang giữ.
Tạo tình huống deadlock, quan sát cách PostgreSQL giải quyết.
Tìm kỹ thuật tránh deadlock trong ứng dụng.
Ngày 80
Transaction Manager:
- Giai đoạn transaction, WAL, MVCC.
Bài tập:
Tìm hiểu tham số liên quan transaction (default_transaction_isolation).
Dùng pg_xact xem thông tin transaction đang hoạt động.
Tìm hiểu cơ chế snapshot isolation.
Ngày 81
Quá trình checkpoint:
- Vai trò checkpoint, loại checkpoint, cấu hình (checkpoint_timeout, checkpoint_completion_target, max_wal_size).
Bài tập:
Tìm hiểu tác động checkpoint đến hiệu suất.
Điều chỉnh tham số checkpoint để tối ưu hiệu suất/độ tin cậy.
Giám sát checkpoint bằng pg_stat_bgwriter/pg_stat_checkpointer (PostgreSQL 17 tách riêng thống kê checkpointer).
Ngày 82
Performance Tuning - JIT và Parallel Query:
Just-in-Time Compilation (LLVM), cấu hình jit_above_cost.
Parallel Query: max_parallel_workers, max_parallel_workers_per_gather.
Bài tập:
Kích hoạt JIT, đánh giá tác động hiệu suất.
Thử nghiệm parallel query với truy vấn lớn.
Tìm hạn chế/lưu ý khi dùng JIT và parallel query.
Ngày 83
Connection Pooling và Query Tuning:
- PgBouncer/pgbouncer-rr, kỹ thuật viết truy vấn hiệu quả, pg_hint_plan.
Bài tập:
Cấu hình PgBouncer quản lý pool kết nối.
Thử nghiệm kỹ thuật viết truy vấn khác nhau, so sánh hiệu suất.
Dùng pg_hint_plan hướng dẫn PostgreSQL dùng index cụ thể.
Ngày 84
Ôn tập và thực hành:
Xem lại storage, lock, transaction, checkpoint, JIT/parallel query, pooling.
Bài tập tổng hợp: điều tra và tối ưu một truy vấn chậm end-to-end từ EXPLAIN đến cấu hình hệ thống.
Tuần 12: Replication, Monitoring, và Security
Ngày 85
Logical Replication:
- Giải quyết xung đột, row/column filter, dùng logical replication cho hệ thống báo cáo/phân tích.
Bài tập:
Tìm chiến lược giải quyết xung đột phù hợp cho ứng dụng của bạn.
Dùng row/column filter lọc dữ liệu sao chép.
Thiết lập logical replication từ production sang reporting database.
Ngày 86
Monitoring - pg_stat_activity và pg_stat_statements:
- Giám sát truy vấn đang chạy, wait event; thống kê SQL đã thực thi.
Bài tập:
Tìm truy vấn chạy lâu và nguyên nhân gây chậm.
Xác định truy vấn gọi nhiều nhất và tối ưu.
Tìm hiểu công cụ giám sát khác (pgBadger).
Ngày 87
Monitoring - pg_stat_database, pg_stat_bgwriter, pg_stat_user_tables:
- Thống kê hoạt động database, background writer, đọc/ghi bảng.
Bài tập:
Giám sát hoạt động tổng thể database bằng pg_stat_database.
Đánh giá hiệu quả checkpoint bằng pg_stat_bgwriter.
Xác định bảng có hoạt động đọc/ghi nhiều nhất.
Ngày 88
Security - Mã hóa dữ liệu:
Transparent Data Encryption (TDE - trạng thái hiện tại trong PostgreSQL core và giải pháp bên thứ ba), Column-Level Encryption (pgcrypto), Client-Side Encryption.
Mã hóa dữ liệu khi lưu trữ (at rest) qua encryption ở tầng filesystem/storage (LUKS, cloud KMS) khi core chưa hỗ trợ TDE đầy đủ.
Bài tập:
Tìm hiểu công cụ mã hóa dữ liệu (pgcrypto, OpenSSL).
Mã hóa một cột nhạy cảm (ví dụ số thẻ) bằng pgcrypto.
So sánh mã hóa tại tầng ứng dụng, tầng cột, và tầng đĩa/volume (cloud KMS).
Ngày 89
Security - RBAC:
- Phân quyền theo vai trò thay vì từng người dùng, cấp quyền cho role trên đối tượng, gán người dùng vào role.
Bài tập:
Thiết lập hệ thống RBAC đơn giản.
Tìm hiểu best practice bảo mật PostgreSQL.
Thiết kế RBAC cho một ứng dụng SaaS nhiều team.
Ngày 90
Security - Audit Logging:
- pgAudit: log các câu lệnh SQL, kết nối, đăng nhập; cấu hình và phân tích log.
Bài tập:
Cài đặt và cấu hình pgAudit.
Xem xét log pgAudit, tìm hiểu sự kiện được ghi.
Tích hợp log pgAudit vào hệ thống phân tích tập trung (ELK/Loki).
Ngày 91
Ôn tập và thực hành:
Xem lại logical replication, monitoring, mã hóa, RBAC, audit logging.
Bài tập tổng hợp: xây dựng checklist bảo mật + monitoring cho một hệ thống production.
Tuần 13: PostgreSQL Internals - WAL, Buffer, Executor, và Resource Tuning
Ngày 92
WAL Internals:
- Cấu trúc WAL record, loại WAL record, quá trình WAL replay.
Bài tập:
Dùng pg_waldump xem nội dung WAL record.
Tìm hiểu công cụ phân tích WAL.
Tìm tham số ảnh hưởng WAL (wal_compression, wal_buffers, wal_writer_delay).
Ngày 93
Buffer Manager Internals:
- Cấu trúc buffer pool, thuật toán thay thế trang (LRU, clock sweep, 2Q).
Bài tập:
Tìm tham số ảnh hưởng buffer pool.
Dùng pg_buffercache phân tích hoạt động buffer pool.
Tìm kỹ thuật cải thiện hiệu suất buffer pool.
Ngày 94
Query Executor Internals:
- Giai đoạn thực thi truy vấn, cấu trúc dữ liệu (tuplestore, hash table, sort buffer).
Bài tập:
Dùng EXPLAIN ANALYZE xem chi tiết thời gian từng giai đoạn.
Tìm kỹ thuật tối ưu truy vấn.
Giám sát hiệu suất executor bằng pg_stat_activity/pg_stat_statements.
Ngày 95
Memory Tuning:
- Thành phần bộ nhớ chính, kỹ thuật tuning, giám sát sử dụng bộ nhớ.
Bài tập:
Điều chỉnh tham số bộ nhớ cho ứng dụng của bạn.
Giám sát sử dụng bộ nhớ PostgreSQL.
Tìm công cụ khác giám sát/phân tích bộ nhớ.
Ngày 96
Disk và I/O Tuning:
Cấu hình filesystem (ext4, XFS, ZFS), tối ưu I/O (RAID, SSD/NVMe, alignment).
Asynchronous I/O (AIO) subsystem mới trong PostgreSQL 18 - tham số io_method (worker/io_uring trên Linux), tăng tốc đọc tuần tự tới 3 lần.
Bài tập:
Cấu hình filesystem khuyến nghị cho PostgreSQL.
Giám sát I/O bằng iostat và pg_stat_io.
Bật io_method = io_uring (nếu hệ điều hành hỗ trợ) và đo tác động hiệu năng so với worker mode.
Ngày 97
Network Tuning:
- Tối ưu tham số TCP/IP, PgBouncer/pgbouncer-rr, giám sát lưu lượng mạng.
Bài tập:
Tìm tham số TCP/IP ảnh hưởng hiệu suất PostgreSQL.
Cấu hình PgBouncer quản lý pool kết nối.
Giám sát lưu lượng mạng client-server.
Ngày 98
Ôn tập và thực hành:
Xem lại WAL, buffer, executor, memory/disk/network tuning, AIO.
Bài tập tổng hợp: tối ưu toàn diện một instance production theo checklist tài nguyên (CPU/memory/disk/network).
Tuần 14: PostgreSQL Extensibility, High Availability, và Cloud
Ngày 99
Custom Data Types và Custom Operators:
- Các bước tạo kiểu dữ liệu tùy chỉnh, toán tử tùy chỉnh.
Bài tập:
Tạo kiểu dữ liệu biểu diễn số phức.
Tạo kiểu dữ liệu biểu diễn khoảng thời gian (time range).
Tạo toán tử tính khoảng cách giữa hai điểm.
Ngày 100
Custom Functions, Aggregates và Access Methods:
- Hàm/aggregate tùy chỉnh, khái niệm access method (heap, B-tree, GiST, GIN, BRIN).
Bài tập:
Viết hàm tính số Fibonacci thứ n.
Viết aggregate tính trung bình nhân.
Nghiên cứu mã nguồn access method heap.
Ngày 101
Table Storage Formats:
- Heap, append-optimized, columnar; ưu nhược điểm; extension cung cấp storage khác (Citus columnar, ZomboDB).
Bài tập:
So sánh hiệu suất bảng heap và bảng append-optimized/columnar.
Tìm hiểu extension cung cấp table storage khác.
Chọn storage format phù hợp cho một use case phân tích dữ liệu.
Ngày 102
High Availability - Cluster Management:
- Patroni: cài đặt, cấu hình, tích hợp etcd/Consul.
Bài tập:
Thiết lập cluster HA dùng Patroni.
Thử nghiệm failover và switchover.
Tìm hiểu tính năng của Patroni (backup automation, monitoring).
Ngày 103
PostgreSQL Cloud - tổng quan:
Amazon RDS/Aurora PostgreSQL, Azure Database for PostgreSQL, Google Cloud SQL/AlloyDB.
Managed service vs self-hosted: ưu nhược điểm, chi phí, giới hạn (extension whitelist, superuser).
Bài tập:
Tạo instance PostgreSQL trên một cloud provider.
So sánh tính năng/giá cả các dịch vụ managed PostgreSQL.
Đánh giá khi nào nên self-host thay vì dùng managed service.
Ngày 104
Serverless Postgres:
- Neon, Aurora Serverless v2: kiến trúc tách compute/storage, autoscaling, branching database (Neon).
Bài tập:
Tạo một dự án thử nghiệm trên Neon, thử tính năng database branching cho môi trường dev/preview.
So sánh chi phí/hiệu năng serverless Postgres với instance cố định cho workload biến thiên mạnh.
Đánh giá giới hạn cold-start của serverless Postgres cho ứng dụng cần độ trễ thấp.
Ngày 105
Ôn tập và thực hành:
Xem lại custom type/operator/function, access method, storage format, HA, cloud, serverless.
Bài tập tổng hợp: chọn kiến trúc triển khai (self-host HA vs managed vs serverless) cho 3 kịch bản khác nhau và giải thích lựa chọn.
Tuần 15: PostgreSQL Security và Cluster Management
Ngày 106
LDAP Authentication:
- Tích hợp LDAP, cấu hình pg_hba.conf, tùy chọn (ldapserver, ldapbasedn, ldapbinddn).
Bài tập:
Thiết lập LDAP authentication cho PostgreSQL.
Tạo người dùng LDAP, cấp quyền truy cập PostgreSQL.
Tìm vấn đề bảo mật liên quan LDAP authentication.
Ngày 107
Kerberos và GSSAPI Authentication:
- Tích hợp Kerberos/GSSAPI, cấu hình pg_hba.conf.
Bài tập:
Thiết lập Kerberos authentication.
Tạo người dùng Kerberos, cấp quyền truy cập.
Thiết lập GSSAPI authentication.
Ngày 108
PGP Encryption và quản lý khóa:
- Hàm PGP (pgp_sym_encrypt/decrypt, pgp_pub_encrypt/decrypt), quản lý khóa, so sánh với KMS bên ngoài (AWS KMS, HashiCorp Vault).
Bài tập:
Mã hóa/giải mã dữ liệu bằng hàm PGP.
Mã hóa một cột bằng khóa PGP.
Thiết kế kiến trúc quản lý khóa dùng Vault thay vì lưu khóa trong database.
Ngày 109
Security Auditing:
- pgAudit cấu hình chi tiết, phân tích log, tích hợp SIEM.
Bài tập:
Cấu hình pgAudit ghi log chi tiết theo role.
Phân tích log tìm hoạt động bất thường.
Tích hợp log vào ELK stack hoặc SIEM.
Ngày 110
PostgreSQL Cluster Management - pg_auto_failover:
- Cài đặt, cấu hình, quản lý cluster.
Bài tập:
Thiết lập cluster dùng pg_auto_failover.
Thử nghiệm failover/switchover.
Tìm tính năng (backup automation, monitoring).
Ngày 111
PostgreSQL Cluster Management - repmgr:
- Cài đặt, cấu hình, quản lý cluster replication.
Bài tập:
Thiết lập cluster replication dùng repmgr.
Thử nghiệm failover/switchover.
Tìm tính năng (node monitoring, automatic failover).
Ngày 112
Ôn tập và thực hành:
Xem lại LDAP/Kerberos/GSSAPI, PGP, audit, pg_auto_failover, repmgr.
Bài tập tổng hợp: viết security hardening checklist đầy đủ cho một cluster production.
Tuần 16: PostgreSQL Internals và PostgreSQL trên Cloud
Ngày 113
Transaction ID Wraparound:
- Khái niệm XID, giới hạn, wraparound và cách PostgreSQL xử lý.
Bài tập:
Tìm tham số liên quan (autovacuum_freeze_max_age, vacuum_freeze_min_age).
Giám sát transaction có nguy cơ gây wraparound.
Lập kế hoạch vacuuming ngăn wraparound.
Ngày 114
Hot Standby Internals:
- Khái niệm, thành phần (WAL sender, WAL receiver, apply process).
Bài tập:
Thiết lập hệ thống hot standby.
Giám sát bằng pg_stat_replication.
Tối ưu hiệu suất hot standby.
Ngày 115
Background Worker Internals (đào sâu):
- autovacuum, background writer, checkpointer, WAL writer, logical replication worker.
Bài tập:
Tìm tham số cấu hình từng background worker.
Giám sát hoạt động bằng pg_stat_activity.
Tối ưu hiệu suất background worker.
Ngày 116
PostgreSQL Cloud - Amazon RDS/Aurora:
- Tính năng (automated provisioning, backup, patching, HA), tùy chọn cấu hình.
Bài tập:
Tạo instance PostgreSQL trên RDS.
Cấu hình tham số instance.
Giám sát bằng CloudWatch.
Ngày 117
PostgreSQL Cloud - Azure Database for PostgreSQL:
- Tính năng, pricing tier, quản lý và giám sát.
Bài tập:
Tạo instance trên Azure Database for PostgreSQL.
Cấu hình tham số instance.
Giám sát bằng Azure Monitor.
Ngày 118
PostgreSQL Cloud - Google Cloud SQL/AlloyDB:
- Tính năng, tùy chọn cấu hình, quản lý và giám sát.
Bài tập:
Tạo instance trên Google Cloud SQL.
Cấu hình tham số instance.
Giám sát bằng Google Cloud Monitoring.
Ngày 119
Ôn tập và thực hành:
Xem lại XID wraparound, hot standby, background worker, cloud providers.
Bài tập tổng hợp: viết runbook xử lý sự cố "database gần wraparound" trong production.
Tuần 17: PostgreSQL Extensions, Advanced Security Hardening, và Data Warehousing
Ngày 120
PostGIS:
- Kiểu dữ liệu không gian, chỉ mục không gian, hàm không gian.
Bài tập:
Cài PostGIS trên PostgreSQL.
Tạo bảng dữ liệu địa lý, thực hiện truy vấn không gian.
Tìm ứng dụng PostGIS trong GIS, quản lý tài sản, định vị.
Ngày 121
pg_trgm và tìm kiếm gần đúng:
- Toán tử tìm kiếm gần đúng, kết hợp GIN/GiST index để tăng tốc.
Bài tập:
Cài pg_trgm, thực hiện tìm kiếm gần đúng.
Tạo index GIN trigram, đo tốc độ cải thiện.
So sánh pg_trgm với full text search cho use case autocomplete.
Ngày 122
Advanced Security Hardening - SELinux/AppArmor:
- Cấu hình SELinux/AppArmor cho PostgreSQL, so sánh ưu nhược điểm.
Bài tập:
Cấu hình SELinux cho PostgreSQL.
Cấu hình AppArmor cho PostgreSQL.
So sánh SELinux và AppArmor.
Ngày 123
Penetration Testing:
- Công cụ và kỹ thuật (sqlmap, Metasploit), các bước thực hiện.
Bài tập:
Tìm công cụ/kỹ thuật pentest cho PostgreSQL.
Thực hiện pentest đơn giản trên hệ thống thử nghiệm.
Đề xuất biện pháp giảm thiểu rủi ro sau pentest.
Ngày 124
Security Best Practices tổng hợp:
- Mật khẩu mạnh, hạn chế truy cập từ xa, cập nhật phiên bản, mã hóa dữ liệu, giám sát log.
Bài tập:
Đánh giá mức độ bảo mật hệ thống theo best practice.
Đề xuất biện pháp cải thiện.
Tìm hiểu tiêu chuẩn bảo mật liên quan (PCI DSS, HIPAA, SOC 2).
Ngày 125
PostgreSQL for Data Warehousing:
Dimensional modeling, fact/dimension table, tính năng hỗ trợ DW (columnar, parallel query, materialized view).
Công cụ ETL/ELT (Airbyte, dbt, Airflow).
Bài tập:
Thiết kế data warehouse đơn giản cho doanh nghiệp bán lẻ.
Xây dựng data warehouse đó bằng PostgreSQL.
Viết một pipeline dbt transform dữ liệu thô thành bảng fact/dimension.
Ngày 126
Ôn tập và thực hành:
Xem lại PostGIS, pg_trgm, hardening, pentest, best practice, data warehousing.
Bài tập tổng hợp: xây dựng một mini data warehouse có pipeline dbt + kiểm tra bảo mật theo checklist.
Tuần 18: PostgreSQL Internals, PostgreSQL cho Machine Learning và IoT
Ngày 127
Internals cho tối ưu hiệu suất:
- Cây truy vấn, vai trò planner/optimizer, kỹ thuật tối ưu truy vấn (index, join, viết lại truy vấn).
Bài tập:
Phân tích chi tiết thời gian thực thi bằng EXPLAIN ANALYZE.
Dùng pg_hint_plan hướng dẫn kế hoạch truy vấn.
Áp dụng materialized view, CTE, window function để tối ưu.
Ngày 128
Query Execution Internals:
- Node, Path, Plan; loại node (scan, join, materialization).
Bài tập:
Tìm hiểu các loại node và cách hoạt động.
Xem các node trong kế hoạch truy vấn bằng EXPLAIN.
Tìm kỹ thuật tối ưu từng loại node.
Ngày 129
PostgreSQL cho Machine Learning - pgvector:
Cài đặt, lưu trữ/truy vấn vector nhúng, hàm khoảng cách (l2, inner product, cosine).
Index HNSW/IVFFlat cho tìm kiếm vector gần đúng ở quy mô lớn.
Bài tập:
Cài pgvector, tạo bảng chứa vector nhúng.
Tạo index HNSW, so sánh tốc độ/độ chính xác với brute-force.
Xây dựng một hệ tìm kiếm ngữ nghĩa (semantic search) đơn giản bằng pgvector.
Ngày 130
PostgreSQL cho Machine Learning (tiếp) - PL/Python:
- Tích hợp scikit-learn/TensorFlow/PyTorch vào PostgreSQL qua PL/Python.
Bài tập:
Viết hàm PL/Python huấn luyện mô hình hồi quy tuyến tính đơn giản.
Viết hàm PL/Python dự đoán dựa trên mô hình đã huấn luyện.
Đánh giá khi nào nên/không nên chạy ML trực tiếp trong database.
Ngày 131
PostgreSQL cho IoT - TimescaleDB:
- Hypertables, continuous aggregates, compression.
Bài tập:
Cài TimescaleDB.
Tạo hypertable lưu dữ liệu cảm biến IoT.
Thực hiện truy vấn phân tích chuỗi thời gian, thiết lập continuous aggregate.
Ngày 132
PostgreSQL cho IoT (tiếp) - Kafka Integration:
- Kiến trúc Kafka, Kafka Connect kết nối PostgreSQL.
Bài tập:
Tìm hiểu kiến trúc Apache Kafka.
Cấu hình Kafka Connect kết nối PostgreSQL với Kafka.
Xây dựng ứng dụng truyền dữ liệu cảm biến IoT tới PostgreSQL qua Kafka.
Ngày 133
Ôn tập và thực hành:
Xem lại internals, pgvector, PL/Python ML, TimescaleDB, Kafka.
Bài tập tổng hợp: xây dựng pipeline IoT thời gian thực + tìm kiếm ngữ nghĩa bằng pgvector.
Tuần 19: PostgreSQL Internals và Tối ưu hóa Hiệu suất
Ngày 134
Replication Internals:
- Streaming replication, file-based log shipping; WAL sender/receiver, startup process.
Bài tập:
Tìm tham số physical replication (wal_level, max_wal_senders, hot_standby).
Thiết lập streaming replication, kiểm tra failover.
Giám sát bằng pg_stat_replication.
Ngày 135
Concurrency Control Internals:
- MVCC đào sâu, XID/CID/snapshot, visibility rules; Lock Manager đào sâu.
Bài tập:
Tìm tham số ảnh hưởng MVCC.
Dùng pg_locks xem khóa đang giữ.
Tìm kỹ thuật tránh/xử lý deadlock.
Ngày 136
Autovacuum Internals:
- Cơ chế vacuum/analyze, tham số cấu hình, giám sát (pg_stat_progress_vacuum).
Bài tập:
Tìm tác động autovacuum đến hiệu suất.
Điều chỉnh tham số autovacuum.
Giám sát/quản lý autovacuum bằng pg_stat_progress_vacuum.
Ngày 137
Background Writer Internals:
- Cơ chế ghi dirty page, tham số cấu hình, giám sát.
Bài tập:
Tìm tác động background writer đến hiệu suất.
Điều chỉnh tham số background writer.
Giám sát bằng pg_stat_bgwriter/pg_stat_checkpointer.
Ngày 138
Query Tuning:
- EXPLAIN (ANALYZE, BUFFERS), work_mem/temp_buffers/shared_buffers, CTE/window function/materialized view.
Bài tập:
Phân tích truy vấn phức tạp bằng EXPLAIN (ANALYZE, BUFFERS).
Tối ưu bằng điều chỉnh tham số bộ nhớ đệm và kỹ thuật truy vấn.
Tạo materialized view tăng tốc truy vấn thường xuyên.
Ngày 139
Index Tuning:
- Index selectivity, cardinality, bloat; partial/expression/covering index; REINDEX/VACUUM bảo trì.
Bài tập:
Tạo partial index tăng tốc truy vấn trên tập con dữ liệu.
Tạo expression index cho biểu thức tính toán.
Dùng REINDEX CONCURRENTLY và VACUUM để giảm index bloat.
Ngày 140
Ôn tập và thực hành:
Xem lại replication/concurrency/autovacuum/bgwriter internals, query/index tuning.
Bài tập tổng hợp: viết một "performance war-room checklist" xử lý sự cố hiệu năng production trong 30 phút đầu.
Tuần 20: PostgreSQL Extensibility và PostgreSQL cho Blockchain
Ngày 141
Custom Background Workers:
- Cấu trúc (registration, main function, signal handlers), các bước tạo.
Bài tập:
Tìm hiểu background worker có sẵn.
Viết background worker đơn giản thực hiện tác vụ định kỳ.
Dùng background worker cho tác vụ phức tạp (sao lưu, đồng bộ dữ liệu).
Ngày 142
PL/Perl và PL/Tcl:
- Cài đặt, cấu trúc cơ bản, truy cập dữ liệu PostgreSQL.
Bài tập:
Viết hàm PL/Perl xử lý chuỗi.
Viết hàm PL/Tcl thao tác file.
So sánh ưu nhược điểm PL/pgSQL, PL/Python, PL/Perl, PL/Tcl.
Ngày 143
Extensions cho use case cụ thể - pg_stat_monitor và HypoPG:
pg_stat_monitor: giám sát chi tiết hơn pg_stat_statements.
HypoPG: tạo index giả định để đánh giá tác động trước khi tạo thật.
Bài tập:
Cài đặt và cấu hình pg_stat_monitor.
Phân tích hiệu suất database bằng pg_stat_monitor.
Dùng HypoPG đánh giá tác động của việc thêm index trước khi tạo thật trên bảng lớn.
Ngày 144
PostgreSQL cho Blockchain:
- Khái niệm blockchain cơ bản, lưu trữ dữ liệu block/transaction bằng PostgreSQL.
Bài tập:
Tìm hiểu khái niệm cơ bản (block, transaction, consensus).
Thiết kế CSDL PostgreSQL lưu trữ dữ liệu blockchain đơn giản.
Tìm dự án blockchain sử dụng PostgreSQL (ví dụ BigchainDB).
Ngày 145
PostgreSQL cho Blockchain (tiếp):
- Thách thức (hiệu suất, khả năng mở rộng), giải pháp (sharding, partitioning, indexing).
Bài tập:
Tìm thách thức khi dùng PostgreSQL cho blockchain.
Nghiên cứu giải pháp giải quyết thách thức.
Tìm trường hợp sử dụng thực tế (quản lý danh tính, tài sản, chuỗi cung ứng).
Ngày 146
pgvector và AI ứng dụng:
- Kết hợp pgvector với hybrid search (full text + vector), retrieval-augmented generation (RAG) dùng PostgreSQL làm vector store.
Bài tập:
Xây dựng hybrid search kết hợp tsvector và pgvector.
Xây một pipeline RAG đơn giản dùng PostgreSQL/pgvector làm knowledge base.
Đánh giá độ trễ/chi phí so với vector database chuyên dụng (Pinecone, Qdrant).
Ngày 147
Ôn tập và thực hành:
Xem lại custom background worker, PL/Perl/Tcl, pg_stat_monitor/HypoPG, blockchain, RAG.
Bài tập tổng hợp: viết proposal kỹ thuật đánh giá 2 use case mở rộng (RAG hoặc blockchain) cho hệ thống hiện tại.
Tuần 21: Observability và Site Reliability cho PostgreSQL
Ngày 148
Observability stack:
Prometheus + postgres_exporter, Grafana dashboard, alerting rules.
Ba trụ cột observability: metrics, logs, traces - vai trò của mỗi loại với PostgreSQL.
Bài tập:
Triển khai postgres_exporter + Prometheus + Grafana bằng Docker Compose.
Xây dashboard theo dõi connections, replication lag, cache hit ratio, autovacuum.
Viết alerting rule cho replication lag cao và connection saturation.
Ngày 149
SLO/SLI cho database:
Định nghĩa SLI (availability, latency p99, error rate) và SLO cho tầng dữ liệu.
Error budget và cách nó ảnh hưởng quyết định vận hành (khi nào được phép rủi ro).
Bài tập:
Định nghĩa SLO cho một dịch vụ dùng PostgreSQL (ví dụ 99.9% truy vấn < 200ms).
Thiết lập đo lường SLI thực tế bằng pg_stat_statements + Grafana.
Tính error budget hàng tháng và mô phỏng một sự cố tiêu tốn error budget.
Ngày 150
Capacity Planning:
Dự đoán tăng trưởng dữ liệu/connection, sizing instance (CPU/RAM/IOPS).
Khi nào cần scale up vs scale out (read replica, sharding).
Bài tập:
Xây mô hình dự đoán tăng trưởng dung lượng dữ liệu 12 tháng tới.
Tính toán IOPS cần thiết dựa trên workload hiện tại.
Lập kế hoạch scale (thêm read replica hay nâng cấp instance) dựa trên xu hướng.
Ngày 151
Incident Response và Runbook:
Cấu trúc runbook cho các sự cố thường gặp (replication lag, disk đầy, connection exhausted, long-running transaction).
Postmortem không đổ lỗi (blameless postmortem).
Bài tập:
Viết runbook xử lý "disk gần đầy do WAL tích tụ".
Viết runbook xử lý "connection pool exhausted".
Viết một bản postmortem mẫu cho một sự cố giả định.
Ngày 152
Distributed tracing với ứng dụng dùng PostgreSQL:
- OpenTelemetry, trace từ tầng ứng dụng xuống câu lệnh SQL, auto_explain.
Bài tập:
Tích hợp OpenTelemetry vào một ứng dụng mẫu gọi PostgreSQL.
Bật auto_explain để tự động log kế hoạch truy vấn chậm.
Kết hợp trace tầng ứng dụng với log truy vấn để định vị nguyên nhân gốc rễ (root cause).
Ngày 153
Cost optimization:
Chi phí compute/storage/IOPS trên cloud, right-sizing instance.
Kỹ thuật giảm chi phí: nén WAL, giảm retention backup hợp lý, dùng read replica cho báo cáo thay vì instance riêng lớn.
Bài tập:
Phân tích chi phí một instance managed PostgreSQL hiện tại và đề xuất tối ưu.
Tính tiết kiệm chi phí khi bật nén WAL và tối ưu retention backup.
So sánh chi phí giữa scale up instance chính và tách read replica cho reporting.
Ngày 154
Ôn tập và thực hành:
Xem lại observability stack, SLO/SLI, capacity planning, incident response, tracing, cost optimization.
Bài tập tổng hợp: xây bộ dashboard + alerting + runbook hoàn chỉnh cho một hệ thống production giả định.
Tuần 22: Sharding, Phân tán và Multi-Tenancy
Ngày 155
Giới thiệu Citus:
- Kiến trúc distributed PostgreSQL (coordinator/worker), distributed table, reference table.
Bài tập:
Cài đặt Citus (single-node hoặc cluster nhỏ).
Tạo distributed table và reference table, quan sát cách dữ liệu được phân mảnh.
So sánh hiệu năng truy vấn trên bảng distributed vs bảng thường.
Ngày 156
Chọn shard key và co-location:
Nguyên tắc chọn distribution column, co-location để tối ưu join.
Rebalancing shard khi thêm worker node.
Bài tập:
Thiết kế shard key cho một hệ thống multi-tenant SaaS (ví dụ tenant_id).
Cấu hình co-location giữa các bảng liên quan để tránh cross-shard join.
Thử nghiệm rebalance shard sau khi thêm một worker node mới.
Ngày 157
Multi-tenancy patterns:
So sánh: database-per-tenant, schema-per-tenant, row-level (shared table + tenant_id + RLS).
Ưu nhược điểm về cô lập dữ liệu, chi phí vận hành, khả năng mở rộng.
Bài tập:
Triển khai thử nghiệm cả 3 pattern trên cùng một use case đơn giản.
Đánh giá độ phức tạp migration schema cho từng pattern khi có hàng nghìn tenant.
Đề xuất pattern phù hợp cho một startup SaaS B2B mới.
Ngày 158
Sharding thủ công (application-level sharding):
- Khi không dùng Citus: routing theo hash/range ở tầng ứng dụng, dùng FDW hoặc PgCat để định tuyến.
Bài tập:
Thiết kế sharding thủ công theo hash(tenant_id) cho 4 shard.
Viết logic routing ở tầng ứng dụng hoặc dùng PgCat làm sharding proxy.
Lên kế hoạch xử lý truy vấn cần join xuyên shard (fan-out query, application-side join).
Ngày 159
Global/Multi-region PostgreSQL:
- Chiến lược multi-region: read replica ở xa, active-active (xung đột ghi), CockroachDB/YugabyteDB như lựa chọn thay thế khi cần multi-master thật sự.
Bài tập:
Thiết kế kiến trúc multi-region với PostgreSQL (primary một vùng + read replica các vùng khác).
Phân tích rủi ro và giới hạn khi cố gắng làm active-active với PostgreSQL thuần.
So sánh ngắn gọn PostgreSQL multi-region với một distributed SQL database (CockroachDB hoặc YugabyteDB).
Ngày 160
Giám sát hệ thống phân tán:
- Theo dõi cân bằng tải giữa các shard/worker, phát hiện hot shard.
Bài tập:
Xây dashboard giám sát phân bố dữ liệu/tải giữa các shard Citus.
Phát hiện và xử lý một hot shard giả định (tenant lớn bất thường).
Đề xuất chiến lược tách riêng tenant lớn (dedicated shard) khi cần.
Ngày 161
Ôn tập và thực hành:
Xem lại Citus, shard key, multi-tenancy, sharding thủ công, multi-region.
Bài tập tổng hợp: thiết kế kiến trúc dữ liệu cho một SaaS giả định dự kiến 10,000 tenant.
Tuần 23: Chaos Engineering, Disaster Recovery và Zero-Downtime Upgrade
Ngày 162
Chaos Engineering cho database:
Nguyên tắc chaos engineering, công cụ (Chaos Mesh, Gremlin, hoặc kịch bản thủ công bằng tc/iptables).
Thử nghiệm: kill primary, network partition, disk full, high latency network.
Bài tập:
Mô phỏng kill process primary trong một cluster HA và đo thời gian failover thực tế.
Mô phỏng network partition giữa primary và replica bằng iptables/tc, quan sát hành vi.
Mô phỏng disk gần đầy và quan sát cách hệ thống cảnh báo/phản ứng.
Ngày 163
Disaster Recovery Drill:
Xây dựng và diễn tập kịch bản DR định kỳ (region mất, backup hỏng, ransomware).
Đo RTO/RPO thực tế so với mục tiêu đề ra.
Bài tập:
Diễn tập khôi phục toàn bộ hệ thống từ backup lạnh (cold backup) sang một region/máy chủ khác.
Diễn tập kịch bản "phát hiện backup bị hỏng", tìm phương án dự phòng.
Viết báo cáo so sánh RTO/RPO thực tế đo được với SLO đã cam kết ở Tuần 21.
Ngày 164
Zero-downtime Major Version Upgrade:
pg_upgrade (link mode vs copy mode), logical replication-based upgrade (gần như zero-downtime).
Tận dụng pg_upgrade giữ nguyên logical slot (PostgreSQL 17+) để rút ngắn thời gian đồng bộ lại.
Bài tập:
Thực hiện pg_upgrade từ một phiên bản cũ lên phiên bản mới ở chế độ link mode, đo downtime.
Thực hiện upgrade bằng logical replication (dựng cluster mới, đồng bộ, cutover) và so sánh downtime với pg_upgrade.
Viết checklist rollback nếu upgrade thất bại giữa chừng.
Ngày 165
Blue-Green deployment cho database:
Áp dụng blue-green cho tầng ứng dụng kết hợp logical replication cho tầng dữ liệu.
Xử lý schema drift giữa hai môi trường trong lúc chuyển đổi.
Bài tập:
Thiết kế quy trình blue-green deployment có đồng bộ dữ liệu hai chiều tạm thời.
Lên kế hoạch xử lý xung đột ghi khi cả hai môi trường đều nhận traffic trong giai đoạn chuyển tiếp.
Viết kế hoạch rollback nhanh nếu môi trường "green" gặp sự cố sau cutover.
Ngày 166
Backup verification và immutability:
- Kiểm tra tính toàn vẹn backup định kỳ (restore test tự động), backup immutable chống ransomware (object lock trên S3).
Bài tập:
Viết job tự động restore backup vào môi trường cô lập và kiểm tra checksum/row count định kỳ.
Cấu hình object lock (WORM) cho backup trên S3/MinIO để chống xóa/sửa.
Đánh giá chiến lược 3-2-1 backup (3 bản sao, 2 loại lưu trữ, 1 bản off-site) cho hệ thống của bạn.
Ngày 167
Game day tổng hợp:
- Tổ chức một buổi "game day" mô phỏng sự cố lớn (mất region) với đội ngũ thực hành runbook đã viết.
Bài tập:
Lên kịch bản game day chi tiết (timeline, vai trò từng người, tiêu chí thành công).
Thực hiện game day, ghi lại thời gian phản ứng thực tế theo từng bước runbook.
Viết báo cáo cải tiến sau game day (những gì cần sửa trong runbook/hệ thống).
Ngày 168
Ôn tập và thực hành:
Xem lại chaos engineering, DR drill, zero-downtime upgrade, blue-green, backup verification.
Bài tập tổng hợp: xây "resilience scorecard" đánh giá mức độ sẵn sàng chịu lỗi của hệ thống hiện tại.
Tuần 24-26: Dự án cá nhân Production-Grade và Tổng kết
Ngày 169 - Thiết kế cơ sở dữ liệu
Xác định thực thể, thuộc tính, mối quan hệ cho hệ thống (ví dụ: sản phẩm, danh mục, khách hàng, đơn hàng, chi tiết đơn hàng, tenant).
Vẽ ERD, áp dụng chuẩn hóa và cân nhắc phi chuẩn hóa có chủ đích cho các truy vấn đọc nhiều.
Quyết định chiến lược multi-tenancy (dựa trên Tuần 22) và partitioning (dựa trên Tuần 7) cho dự án.
Ngày 170 - Khởi tạo hạ tầng
Viết docker-compose cho PostgreSQL + PgBouncer + Prometheus/Grafana + ứng dụng.
Thiết lập Flyway/Liquibase quản lý migration ngay từ đầu.
Cấu hình pgBackRest cho backup tự động và PITR ngay từ ngày đầu dự án.
Ngày 171 - Tạo cơ sở dữ liệu và các bảng
Tạo database, bảng theo ERD, ràng buộc (khóa chính, khóa ngoại, check constraint).
Tạo index ban đầu dựa trên các truy vấn dự kiến, cân nhắc partition cho bảng lớn.
Ngày 172 - Backend cơ bản
Thiết lập môi trường phát triển (ví dụ Python/FastAPI hoặc Node/Express), cài thư viện kết nối PostgreSQL.
Cấu hình connection pool đúng cách (qua PgBouncer), viết health-check endpoint kiểm tra kết nối DB.
Ngày 173 - Chức năng quản lý sản phẩm và danh mục
API CRUD sản phẩm/danh mục, tìm kiếm và lọc (dùng full text search/pg_trgm nếu cần).
Viết pgTAP test cho các ràng buộc và trigger liên quan.
Ngày 174 - Chức năng giỏ hàng và đặt hàng
API giỏ hàng, tạo đơn hàng dùng transaction đảm bảo nhất quán (trừ tồn kho, tạo đơn).
Dùng MERGE/UPSERT cho cập nhật tồn kho đồng thời an toàn.
Ngày 175 - Chức năng khách hàng và phân quyền
Đăng ký/đăng nhập, quản lý thông tin cá nhân, lịch sử đơn hàng.
Áp dụng RLS để mỗi khách hàng chỉ thấy dữ liệu của mình; RBAC cho vai trò admin/nhân viên.
Ngày 176 - Frontend và tích hợp
Xây giao diện cơ bản, gọi API backend, hiển thị dữ liệu.
Kiểm thử tích hợp end-to-end bằng Testcontainers.
Ngày 177 - Observability cho dự án
Tích hợp postgres_exporter + dashboard Grafana theo dõi hệ thống thực.
Thiết lập auto_explain và alerting cho truy vấn chậm/replication lag.
Ngày 178 - Load testing và tối ưu hiệu năng
Chạy pgbench/k6 mô phỏng tải cao, xác định bottleneck bằng EXPLAIN ANALYZE và pg_stat_statements.
Tối ưu index, cấu hình, connection pool dựa trên kết quả đo được.
Ngày 179 - Bảo mật và tuân thủ
Áp dụng checklist bảo mật (Tuần 15/17): mã hóa dữ liệu nhạy cảm, pgAudit, firewall, quyền tối thiểu.
Chạy thử một bài kiểm tra pentest cơ bản trên môi trường staging.
Ngày 180 - CI/CD cho database
Xây pipeline CI chạy migration (Flyway) + pgTAP test + lint SQL tự động khi có pull request.
Thiết lập deploy tự động lên staging, gate thủ công trước khi lên production.
Ngày 181 - Diễn tập vận hành (DR + chaos nhỏ)
Thực hiện một bài diễn tập backup/restore và một thử nghiệm chaos nhỏ (kill connection, network delay) trên dự án thật.
Viết runbook rút gọn cho 2-3 sự cố có khả năng xảy ra nhất với dự án.
Ngày 182 - Triển khai và tổng kết
Triển khai hệ thống (Kubernetes với CloudNativePG, hoặc managed service).
Viết tài liệu tổng kết: kiến trúc, quyết định kỹ thuật, đánh đổi (trade-off), và roadmap cải tiến tiếp theo.
Tự đánh giá lại toàn bộ lộ trình: những phần internals/production nào cần ôn lại sâu hơn trước khi phỏng vấn hoặc đưa vào công việc thực tế.