PostgreSQL liệu có như tuyên bố “Cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới”

Bài viết trước mình có nói đến citus data và postgres, trước khi đi tiếp sâu hơn về citus có lẽ mình nên đi dạo qua sơ lược về cơ sở dữ liệu quan hệ đối tượng PostgreSQL này trước để các bạn hiểu được tại sao lại chọn nó nhé!

Đầu tiên thì bạn thường thấy một số loại cơ sở dữ liệu quan hệ hay được sử dụng trong dự án, phải kể đến SQL Server, My SQL, SQLlite, và Postgresql. Thường thì chúng ta ít quan tâm đến chọn loại cơ sở dữ liệu nào cho dự án của mình, có thể là các anh SA chọn, hoặc có thể là khách hàng chọn và yêu cầu chúng ta phát triển nó.

Thật buồn cười khi chúng ta cứ phát triển theo những yêu cầu đó mà chẳng biết là tại sao, đến lúc có issue thì lại quay ra trách, cũng kỳ. Vậy nên mình cũng thử tìm hiểu nó để có thể nắm được những điểm mạnh yếu của từng cơ sở dữ liệu trước khi sử dụng. Mặc dù trong dự án, một cơ sở dữ liệu đã được lựa chọn thì ngay bản thân mình cũng không có đủ quyền hạn để thay đổi. Nhưng chí ít thì cũng nên biết tại sao chứ nhỉ!

Các cơ sở dữ liệu trên thì có rất nhiều trang cũng như document ngay chính trang chủ của cơ sở dữ liệu đó đã đề cập rất rõ đến cách sử dụng rồi nên mình cũng chỉ ghi chú lại những thứ mà mình xem như là quan trọng khi sử dụng Postgresql này.

Điều đầu tiên thì My SQL, PostgreSQL và SQLlite đều là mã nguồn mở, ai mà chẳng thích đồ free chứ, nhưng nếu dùng mã nguồn mở thì bạn hãy chú ý đến cộng đồng phát triển nó nhé, đôi khi cộng đồng quá ít, issue chưa được phát hiện thì toang cả một dự án lại khổ @@. Nói thì nói vậy thôi chứ cả 3 cơ sở dữ liệu trên đều có một cộng đồng rất lớn rồi.

95270396 1085 42DC 8C1C C43AEB5D1195

Thứ hai là PostgreSQL là cơ sở dữ liệu quan hệ đối tượng trong khi MySQL chỉ là cơ sở dữ liệu đơn thuần. Chắc hẳn bạn cũng đã từng nghe qua lập trình hướng đối tượng và cũng từng nghe những thuộc tính của nó rồi. Đúng rồi đó, PostgreSQL cũng sở hữu tính năng kế thừa dành cho bảng (table inheritance) và overloading dành cho function. Điều này giúp ích rất nhiều khi thiết kế cơ sở dữ liệu.

Thứ ba là PostgreSQL hỗ trợ mô hình ứng dụng với nhiều dạng như Json, Xml… trong khi MySQLchỉ hỗ trợ được Json mà thôi. Bên cạnh đó nó cũng hộ trợ nhiều ngôn ngữ thủ tục như pgSql, python, perf… Điều này giúp cho bản thân PostgreSQL có thể tương thích nhanh và dễ dàng mở rộng.

Thứ nữa là các doanh nghiệp lớn vô cùng quan tâm ngoài khả năng mở rộng đó là khả năng quản lý số lượng người dùng đồng thời (CCUs) lên đến hàng terabyte và petabyte. PostgreSQL triển khai MVCC (Multiversion Concurrency Control) không làm ảnh hưởng đến việc hỗ trợ nhiều query đồng thời và nó cũng cho phép tạo partial index và bảo vệ tính bảo mật dữ liệu trong các cấp giao dịch khác nhau. Điền này dẫn đến ít rủi ro cho dữ liệu. Postgres phù hợp cho cả đọc và ghi dữ liệu.

Tuy nhiên, lại tuy nhiên rồi, điều gì cũng có hạn chế của nó, đó là PostgreSQL có thiết lập số lượng max_connection trong khi MySQL thì không. Thông thương một hệ thống có RAM 16GB thường có thể thiết lập max_connection ~1000, trong mộ vài hệ thốn số lượng có thể lên đến 8k connection tuy nhiên những hệ thống này rất dễ gặp lỗi. Điều này là một điểm chú ý lớn khi sử dụng và thiết kế. Mình đã từng thấy một trường hợp thắt cổ chai ngay tầng database này rồi.

Ví dụ chức năng login bạn có thể đưa vào cả triệu request nhưng connection database của bạn chỉ có 500 connection concurrency mà thôi. Khi đó bạn hiểu hệ thống của bạn sẽ xảy ra chuyện gì rồi đó, một con đường rộng thênh thang chứa được mấy chiếc ô tô tránh nhau nhưng khi vào nhà bạn lại qua một cái cổng chỉ có thể đi bộ được thôi. Thực sự bạn nên rất rất lưu ý về vấn đề này trong thiết kế cơ sở dữ liệu nhé!

Bên cạnh vấn đề chịu tải và khả năng mở rộng đáng gờm của PostgreSQL thì các ông lớn thường chú ý đó là hiệu năng của nó, PostgreSQL có nhiều cơ chế index, khả năng join bảng, hỗ trợ thực thi câu query phức tạp, Triggers/Stored Procedures/Transactions cũng có khả năng tương thích rất cao. Điều này là một ưu điểm để mọi người có thể cân nhắc chọn PostgreSQL.

Điều cuối cùng mình thất PostgreSQL khá hay ho là khả năng scale out, mở rộng vùng lưu trữ dữ liệu một cách tự động. Tuy rằng PostgreSQL không có bộ nhớ đệm như SQL Server nên không thể cache lại câu query trong quá trình truy vấn nhưng nó lại có một cơ chế khả dụng rất cao trong quá trình chạy runtime giúp các nhà phát triển xây dựng app, các nhà quản trị bảo vệ toàn vẹn dữ liệu, và tạo ra một môi trường chịu lỗi fault-tolerant giúp bạn quản lý dữ liệu bất kể tập dữ liệu lớn hay nhỏ.

Fault tolerance đề cập đến khả năng của một hệ thống (computer, network, cloud cluster,) có khả năng tiếp tục hoạt động mà không bị gián đoạn khi một hoặc nhiều thành phần của nó gặp sự cố.

Nhiều khi đi phỏng vấn, nhiều anh TA hỏi câu làm sao để ứng dụng của bạn không bao giờ chết, uhm thì… switch hệ thống dự phòng. Ở đây cũng vậy Fault tolerance ngăn chặn sự gián đoạn phát sinh từ một điểm thất bại duy nhất, đảm bảo tính sẵn sàng cao (high availability) và tính liên tục (business continuity) của các ứng dụng hoặc hệ thống thực hiện các nhiệm vụ quan trọng.

Hình dung một chút:

Một chiếc máy bay hai động cơ là một Fault-tolerant system: nếu động cơ này bị hỏng, động cơ kia sẽ hoạt động thay thế, điều này giúp máy bay vẫn tiếp tục hành trình bay của mình một cách trơn tru.

Ngược lại, một chiếc xe với lốp dự phòng là highly available. Một chiếc lốp bị xẹp sẽ làm chiếc xe phải dừng lại, nhưng downtime sẽ là tối thiểu vì đã có lốp thay thế sẵn sàng, việc thay lốp xe sẽ diễn ra trong thời gian ít nhất.

PostgreSQL hay ho thật đó nhưng không phải là không có nhược điểm đâu nhé!

Tuy PostgreSQL có một cộng đồng hỗ trợ lớn nhưng mà làm việc với nó khá là thách thức, lượng công việc mình phải tự handle, xử lý để control khá nhiều như cache, tối ưu query, B-tree index, event… Những giải pháp cho những vấn đề ngoài luồng như vậy thường đòi hỏi sự hiểu biết rất sâu. Với mình thì nó cũng chỉ là cưỡi ngựa xem hoa mà thôi. Bạn có thể tìm hiểu tài liệu của nó tại https://www.postgresql.org/docs/

Ngoài một số những nhược điểm khác mình cũng đã đề cập ở trên như vấn đề giới hạn connection, vấn đề cache query thì một vấn đề cũng gây tốn tài nguyên bộ nhớ đó là nâng cấp version. Dù sao thì PostgreSQL cũng là mã nguồn mở, vấn đề upgrade version cũng là một vấn đề đáng lưu tâm.

Tổng kết lại bằng một số bảng thống kê trên wiki giữa các cơ sở dữ liệu.

Bài viết là những quan điểm và sự tìm hiểu cá nhân của bản thân mình, có thể còn nhiều thiếu sót, mong các bạn ủng hộ góp ý thêm.

A87CB81A 33C1 4FD9 B0AC 594DB99C7A3B
7B8139AE E49E 40B7 9D9F DE20D900E034
094F8F43 14F8 4AA4 A782 571933210183
9831923F 36C0 4A7D 8DED 353A27F56B26

Leave a Reply