Data Best Practices (Phần 1): Thiết kế Kiến trúc và Công cụ
Mở đầu loạt bài viết chuyên sâu về xử lý dữ liệu, chúng ta sẽ cùng tìm hiểu cách xây dựng kiến trúc và lựa chọn công cụ, framework cho nền tảng dữ liệu qua bài viết sau đây.
Đọc thêm Series Data Best Practices:
Phần 1: Thiết kế kiến trúc và các công cụ
Phần 2: Xây dựng các luồng xử lý dữ liệu
Phần 3: Kiểm tra và chuẩn hóa dữ liệu
Phần Cuối: Điều phối và tự động hoá luồng dữ liệu
Tầm quan trọng của Data Engineering
Data Engineering là công việc liên quan đến thiết kế, xây dựng, quản lý các hệ thống dữ liệu lớn và phức tạp. Data Engineering có vai trò quan trọng trong việc hỗ trợ các hoạt động phân tích dữ liệu, khoa học dữ liệu và trí tuệ nhân tạo.
- Data Engineering giúp tối ưu hóa hiệu năng và chi phí của các hệ thống dữ liệu, giảm thiểu thời gian truy vấn, tăng khả năng mở rộng và tiết kiệm tài nguyên.
- Data Engineering giúp đảm bảo chất lượng và tính nhất quán của dữ liệu.
- Data Engineering giúp cung cấp dữ liệu cho các bên liên quan một cách an toàn và hiệu quả.
Trước khi bắt đầu…
Trước khi bắt tay vào xây dựng hệ thống dữ liệu, chúng ta cần xem xét đến các yếu tố sau:
- Căn chỉnh cấu trúc dữ liệu với chiến lược kinh doanh: Kiến trúc hỗ trợ tầm nhìn, sứ mệnh và mục tiêu của tổ chức, đồng thời phù hợp với các chỉ số hiệu suất (KPI) và các chỉ số đo lường sự thành công của doanh nghiệp.
- Xác định tiêu chuẩn và quản trị dữ liệu: Quản trị dữ liệu là tập hợp các chính sách, quy trình, vai trò và trách nhiệm đảm bảo việc sử dụng dữ liệu hiệu quả và hiệu quả trong toàn tổ chức. Tiêu chuẩn và quản trị dữ liệu giúp đảm bảo rằng dữ liệu nhất quán, chính xác, đầy đủ và đáng tin cậy.
- Thiết kế cho hệ thống có khả năng mở rộng và linh hoạt: Kiến trúc có khả năng đáp ứng sự tăng trưởng và thay đổi, sự đa dạng, tốc độ và tính xác thực của dữ liệu theo thời gian, có khả năng thích ứng với các yêu cầu và công nghệ kinh doanh đang thay đổi mà không ảnh hưởng đến hiệu suất hoặc chức năng của hệ thống dữ liệu.
- Tối ưu hóa hiệu suất và hiệu quả: Kiến trúc dữ liệu sẽ cho phép truy cập dữ liệu nhanh chóng và dễ dàng cho các mục đích khác nhau như phân tích, báo cáo, ra quyết định hoặc quy trình vận hành. Kiến trúc dữ liệu giúp giảm thiểu chi phí và độ phức tạp, tận dụng các công nghệ và kỹ thuật phù hợp để tối ưu hóa việc lưu trữ, xử lý, tích hợp và phân phối dữ liệu.
Trong loạt bài viết này, chúng ta sẽ cùng đi qua toàn bộ quá trình xây dựng hệ thống dữ liệu, từ việc chuẩn bị, thiết kế đến xây dựng hệ thống hoàn chỉnh.
Bước 1: Xây dựng kiến trúc và lựa chọn công cụ, framework
Trong những năm gần đây, kiến trúc cho các nền tảng dữ liệu thay đổi liên tục, các khái niệm mới, phương pháp tiếp cận mới được giới thiệu, phát triển và áp dụng vào thực tế một cách nhanh chóng. Có thể kể đến rất nhiều công nghệ và kỹ thuật được ra mắt chỉ trong vài năm như Lakehouse, Data Fabric, Data Mesh…
Khi xây dựng kiến trúc và chọn lựa công cụ, framework, ta cũng nên cân nhắc, xem xét đến cả các phương pháp mới. Trong thực tế, công sức để phát triển nền tảng dữ liệu ban đầu thường rất nhỏ nếu so sánh với công sức duy trì, vận hành và tiếp tục phát triển các chức năng. Vận dụng những phương pháp hiện đại có thể giúp ta tiết kiệm được chi phí cả về phát triển lẫn vận hành hệ thống.
Kiến trúc logical cho hệ thống dữ liệu
1. Nguyên tắc khi xây dựng và lựa chọn công cụ:
Khi xây dựng và chọn lựa công cụ cho nền tảng dữ liệu, cần chú ý những nguyên tắc sau đây:
-
Linh hoạt: Sự linh hoạt của kiến trúc là điều cần thiết cho bất kỳ nền tảng dữ liệu nào cần có khả năng theo kịp nhu cầu thay đổi của doanh nghiệp. Hệ thống phải được mô-đun hoá để có thể thêm hoặc bớt các thành phần khi cần. Điều này sẽ giúp việc điều chỉnh dễ dàng hơn với những thay đổi phát sinh. Ta có thể thực hiện bằng cách tích hợp nhiều công cụ vào nền tảng một cách đồng thời như Spark, Flink và Beam. Để làm hệ thống linh hoạt, cần tận dụng tối đa khả năng củaServerless, nó sẽ giúp giảm chi phí, cải thiện khả năng mở rộng và đơn giản hóa việc quản lý. Serverless cũng giúp cải thiện khả năng mở rộng bằng cách tự động tăng hoặc giảm quy mô tài nguyên dựa trên nhu cầu. Điều này có thể giúp đảm bảo rằng nền tảng dữ liệu của bạn luôn hoạt động, ngay cả trong thời kỳ nhu cầu cao nhất.
-
Tách rời xử lý dữ liệu khỏi hạ tầng: Tách rời hạ tầng và xử lý dữ liệu là một cách thiết kế giúp hệ thống trở nên linh hoạt và có thể mở rộng hơn. Bằng cách tách riêng việc xử lý khỏi cơ sở hạ tầng, ta có thể thay đổi một cách tách biệt các gói xử lý mà không làm ảnh hưởng lẫn nhau. Điều này giúp việc quản lý dễ dàng hơn và đáp ứng các thay đổi trong nhu cầu kinh doanh một cách nhanh chóng. Có một vài cách khác nhau để tách rời cơ sở hạ tầng và đường ống dẫn dữ liệu.
- Một cách là sử dụng nền tảng dữ liệu dựa trên đám mây. Các nền tảng dựa trên đám mây mang lại một số lợi thế, bao gồm khả năng mở rộng, tính linh hoạt và dễ sử dụng.
- Một cách khác để tách rời hạ tầng và luồng xử lý dữ liệu là sử dụng kiến trúc microservices. Microservices là các dịch vụ nhỏ, riêng biệt có thể được phát triển và triển khai độc lập. Điều này giúp dễ dàng thay đổi các dịch vụ riêng lẻ mà không ảnh hưởng đến phần còn lại của hệ thống. Các thành phần này được triển khai trên nền tảng hỗ trợ container như Docker, Kubernetes.
- Thiết kế hệ thống có thể thay đổi một cách dễ dàng bằng cách sử dụng file cấu hình để điều hướng luồng xử lý, xây dựng các abstract function để có thể dễ dàng thừa kế và mở rộng.
-
Tự động hoá: Có nhiều cách để tự động hóa và tránh các tác vụ thủ công khi thiết kế nền tảng dữ liệu. Dưới đây là một số phương pháp phổ biến nhất:
- Sử dụng các công cụ và nền tảng tự động hóa: Hiện có nhiều công cụ và nền tảng tự động hóa khác nhau, chẳng hạn như Informatica PowerCenter, IBM InfoSphere DataStage và Microsoft SQL Server Integration Services (SSIS). Những công cụ này có thể được sử dụng để tự động hóa nhiều tác vụ liên quan đến dữ liệu, chẳng hạn như trích xuất, chuyển đổi và tải dữ liệu.
- Sử dụng các dịch vụ dựa trên đám mây: Các dịch vụ dựa trên đám mây có thể là một cách tuyệt vời để tự động hóa các tác vụ liên quan đến dữ liệu. Ví dụ: Amazon Web Services (AWS) cung cấp một số dịch vụ có thể được sử dụng để tự động hóa quá trình xử lý dữ liệu, chẳng hạn như Amazon Kinesis và Amazon Redshift.
- Sử dụng các công cụ và công nghệ mã nguồn mở: Có một số công cụ và công nghệ nguồn mở có thể được sử dụng để tự động hóa các tác vụ liên quan đến dữ liệu. Ví dụ: Apache Hadoop và Apache Spark là hai công cụ nguồn mở phổ biến có thể được sử dụng để xử lý lượng lớn dữ liệu.
-
Tập trung vào độ tin cậy của hệ thống:
- Giám sát hệ thống: Điều quan trọng là phải giám sát chặt chẽ nền tảng dữ liệu để xác định sớm bất kỳ vấn đề nào. Điều này có thể được thực hiện bằng cách sử dụng nhiều công cụ và kỹ thuật giám sát.
- Sử dụng tự động hóa: Tự động hóa có thể giúp cải thiện độ tin cậy của nền tảng dữ liệu bằng cách giảm nhu cầu can thiệp thủ công. Điều này có thể bao gồm tự động hóa các tác vụ như tải dữ liệu, chuyển đổi dữ liệu và phân tích dữ liệu.
- Có kế hoạch cho xử lý lỗi: Cho dù nền tảng dữ liệu được thiết kế và bảo trì tốt đến đâu thì vẫn luôn có khả năng bị lỗi. Điều quan trọng là phải có sẵn một kế hoạch để xử lý các lỗi, chẳng hạn như có một kế hoạch sao lưu để lưu trữ và khôi phục dữ liệu.
2. Những điểm trọng tâm khi thiết kế và xây dựng:
Khi bắt đầu vào bước thiết kế và xây dựng hệ thống xử lý dữ liệu, ta cần cân nhắc và quyết định các lựa chọn. Một số lựa chọn ảnh hưởng đến toàn hệ thống ta cần xác định là:
- Lựa chọn stack công nghệ: Bao gồm lựa chọn framework, nhà cung cấp giải pháp, công cụ,… Đây là một quy trình phức tạp gồm nhiều yếu tố, bao gồm nhu cầu kinh doanh, ngân sách và chuyên môn kỹ thuật của đội. Bắt đầu bằng cách xác định nhu cầu nghiệp vụ, hãy đặt câu hỏi 'Ta đang cố gắng đạt được điều gì với nền tảng dữ liệu của mình?'. Khi biết được mục tiêu, ta có thể bắt đầu xác định các thành phần cần thiết. Sau đó, ta cần đánh giá chuyên môn kỹ thuật của đội phát triển. Một số kỹ thuật phức tạp hơn và đòi hỏi thời gian, kinh nghiệm nhiều hơn. Điều quan trọng là kỹ thuật mà ta có thể sử dụng một cách thành thạo. Cho dù tương lai có nhiều công cụ mới ra đời, thì hầu hết các công cụ hiện hữu vẫn hoàn toàn có thể đáp ứng được nhu cầu.
- Xác định kiểu trích xuất dữ liệu phù hợp vào nền tảng: Nó có thể là batch, stream hay CDC tuỳ theo nhu cầu. Nó cũng bao gồm việc cần phải biết dữ liệu nguồn ở đâu? Tần suất dữ liệu được nhập vào là bao lâu? Thời gian thực hay theo lịch trình? Dữ liệu được bảo mật như thế nào? Nó có được nhập qua một kết nối an toàn không? Quá trình nhập dữ liệu có cần tuân theo quy định nào không?
- Xác định cách thức xử lý dữ liệu: Loại xử lý dữ liệu được sử dụng có thể có tác động đáng kể đến tính chính xác, hiệu quả và bảo mật của dữ liệu. Có nhiều kiểu xử lý dữ liệu khác nhau, mỗi kiểu đều có ưu và nhược điểm riêng. Dựa vào nhu cầu nghiệp vụ, ta có thể xác định được công cụ phù hợp. Ví dụ: Nếu cần xử lý một lượng lớn dữ liệu, thì Apache Hadoop hoặc Apache Spark có thể là một lựa chọn tốt. Nếu bạn cần xử lý dữ liệu trong thời gian thực, thì có thể chọn Google Cloud Dataproc hoặc Amazon EMR. Và nếu cần xử lý dữ liệu với chi phí hợp lý trên Azure, thì Microsoft Azure HDInsight có thể là một lựa chọn phù hợp cho bạn.
- Xác định nhu cầu lưu trữ: Trong phần lớn trường hợp, data lake là một lựa chọn tốt và đủ dùng. Tuy nhiên, ta cần cân nhắc nhiều yếu tố khi xác định cách thức lưu trữ dữ liệu: Ta cần lưu trữ loại dữ liệu nào? Ta cần lưu trữ bao nhiêu dữ liệu? Ta cần truy cập dữ liệu bao lâu một lần? Mức độ quan trọng của dữ liệu?
3. Xây dựng chi tiết phương án thiết kế:
Sau khi các nhu cầu đã được xác định một cách rõ ràng, chúng ta sẽ cần cân nhắc cụ thể hơn cho từng thành phần trong nền tảng dữ liệu để tiến hành xây dựng. Một số chi tiết cho hệ thống ta cần xác định là:
-
Xác định các tiêu chí đo đạc, giám sát cho các thành phần của nền tảng: tích hợp dữ liệu, lưu trữ dữ liệu, xử lý dữ liệu.
-
Xác định cách thức xử lý lỗi và đảm bảo luồng xử lý lỗi sẽ đồng nhất trong nền tảng. Ví dụ: Xử lý dữ liệu bị lỗi khi tích hợp vào hệ thống.
-
Xác định hệ thống quản lý mã nguồn như là Git, Bitbucket, v.v…
-
Công cụ và môi trường dùng để phát triển và triển khai.
-
Xác định tiêu chuẩn dữ liệu.
-
Thực hiện đánh giá cẩn thận kiến trúc theo các tiêu chí sau:
- Bảo mật
- Linh hoạt
- Khả năng mở rộng
- Tính sẵn sàng
-
Quản lý schema: Quản lý schema là một khía cạnh quan trọng của thiết kế và triển khai data pipeline. Chúng ta sẽ cùng tìm hiểu chi tiết hơn về quản lý schema trong phần kế tiếp của bài viết.
4. Quản lý schema:
Một trong những điểm quan trọng của việc xây dựng một nền tảng dữ liệu hiện đại, đó là việc quản lý schema được thực hiện một cách tập trung, điều này trái ngược với những nền tảng dữ liệu xây dựng trên Hadoop hay các cơ sở dữ liệu không quan hệ. Quản lý schema rất quan trọng vì nó giúp đảm bảo tính chính xác, nhất quán và toàn vẹn của dữ liệu.
Chức năng chính của quản lý schema tập trung bao gồm:
- Tạo và duy trì các schema
- Tài liệu mô tả, giải thích về schema
- Quản lý thay đổi schema
- Các cấu hình cho việc thay đổi trong schema đối với dữ liệu vào và ra
- Tìm và khắc phục các sự cố lỗi do schema
Quản lý schema thích hợp có thể giúp ngăn ngừa hỏng dữ liệu, cải thiện bảo mật dữ liệu, giúp quản lý và sử dụng dữ liệu dễ dàng hơn.
Một số lợi ích của việc quản lý schema:
- Tăng độ chính xác: Một schema được xác định rõ giúp đảm bảo dữ liệu được nhập và lưu trữ chính xác. Điều này quan trọng đối với bất kỳ cơ sở dữ liệu nào, nhưng nó đặc biệt cấp thiết đối với cơ sở dữ liệu lưu trữ dữ liệu nhạy cảm hoặc bí mật.
- Tính nhất quán: Một schema cũng giúp đảm bảo rằng dữ liệu nhất quán trong cơ sở dữ liệu. Điều này có nghĩa là cùng một dữ liệu được lưu trữ theo cùng một cách trong tất cả các bảng và cột. Tính nhất quán rất quan trọng để đảm bảo dữ liệu chính xác và đáng tin cậy.
- Tính toàn vẹn: Một schema có thể giúp bảo vệ tính toàn vẹn của dữ liệu bằng cách thực thi các ràng buộc đối với dữ liệu. Ví dụ: schema có thể được sử dụng để đảm bảo rằng một cột chỉ có thể chứa các giá trị nhất định hoặc một hàng không thể bị xóa nếu nó được tham chiếu bởi một hàng khác.
- Bảo mật: Một schema cũng có thể được sử dụng để kiểm soát quyền truy cập vào dữ liệu. Ví dụ, một schema có thể được sử dụng để tạo các vai trò người dùng khác nhau với các quyền khác nhau để truy cập vào các bảng hoặc cột khác nhau.
- Tài liệu: Một schema có tài liệu tốt có thể giúp các nhà phát triển và những người dùng khác hiểu cấu trúc của cơ sở dữ liệu dễ dàng hơn. Điều này có thể tiết kiệm thời gian và công sức khi khắc phục sự cố hoặc thực hiện các thay đổi đối với cơ sở dữ liệu.
Nhìn chung, quản lý schema là một phần quan trọng của quản trị cơ sở dữ liệu. Bằng cách làm theo các phương pháp quản lý schema tốt, bạn có thể giúp đảm bảo tính chính xác, nhất quán, toàn vẹn, bảo mật và khả năng sử dụng dữ liệu của mình.
Sau đây là một số công cụ phổ biến để quản lý schema:
- Confluent Schema Registry: Confluent Schema Registry là một dịch vụ đăng ký schema phân tán, có thể mở rộng và có tính sẵn sàng cao. Nó được xây dựng dựa trên Apache Kafka và cung cấp API RESTful để lưu trữ, truy xuất và quản lý các schema.
- AWS Glue Schema Registry: AWS Glue Schema Registry là dịch vụ đăng ký schema được quản lý toàn phần và được tích hợp với Danh mục dữ liệu AWS Glue.
- Google Cloud Dataflow Schema Registry: Google Cloud Dataflow Schema Registry là một dịch vụ đăng ký schema được quản lý đầy đủ và được tích hợp với Google Cloud Dataflow.
- Apache Avro Schema Registry: Apache Avro Schema Registry là một dịch vụ đăng ký schema được xây dựng dựa trên Apache Avro.
- Kafdrop: Kafdrop là bảng điều khiển dựa trên web dành cho Apache Kafka. Nó cung cấp nhiều tính năng, bao gồm trình xem Schema egistry.
Trên đây là những nguyên tắc, yếu tố quan trọng cần xác định khi thiết kế và xây dựng hệ thống xử lý dữ liệu. Hi vọng các bạn đã phần nào nắm được những kiến thức trọng yếu khi xây dựng kiến trúc và lựa chọn công cụ, framework cho nền tảng dữ liệu.