5 điểm bởi GN⁺ 2025-12-21 | 4 bình luận | Chia sẻ qua WhatsApp
  • Tự host Postgres không phức tạp hay rủi ro như nhiều người nghĩ, đồng thời rẻ hơn dịch vụ managed và cho phép tinh chỉnh hiệu năng linh hoạt hơn
  • Phần lớn dịch vụ cơ sở dữ liệu đám mây vận hành trên Postgres mã nguồn mở với một số chỉnh sửa nhỏ, khác biệt thực chất nằm ở mức độ tự động hóa vận hành
  • Trong các trường hợp vận hành thực tế, Postgres tự host có thể xử lý ổn định hàng nghìn người dùng và hàng chục triệu truy vấn, trong khi thời gian bảo trì rất ít
  • Do giá của các dịch vụ managed như AWS RDS tăng lên, nay có thể tự vận hành máy chủ cấu hình cao hơn rất nhiều với cùng chi phí
  • Với các đội ngũ quy mô trung bình không có hạ tầng quá phức tạp, tự host là một phương án thay thế thực tế về cả chi phí lẫn hiệu năng

Sự thay đổi của câu chuyện lấy đám mây làm trung tâm

  • Trước đây, phần lớn doanh nghiệp tự vận hành cơ sở dữ liệu trên máy chủ riêng, một kiến trúc nhanh hơn do độ trễ mạng thấp
    • Trong giai đoạn 1980~2000, máy chủ ứng dụng và máy chủ cơ sở dữ liệu thường nằm trên cùng thiết bị vật lý
  • Sự ra mắt của Amazon RDS (2009) được đón nhận như một đề xuất hấp dẫn khi tự động hóa sao lưu, vá lỗi và giám sát
    • Ban đầu, chi phí gần tương đương máy chủ chuyên dụng nhưng giúp giảm gánh nặng vận hành
  • Sau năm 2015, khi việc áp dụng đám mây tăng tốc, nhận thức rằng tự quản lý hạ tầng là không hiệu quả bắt đầu lan rộng
    • Mô hình AWS quản lý hạ tầng thay, còn nhà phát triển tập trung vào logic ứng dụng, đã trở thành tiêu chuẩn
  • Tính đến năm 2025, giá RDS đã tăng mạnh, tạo ra tình huống có thể thuê máy chủ chuyên dụng cấu hình cao hơn rất nhiều với cùng ngân sách
    • Ví dụ: instance db.r6g.xlarge (4 vCPU, 32GB RAM) có giá $328/tháng, trong khi có thể thuê máy chủ 32 lõi · 256GB RAM

Cấu thành thực tế của dịch vụ managed

  • AWS RDS về cơ bản là Postgres tiêu chuẩn được bổ sung hệ thống giám sát và sao lưu riêng của AWS
    • Bao gồm sao lưu dựa trên snapshot EBS, quản lý cấu hình qua Chef/Puppet/Ansible, connection pooling bằng PgBouncer, giám sát CloudWatch và script failover tự động
  • Về mặt kỹ thuật, cấu hình này không quá phức tạp; giá trị cốt lõi nằm ở tự động hóa vận hành và sự tiện lợi khi triển khai ban đầu
  • Kết quả khi migrate từ RDS sang tự host với cùng cấu hình máy chủ cho thấy hiệu năng giữ nguyên hoặc thậm chí tốt hơn
    • Có thể trực tiếp điều chỉnh các tham số từng bị giới hạn trên RDS để tối ưu hiệu năng

Độ phức tạp trong vận hành tự host

  • Việc migrate sang máy chủ DigitalOcean 16 vCPU / 32GB RAM / 400GB đĩa mất khoảng 4 giờ, sau đó xác nhận vận hành ổn định
  • Các nhóm sản phẩm yêu cầu tính sẵn sàng cao cần khoảng 30 phút quản trị mỗi tháng, còn dịch vụ ít traffic có thể tự động hóa hoàn toàn
  • Chu kỳ quản trị định kỳ
    • Hàng tuần (10 phút) : xác minh sao lưu, rà soát slow query log, kiểm tra dung lượng đĩa
    • Hàng tháng (30 phút) : cập nhật bảo mật, kiểm tra chính sách lưu giữ bản sao lưu, lập kế hoạch dung lượng
    • Hàng quý (2 giờ) : cập nhật dashboard giám sát, tối ưu cấu hình, kiểm thử khôi phục
  • Ứng phó sự cố là trách nhiệm trực tiếp của bạn, nhưng RDS cũng có thể gặp sự cố và cuối cùng nhà phát triển vẫn phải xử lý
  • Khi tự vận hành, có thể tự quyết định thời điểm cập nhật và vùng rủi ro, từ đó dễ đảm bảo tính ổn định hơn

Khi nào tự host không phù hợp

  • Khi lập trình viên giai đoạn đầu cần tạo prototype nhanh, dịch vụ managed sẽ tiện hơn
  • Doanh nghiệp quy mô lớn có thể thấy hiệu quả hơn khi có kỹ sư cơ sở dữ liệu chuyên trách hoặc ủy thác cho đám mây để giảm chi phí nhân sự
  • Các ngành bị quản lý chặt (PCI-DSS, HIPAA, v.v.) có thể bị yêu cầu dùng nền tảng managed đã được chứng nhận

Các điểm cấu hình quan trọng

  • Cấu hình bộ nhớ: cần điều chỉnh shared_buffers, effective_cache_size, work_mem, maintenance_work_mem theo phần cứng
    • Ví dụ: đặt shared_buffers bằng 25% RAM, effective_cache_size bằng 75%
  • Quản lý kết nối: dùng pgbouncer để thiết lập connection pooling, hoạt động hiệu quả trong môi trường Python asyncio
    • Ví dụ cấu hình cơ bản: max_connections = 200, log_connections = on
  • Tinh chỉnh lưu trữ: trong môi trường NVMe SSD, điều chỉnh random_page_cost = 1.1, effective_io_concurrency = 200
    • Tốc độ đọc ngẫu nhiên được cải thiện, giúp tối ưu kế hoạch truy vấn
  • Cấu hình WAL: điều chỉnh wal_level = replica, max_wal_size = 2GB, checkpoint_completion_target = 0.9 để cân bằng độ bền và hiệu năng

Kết luận

  • Không phải mọi hạ tầng đều cần tự vận hành, nhưng Postgres là một lĩnh vực mà tự host khá hợp lý
  • Nếu đang chi hơn $200/tháng cho RDS, rất đáng thử chuyển một cơ sở dữ liệu không cốt lõi sang máy chủ thử nghiệm
  • Trong tương lai, hạ tầng có thể phát triển theo mô hình hybrid kết hợp dịch vụ managed và tự host
  • Postgres được đánh giá là ứng viên tự host có hiệu quả chi phí rất cao

4 bình luận

 
yangeok 2025-12-23

Vì còn được đảm bảo storage đạt 11 số 9, nên vận hành khó như khi dùng cloud thì người ta mới dùng cloud chứ haha

 
kaydash 2025-12-22

Trên thực tế, vận hành một cụm 3 node sẽ không hề dễ dàng đến vậy.

 
GN⁺ 2025-12-21
Ý kiến trên Hacker News
  • Tôi xem self-hosting là vấn đề về trách nhiệm
    Tôi đang tự host vài sản phẩm SaaS, rẻ hơn AWS rất nhiều mà hiệu năng cũng tốt hơn hẳn
    Tuy vậy, với các dự án khách hàng thì tôi vẫn thuyết phục họ trả tiền cho AWS, vì như vậy có thể chuyển trách nhiệm về tính sẵn sàng của phần cứng sang bên khác
    Khi ngân sách hạn chế thì chi phí RDS khá nặng. Vận hành một cụm Galera 3 node trên Hetzner với vài đô rõ ràng kinh tế hơn nhiều
    Nhưng ngay cả các dịch vụ được quản lý như Cloudflare hay SQS cũng vẫn thỉnh thoảng gặp sự cố. Rốt cuộc chẳng có nơi nào ổn định tuyệt đối cả

    • Tôi từng hỏi “Tại sao lại chuyển từ NoNameCMS sang Salesforce?”, và nhận được câu trả lời: “Nếu Salesforce sập thì sẽ lên bài trên WSJ.” Đó là lý do rất thực tế của việc đẩy trách nhiệm
    • Từ góc nhìn khách hàng của khách hàng, câu “Ikea với Disney cũng từng sập” hoàn toàn không có tác dụng. Điều duy nhất họ quan tâm là dịch vụ của mình đang ngừng hoạt động
    • AWS Serverless PG rồi thì chẳng có nhiều lý do để phải tự quản lý. Trong môi trường lưu lượng thấp thì gần như miễn phí, lại vượt trội hơn nhiều về bảo mật, sao lưu và khả năng tích hợp
      AWS Aurora Serverless
    • Cũng có thể chọn phương án trung hòa: chỉ thuê ngoài đến cấp độ VM, còn lại tự quản lý. Điều này phụ thuộc vào chi phí vận hành của stack kỹ thuật
    • Tôi đã vận hành SQL self-hosted cho rất nhiều khách hàng suốt 20 năm, và chưa từng thấy máy chủ SQL bị sập lần nào
      Ngược lại, cloud SQL lại có cấu trúc chi phí phức tạp, còn phần backup thì chỉ cần cấu hình một lần là xong
  • Tôi không đồng ý với lập luận rằng self-hosting là lựa chọn phù hợp cho đa số
    Theo tôi, chỉ khi ngân sách rất eo hẹp, hoặc quy mô đủ lớn để có kỹ sư chuyên trách, thì tự host mới hợp lý
    Với doanh nghiệp nhỏ thì giao cho cloud vẫn thực tế hơn. Tính ra sau khi setup xong, mỗi tháng chỉ cần 30–120 phút quản trị là đủ

    • Phần lớn công ty dù dùng cloud vẫn phải thuê kỹ sư hạ tầng. Nói rằng “cloud giúp giảm chi phí nhân sự” là sai
      PaaS như Heroku hay Render thì developer bình thường cũng dùng được, nhưng đắt hơn nhiều
      Rốt cuộc nếu không tự động hóa khôi phục ứng dụng thì chuyện bị đánh thức lúc 3 giờ sáng vẫn y hệt
    • Hầu hết dịch vụ không cần tính sẵn sàng cao. Có sập vào thứ Bảy thì sửa vào thứ Hai cũng được
      Nếu là công cụ nội bộ, chỉ mất 5 phút để thêm một Postgres vào Docker
    • Cloud cũng tốn khoảng 1–2 giờ quản trị mỗi tháng. Không khác self-hosting là bao
    • Dùng RDS thậm chí còn làm giảm khả năng quan sátquyền kiểm soát, khiến việc debug khó hơn
    • Mấu chốt không phải hiệu quả, mà là ai sẽ bị chửi khi có sự cố. Dùng cloud thì dễ đổ trách nhiệm hơn
  • Định nghĩa về ‘managed database’ đang khá mơ hồ
    Với tôi, các yêu cầu cơ bản là backup tự động, tối ưu index, failover đa trung tâm dữ liệu, khôi phục theo thời điểm, phân tích slow query, dự đoán lưu trữ
    Nếu có thể cung cấp những thứ đó trong phí hàng tháng thì tranh luận về self-hosting gần như không còn ý nghĩa

    • Vấn đề là phải thuê nhân sự chuyên môn. Nếu người phụ trách Postgres nghỉ phép thì sẽ phát sinh vấn đề bus factor
      Cuối cùng lại phải có hai người, rồi vì công việc quá nhàn nên bắt đầu thử những cải tiến không cần thiết và có khi lãng phí mất 6 tháng
    • Lý do của self-hosting rốt cuộc là độ trễ (latency). Backup hay phân tích là chuyện cơ bản, còn tự xây thì mới đạt tốc độ nhanh nhất
    • Nếu setup tốt từ đầu thì cả backup lẫn failover đa vùng cũng có thể tự động hóa
    • Tôi chỉ self-host những dịch vụ chắc chắn sẽ không gọi điện lúc 3 giờ sáng. Dùng cho log hay phân tích nội bộ thì ổn, nhưng DB thì tuyệt đối không
    • Yugabyte mã nguồn mở bao phủ được phần lớn các tính năng đó
  • DB managed đắt hơn VPS quá nhiều
    Tôi có kỳ vọng một mức premium cho sự tiện lợi, nhưng thực tế lại đắt hơn gấp nhiều lần. Vì vậy ngoài các dự án lớn ra thì tôi không dùng

    • Họ khiến bạn tin rằng mình không tự làm nổi, rồi trong lúc đó liên tục tăng giá. Đến khi không còn kỹ năng để chuyển đi nữa thì bạn bị khóa chặt vào nền tảng
  • Phần tính sẵn sàng cao (HA) được nhắc trong bài còn thiếu. Chỉ nói về cấu hình WAL là chưa đủ. Replication rất tốn kém

  • Tôi không hiểu vì sao Postgres lại được đánh giá quá cao trên HN
    Không có cách dễ dàng để dựng cụm HA với failover tự động như MongoDB. Tôi tò mò trong môi trường production thì người ta giải quyết chuyện này thế nào

    • Cộng đồng PostgreSQL cũng nhận ra vấn đề này. Họ ghen tị với độ ổn định của replication tích hợp sẵn trong MongoDB
      Thảo luận liên quan: mailing list PostgreSQL
    • Nếu dùng Kubernetes thì CloudNativePG gần như là giải pháp HA tiêu chuẩn
    • Thế giới SQL quen với khôi phục nhanh (Disaster Recovery) hơn là HA thực sự
      Trên thực tế, mọi kết nối đều sẽ bị cắt, cache bị khởi tạo lại, và khi nâng cấp thì việc gián đoạn dịch vụ là bắt buộc
      Chỉ Oracle RAC là ngoại lệ, còn PostgreSQL không được thiết kế như vậy. YugabyteDB là lựa chọn thay thế gần nhất
      Phần lớn ứng dụng chấp nhận vài giờ downtime. Chỉ các công ty lớn mới kham nổi tự động hóa phức tạp như thế
    • Cách phổ biến nhất là dùng Patroni. Nếu muốn làm đơn giản thì dùng Autobase
      Trong môi trường Kubernetes thì CloudNativePG cũng tốt.
      pg_auto_failover thì đơn giản nhưng có giới hạn
    • Thực tế là phần lớn doanh nghiệp không cần kiểu HA phức tạp như vậy. Hiệu quả trên chi phí quá thấp
  • Nhìn vào Autobase, có thể thấy nó tự động xử lý những việc cần thiết khi self-hosting

    • Tôi lướt README thì có vẻ connection pooling nằm ngoài phạm vi của nó
    • Tôi tò mò không biết nó có tích hợp tốt với các PaaS self-hosted khác không. Có vẻ nó chạy dưới dạng container Docker
    • Dự án rất hay, cảm ơn
  • Trong 15 năm qua tôi luôn self-hosted Postgres, nhưng gần như chưa từng gặp vấn đề gì
    Điều duy nhất khiến tôi phải bận tâm là khi cần migrate phiên bản PG để phù hợp với các đợt nâng cấp ORM. Chuyện đó có thể xử lý bằng quản trị hệ thống cẩn thận

  • Tôi từng tự chạy Postgres không được quản lý trên Fly.io, và thật sự rất khổ
    Node chết thường xuyên đến mức tôi phải dùng repmgr để khôi phục thủ công, cuối cùng còn phải viết hẳn quy trình vào wiki nội bộ
    Mục tiêu của cluster là tính sẵn sàng cao, nên tôi không hiểu vì sao nó không tự động xử lý primary zombie
    Cuối cùng tôi chuyển sang managed Postgres, và việc để người khác xử lý khi có sự cố thực sự rất nhẹ đầu

    • Giờ tôi đang dùng Managed Postgres của Fly
  • Nhiều bình luận trong thread này đang bỏ qua các yếu tố thực tế như quy mô, workload, nhân lực, thời gian, giai đoạn kinh doanh, yêu cầu mở rộng
    Self-hosting có thể đúng, cũng có thể không, nhưng cuộc thảo luận đang bị đơn giản hóa quá mức

    • Các kỹ sư thường gần như không cân nhắc những yếu tố này, mà có xu hướng chọn giải pháp đắt nhất miễn là sếp duyệt
 
sinbumu 2025-12-22

Điều các nhà phát triển băn khoăn có lẽ là liệu khi tự host những thứ như vậy thì các yếu tố đó có được công nhận hay không. Dù chi phí cloud có cao hơn, nếu phần tiết kiệm nhờ tự host không được ghi nhận thì cứ dùng dịch vụ cloud rồi bù vào, thu hẹp phạm vi phải tự quản lý có lẽ còn nhẹ đầu hơn.