Citus Data – Phải chăng bạn có nên sử dụng nó hay không?

Citus Data – Phải chăng bạn có nên sử dụng nó hay không?

December 2, 2020 2 By Nam Vu

Lại tiếp tục với Citus Data và cơ sở dữ liệu phân tán, như bài viết trước thì có lẽ các bạn đã mường tượng ra được cái Citus data là gì rồi nhỉ, nếu chưa thì bạn có thể đọc lại tại
http://blog.ntechdevelopers.com/citus-data-va-cau-chuyen-tang-hieu-nang-phan-1/

Đến với bài viết này thì mình muốn cùng các bạn phân tích xem khi nào dùng đến nó nhé!

Điều đầu tiên phải nói citus data dùng rất nhiều đối với các ông lớn như Algolia, Heap, Chartbeat, Pex, Mixrank. Đặc điểm chung cho những khách hàng của citus đều là có lượng CCUs rất lớn, và họ cần phân tích dữ liệu big data theo thời gian thực. Một điều nữa là tập khách hàng này của citus đa số sẽ là B2B (Business to Business). Có thể bạn chưa biết đến B2B thì mình xin lấy ví dụ ngắn gọn cho bạn hình dung như sau. Khách hàng trong mô hình B2B ở đây không phải là một cá nhân, mà là một công ty, doanh nghiệp, cửa hàng, do đó có thể giá trị của hợp đồng, đơn hàng thường rất lớn, không thể giao dịch ngay trên sàn thương mại điện tử hoặc kênh thương mại điện tử riêng mà buộc phải ký hợp đồng bên ngoài (trong trường hợp cần thiết). Ví dụ Lazada, Tiki, Adayroi, Shopee,.. ở thị trường Việt Nam. Còn thị trường nước ngoài thì có thể kể đến Amazon, Taobao, Alibaba, Ebay,.. Nói chung theo dân dã thì B2B chính cò trung gian đó mọi người.

Quay về citus data thì những khách hàng của họ đã cho ta thấy phần nào được khi nào chúng ta nên sử dụng citus rồi. Hầu hết các ứng dụng B2B đã có khái niệm về người thuê (tenant), khách hàng hoặc tài khoản được tích hợp vào mô hình dữ liệu của họ. Trong mô hình này, cơ sở dữ liệu phục vụ nhiều tenant, mỗi người trong số họ có dữ liệu tách biệt với những người thuê khác. Về khái niệm multi-tenancy thì mình lấy spiderum ra làm ví dụ nhé tuy là nó chỉ gần giống thôi. Mỗi người viết nằm trong nhóm top-user (thành viên nổi bật) sẽ có một domain riêng. Khi bạn vào trang cá nhân của họ thì lập tức spiderum sẽ trỏ tới domain riêng đó. Trong domain đó, mỗi cá nhân người dùng nổi bật sẽ có thể customs trang túy ý của họ và có tập dữ liệu riêng của họ mà không hề chung đụng với bất cứ người dùng nổi bật khác. Bạn hình dung mỗi thành viên nổi bật đó sẽ là một tenant và hệ thống gồm nhiều tenant sẽ là một hệ thống multi-tenancy.

Citus cung cấp đầy đủ SQL coverage cho dù nó có workload khá cao. Nó cũng cho phép bạn mở rộng cơ sở dữ liệu quan hệ của bạn đến hơn 100k tenants và nó bổ sung nhiều tính năng mới hỗ trợ multi-tenancy. Ví dụ như citus hỗ trợ việc đóng gói tenants lại nhằm đạt được hiệu suất với số lượng tenants lớn, bên cạnh đó nó cũng tối ưu việc sử dụng những nguồn dữ liệu chung cho những tenants có dùng chung để đơn giản hóa trong quá trình quản lý.
Đối với vấn đề tăng khả năng đáp ứng cho phép bạn mở rộng dữ liệu của tenant trên nhiều máy, dễ dàng tăng cpu, ram hay bộ nhớ. Trong tương lai, việc chia sẻ những cơ sở dữ liệu giống nhau giữa nhiều tenants sẽ hiệu quả hơn đối với quản lý phần cứng cũng như đơn giản hóa cơ sở dữ liệu.

Một số ưu điểm của citus đối với hệ thống multi-tenancy:
– Truy vấn nhanh trên tất cả các tenants
– Chia sẻ logic trong cơ sở dữ liệu thay vì trong tầng ứng dụng
– Lưu trữ được nhiều dữ liệu hơn so với single node PostgreSQL
– Mở rộng cơ sở dữ liệu nhưng vẫn giữa nguyên được dữ liệu SQL gốc ban đầu.
– Tăng hiệu năng với CCUs cao
– Phân tích tập dữ liệu nhanh- Dễ dàng mở rộng tập khách hàng mới thông qua đăng ký tenant
– Đóng gói resource để tái sử dụng cho những tập khách hàng nhỏ và lớn khác nhau.

Một điều nữa mà citus đáp ứng cho những nhà phát triển đó là Real-time Analytics (Xây dựng Bảng điều khiển phân tích thời gian thực). Có lẽ đây là một tính năng nổi tập và là ưu điểm hàng đầu mà các nhà phát triển hướng tới khi chọn citus đầu tiên. Vì cho dù có multi-tenancy thì các cơ sở dữ liệu khác cũng có thể làm được, nhưng nếu hướng đến big data và phân tích cơ sở dữ liệu thì có lẽ khách hàng sẽ nhắm tới PostgreSQL và Citus. Ở bài viết này mình chỉ tóm tắt một số nét chính của tính năng Real-time Analytics trong Citus thôi, còn chi tiết và demo mình sẽ đề cập trong bài viết khác nhé

Đầu tiên thì bạn hãy tưởng tượng bạn cần truy vấn với một lượng dữ liệu rất lớn từ cơ sở dữ liệu lên với hình thức realtime, tức là vài tích tắc hoặc một giây lại cần truy vấn dữ liệu lên. Với cơ sở dữ liệu thông thường thì thật sự khó đáp ứng vì hệ thống sẽ mất một khoảng thời gian xử lý lọc, sắp xếp, liên kết bảng dữ liệu để có thể đưa lên cho người dùng, mà nó lại xảy ra một cách realtime, lặp đi lặp lại thì bạn nghĩ hệ thống nào chịu cho nổi.

Còn một điểm đang ghi nhận nữa là vấn đề tiến trình sự kiện của citus, ví dụ bạn có một khối lượng bảng dữ liệu rất lớn với nhiều node trên nhiều trạm cơ sở dữ liệu khác nhau, khi có một dữ liệu thay đổi hoặc thêm mới, bạn nghĩ bạn sẽ phải cập nhập và thông báo cho các thành phần còn lại không.
Thật vậy citus có một cơ chế event (sự kiện) và rollup data (cuộn dữ liệu) giúp bạn phát tín hiện cũng như sắp xếp lại dữ liệu khi có thay đổi hoặc thêm mới trên toàn mạng lưới cơ sở dữ liệu một cách realtime luôn.

Bên cạnh việc truy vấn cập nhập dữ liệu một cách đồng thời với chia thành nhiều luồng xử lý, sẽ khiến cho tốc độ truy vấn cũng như ghi và nhận được tăng cao. Việc chia cơ sở dữ liệu theo chiều ngang và đánh index theo thuật toán B-tree cũng giúp cho tốc độ xử lý của citus đáng kinh ngạc. Đúng nghĩa là realtime. Và cái realtime này lại được hỗ trợ trên một dashboard (bảng điều kiển) giúp người dùng có thể phân tích dữ liệu một cách dễ dàng hơn.

Có lợi thì cũng có hại, có ưu điểm thì ắt cũng có nhược điểm, dưới đây là một số nhượng điểm và những cân nhắc khi chọn citus vào dự án của mình.

Đầu tiên thì bạn thử hỏi xem ứng dụng có bạn có cần thiết áp dụng hệ cơ sở dữ liệu phân tán không, nó tối ưu thì tối ưu thật đó nhưng chi phí cũng như công sức bỏ ra để handle nó không phải là nhỏ, nếu bạn không có nhu cầu scale out (mở rộng) với nhiều node, nhiều worker thì tốt nhất chẳng nên đánh đổi làm gì. Vì thực tế để bảo trì và vận hành hệ cơ sở dữ liệu này rất phức tạp và cần phải có kiến thức không chỉ là Dev hay DBA (Database Administrator) mà còn phải mạnh cả DevOps (Develope + Operation) nữa.

Nếu bạn không có nhu cầu phân tích dữ liệu lớn, không có yêu cầu gì về vấn đề realtime analytics thì bạn phân tích dữ liệu offline là đủ, cũng chẳng cần thiết giết gà dùng dao mổ trâu làm gì. Vừa khó khăn trong vấn đề tiếp cận công nghệ mới, vừa chưa chắc đúng mà có khi còn phân tích dữ liệu sai luôn ý

Nếu ứng dụng của bạn không cần xử lý đồng thời quá nhiều (a large number of concurrent users) thì bạn cũng chẳng cần quan tâm citus là gì cho mệt. Vì thực sự implement và maintain citus rất cực khổ cho dev. Từ việc handle max_connection, pool_size, dead_lock, rồi linq để có thể truy vấn được dữ liệu khi phân tán như vậy lên tầng ứng dụng rất mất thời gian cũng như công sức. Đó còn chưa kể khi mình tự hanlde hết thì sẽ phát sinh nhiều rủi ro trong logic của bạn.

Nếu truy vấn dữ liệu của ban thu thập ETL trả về nhiều kết quả dữ liệu hơn thay vì chỉ tổng hợp và phân tích dữ liệu. Nói sơ qua về ETL (Extract Transform Load) thì nó là quá trình “How to” dữ liệu được đưa vào từ các nguồn dữ liệu vào kho dữ liệu. Extracts dữ liệu tức là đi thu gom dữ liệu từ nhiều nguồn khác nhau. Transforms dữ liệu tức là chuyển đổi dữ liệu từ mục đích này sang much đích khác nhằm có được dữ liệu nghiệp vụ và phân tích chúng.DW hoặc DWH (Data Warehouse) là kho lưu trữ trung tâm của dữ liệu tích hợp từ một hoặc nhiều nguồn khác nhau.

Nhìn hình trên bạn sẽ hiểu quá trình thu thập và phân tích dữ liệu diễn ra như thế nào. Vậy nên khi áp dụng citus thì quá trình thu thập ETL này sẽ gặp khó khăn một chút, do cơ sở dữ liệu phân tán mà. Nên bạn hãy cân nhắc!

Trên đây là một số phân tích sơ bộ về Citus Data – Cơ sở dữ liệu phân tán dựa trên PostgreSQL. Hi vọng có thể giúp bạn hiểu được tại sao và khi nào dùng chúng.

Bài viết tới mình sẽ đi kỹ hơn về cách xây dựng Citus Data với Net core. Hi vọng được ủng hộ.