Xin chào mừng bạn đã ghé thăm blog của Nguyễn Văn Tiến!.Chúc bạn sức khỏe, niềm vui và an lành!.

Thứ Tư, 19 tháng 10, 2016









TÀI LIỆU TÌM HIỂU VỀ KAFKA VÀ VẤN ĐỀ LIÊN QUAN






NỘI DUNG

1.      Kafka

1.1.          Bài toán đặt ra

Xét một ví dụ đơn giản, trong thương mại điện tử có hai giao dịch xảy ra lần lượt là: xác nhận đơn hàng và hủy đơn hàng. Các trạng thái này chuyển thành các message và gửi lần lượt vào hệ thống để xử lý. Nhưng nếu message hủy lại được xử lý xong trước, như vậy message xác nhận xử lý sau thì sẽ gây ra lỗi về luồng nghiệp vụ. Vì việc hủy được thực hiện xong trước dẫn đến việc xác nhận đơn hàng không còn dữ liệu để thực hiện.

1.2.          Message queue

Vì hiển nhiên queue thì phải FIFO, nên thứ tự vào - ra được đảm bảo rồi. Cái gì vào trước thì ra trước. Tất cả các message queue đều đảm bảo điều đó.
Nhưng thứ tự mà người thiết kế mong muốn không chỉ đơn giản thứ tự vào ra mà còn là thứ tự của các quá trình xử lý nối tiếp nhau, dữ liệu vào trước sẽ được xử lý trước. Hệ thống giao dịch chứng khoán hay giao dịch thương mại chính là ví dụ điển hình cho việc cần phải thiết kế hệ thống sao cho các quá trình xử lý nối tiếp nhau. Kafka ngoài việc đảm bảo được yếu tố FIFO của message queue, thì có còn đảm bảo được thứ tự xử lý nối tiếp của dữ liệu.

1.3.          Message broker

Một giải pháp thường được áp dụng trước đây là lưu dữ liệu vào các temporary table trong database. Tần xuất trao đổi message cao sẽ làm tăng load của database, giảm performance đáng kể. Trong môi trường multithread, database cần có cơ chế lock. Lock cũng làm giảm performance.
Giải pháp ở đây là thay vì các liên kết trực tiếp, thay vì các thành phần phải biết nhau thì sử dụng một liên kết trung gian qua một broker(message broker).
Với sự tham gia của broker(message broker), thì producer sẽ không hề biết consumer. Producer chỉ việc gửi message đến các queue trong broker(message broker), consumer chỉ việc đăng ký nhận message từ các queue này. Việc producer và consumer có nhiều khác nhau về system, environtment, language code,… thì vẫn có thể truyền-nhận thông tin một cách dễ dàng. Ngoài ra, đảm bảo được các yếu tố về security khi mà nguồn gửi và nguồn nhận không biết nhau.
Ví dụ: Hệ thống lưu trữ và xử lý log, hệ thống giao dịch chứng khoán.

1.4.          Khái niệm về Kafka

Kafka là một hệ thống xử lý message hàng đợi(message queue), nhằm thu thập dữ liệu đầu vào, được xây dựng theo cơ chế publish-subscribe , thông qua các brokers khi mà các nguồn cung cấp(producer) và nguồn tiếp nhận (consumer) không biết nhau.
Mã nguồn Kafka được thiết kế cho việc xử lý dữ liệu lớn khi đọc/ghi dữ liệu, giảm độ trễ trong quá trình truyền tải dữ liệu.
Hỗ trợ triển khai hệ thống thu thập, xử lý dữ liệu theo các mô hình:
·        Phân tán(distribute)
·        Phân chia(partion)
·        Đồng bộ(replicate)

1.5.           Cơ chế hoạt động

Kafka thường được triển khai theo mô hình cluster (tham khảo phần 2 – mô hình Clusering).

1.5.1.     Một số khái niệm

Topic: mỗi dữ liệu đến hệ thống sẽ thuộc một nhóm dữ liệu đặc thù được gọi là topic.
Partitions: Một topic có một hoặc nhiều partition.
Partitiion offset: Mỗi một partitioned message là duy nhất và được đánh số id, được gọi là offset.
Replicas (Replicas of partition): Là một bản backup dữ liệu của partition, được sử dụng để phòng tránh việc mất dữ liệu. Nó không được đọc và ghi dữ liệu.
Broker: là 1 node trong cluster(1 node trong cluster là một cluser server). Mỗi broker có thể quản lý hàng trăm megabyte đọc/ghi dữ liệu một giây từ hàng nghìn người dùng một lúc. Một cluster có thể mở rộng một cách linh động mà không gây ra tình trạng dừng hệ thống.
+ Nếu hệ thống có simple-broker: mỗi simple-broker sẽ có từ 0 hoặc nhiều partitions trong mỗi topic.
+ Nếu hệ thống có N partitions và có N broker thì trong 1 topic thì mỗi broker sẽ có 1 partitions.
+ Nếu hệ thống có N partitions và có (N + M) broker thì N broker đầu tiên, mỗi broker sẽ có 1 partitions, các broker khác sẽ không có partitions.
+ Nếu hệ thống có N partitions và có (N-M) broker thì một broker sẽ có 1 hoặc nhiều partitions. Việc này không được khuyến cáo do việc phân phối tải không đồng đều giữa các broker.
Leader (Kafka broker master): Là một node thực hiện tất cả các việc dọc và ghi dữ liệu cho các partition. Trong N partition trong Kafka cluster sẽ có một máy chủ (Kafka broker) hoạt động như là leader.
Follower: Là những node khác node leader, một khi node leader hỏng thì một Follower sẽ được lựa chọn làm node leader. Nó hoạt động như một consumer bình thường, thực hiện cơ chế pull dữ liệu và lưu trữ dữ liệu cho riêng nó.
Procuder: Hệ thống gởi dữ liệu đến Kafka.
Consumer: Hệ thống tiếp nhận đầu ra từ Kafka.
Zookeeper trong Apache Kafka: Được sử dụng để quản lý và điều phối các Kafka broker.
+ Zookeeper được sử dụng chủ yếu cho việc thông báo cho procuder và consumer biết thông tin của một broker mới thêm vào hoặc thông tin của một Kafka broker lỗi trong hệ thống Kafka system.
+ Sau mỗi thông báo của Zookeeper về việc broker thêm vào hay broker bị lỗi thì procuder và consumer sẽ quyết định và bắt đầu phối hợp với một broker khác.
Việc truyền tải dữ liệu giữa các hệ thống khác với Kafka broker được thực hiện thông qua giao thức TCP; việc phát triển, phân tích dữ liệu có thể thực hiện trên nhiều nền tảng ngôn ngữ lập trình khác nhau.

1.5.2.     Cơ chế hoạt động

Như hình trên, ta có bốn phân vùng dữ liệu trong một topic. Các phân vùng có thể dịch chuyển trên các máy chủ khác nhau, và các topic có thể mở rộng một cách dễ dàng. Mỗi phân vùng dữ liệu có thể được đồng bộ sang một broker khác để tăng tính sẵn sàng của dữ liệu.
-         Các hệ thống produccer có thể thực hiện ghi dữ liệu vào các phân vùng dữ liệu theo cơ chế round-robin (tham khảo phần 3 – hệ thống cân bằng tải).
Trong trường hợp có nhiều producer, mỗi producer có thể chọn ngẫu nhiên một phân vùng để tiến hành ghi dữ liệu, việc này sẽ làm giảm số lượng kết nối đến mỗi broker.
-         Việc phân vùng dữ liệu cho phép những consumer đọc dữ liệu từ những phần khác nhau của một topic; hệ thống comsumer có thể đọc dữ liệu theo cơ chế round-robin(tham khảo phần 3 – hệ thống cân bằng tải) giữa các broker khác nhau để phục vụ mục đích cân bằng tải cho hệ thống.
Kafka thực hiện lưu trữ các dữ liệu vào ố cứng và sao chép một bản tương tự để tăng khả năng chịu lỗi của hệ thống.
-         Apache Kafka bao gồm Java client và Scala client trong việc liên kết với Kafka cluster.

1.5.3.     Sự phụ thuộc của Apache Kafka vào Zookeeper

Các thông tin của Zookeeper server được chỉa sẻ qua một cụm Zookeeper cluster. Các thông tin cơ bản của Apache Kafka được lưu trữ trong Zookeeper như: thông tin về các topic, brokers, consumer offset, ….
Tất cả các thông tin được lưu trữ trong Zookeeper sẽ được đồng bộ dữ liệu giữa các server trong cụm Zookeeper.
Một khi xảy ra lỗi tại Kafka broker/Zookeeper thì sẽ không làm ảnh hưởng đến trạng thái của Kafka cluster. Dữ liệu sẽ được khôi phục ngay lập tức khi một Zookeeper được restart, Kafka sẽ không có thời gian chết. Một Kafka broker master mới được Zookeeper server lựa chọn lại khi Kafka broker master bị hỏng.
**** Dưới đây là phần tham khảo các vấn đề liên quan

2.      Mô hình Clusering

2.1.          Bài toán đặt ra

Chúng ta đều biết các máy chủ là trái tim của của mạng máy tính, nếu máy chủ mạng hỏng, hoạt động của hệ thống sẽ bị ngưng trệ. Điều đáng tiếc là dù các hãng sản xuất đã cố gắng làm mọi cách để nâng cao chất lượng của thiết bị, nhưng những hỏng hóc đối với các thiết bị mạng nói chung và các máy chủ nói riêng là điều không thể tránh khỏi.
Do vậy, vấn đề đặt ra là cần có một giải pháp để đảm bảo cho hệ thống vẫn hoạt động tốt ngay cả khi có sự cố xảy ra đối với máy chủ mạng, và công nghệ clustering là câu trả lời cho vấn đề này. Đề tài này giới thiệu nguyên lý, phân tích và triển khai một số giải pháp clustering đang được áp dụng cho các hệ thống mạng máy tính lớn với hi vọng có thể giúp chúng ta hiểu rõ hơn về công nghệ tưởng như đơn giản nhưng thực tế khá phức tạp này.

2.2.          Công nghệ Clustering

Clustering là một kiến trúc nhằm đảm bảo nâng cao khả năng sẵn sàng cho các hệ thống mạng máy tính.
Clustering cho phép sử dụng nhiều máy chủ kết hợp với nhau tạo thành một cụm có khả năng chịu đựng hay chấp nhận sai sót (fault-tolerant) nhằm nâng cao độ sẵn sàng của hệ thống mạng.
Cluster là một hệ thống bao gồm nhiều máy chủ được kết nối với nhau theo dạng song song hay phân tán và được sử dụng như một tài nguyên thống nhất.
Mô hình song song
Mô hình phân tán
Nếu một máy chủ ngừng hoạt động do bị sự cố hoặc để nâng cấp, bảo trì, thì toàn bộ công việc mà máy chủ này đảm nhận sẽ được tự động chuyển sang cho một máy chủ khác (trong cùng một cluster) mà không làm cho hoạt động của hệ thống bị ngắt hay gián đoạn. Quá trình này gọi là “fail-over”; và việc phục hồi tài nguyên của một máy chủ trong hệ thống (cluster) được gọi là “fail-back”.
Việc thiết kế và lắp đặt các cluster cần thoả mãn các yêu cầu sau:
·        Yêu cầu về tính sẵn sàng cao (High availability).
·        Yêu cầu về độ tin cậy cao (reliability).
·        Yêu cầu về khả năng mở rộng được (scalability).
Ba yêu cầu trên được gọi tắt là RAS (ReliabilityAvailabilityScalability), những hệ thống đáp ứng được ba yêu cầu trên được gọi là hệ thống RAS (cần phân biệt với Remote Access Service là dịch vụ truy cập từ xa).
Kỹ thuật Clustering được chia làm 2 loại:
·        Cluster: sử dụng phía backend(trong tài liệu này phần 1 sử dụng kỹ thuật Cluster này)
·         Network Load Balancing (NLB): sử dụng phía frontend
Node: Là một server thuộc một Cluster nào đó mà trên đó các ứng dụng, một hệ thống Cluster gồm nhiều node.

3.      Hệ thống cân bằng tải

3.1.          Khái niệm cân bằng tải

Cân bằng tải là một phương pháp phân phối khối lượng tải trên nhiều máy tính hoặc một cụm máy tính để có thể sử dụng tối ưu các nguồn lực, tối đa hóa thông lượng, giảm thời gian đáp ứng và tránh tình trạng quá tải trên máy chủ.

3.2.          Các lợi ích khi sử dụng phương pháp cân bằng tải

-         Tăng khả năng đáp ứng, tránh tình trạng quá tải trên máy chủ
-         Tăng độ tin cậy và khả năng dự phòng cho hệ thống:
-         Tăng tính bảo mật cho hệ thống

3.3.          Các thuật toán cân bằng tải

Có rất nhiều thuật toán cân bằng tải được sử dụng, sau đây là các thuật toán cân bằng tải phổ biến nhất:
Thuật toán Round Robin:
Đây gọi là thuật toán luân chuyển vòng, các máy chủ sẽ được xem ngang hàng và sắp xếp theo một vòng quay. Các truy vấn dịch vụ sẽ lần lượt được gửi tới các máy chủ theo thứ tự sắp xếp.
Ví dụ:
 Cấu hình một cụm Cluster bao gồm 03 máy chủ: A, B, C.
Yêu cầu dịch vụ thứ nhất sẽ được gửi đến máy chủ A.
Yêu cầu dịch vụ thứ hai sẽ được gửi đến máy chủ B.
Yêu cầu dịch vụ thứ ba sẽ được gửi đến máy chủ C.
Yêu cầu dịch vụ thứ tư sẽ lại được gửi cho máy chủ A….
Thuật toán Weighted Round Robin:
Bản chất giống như thuật toán Round Robin, tuy nhiên chúng ta có thể cấu hình cho một máy chủ nào đó thường xuyên được sử dụng hơn.
Thuật toán Least Connection:
Đây là thuật toán dựa trên tính toán số lượng kết nối để thực hiện cân bằng tải cho máy chủ, nó sẽ tự động lựa chọn máy chủ với số lượng kết nối đang hoạt động là nhỏ nhất.
Thuật toán Weights Least Connection:
Bản chất giống thuật toán Least Connection, nhưng chúng ta có thể cấu hình ưu tiên cho một máy chủ trong cụm máy chủ hoạt động.
Thuật toán Least Response Time:
Đây là thuật toán sử dụng phương pháp thời gian đáp ứng ít nhất, lựa chọn dịch vụ trên máy chủ với thời gian đáp ứng là thấp nhất.
Ngoài ra còn có rất nhiều thuật toán cân bằng tải khác tùy theo phần mềm hoặc phần cứng cân bằng tải được sử dụng.

4.     Cơ chế publish-subscribe

4.1.          Bài toán về vấn đề Realtime (cập nhật thời gian thực)

Ví dụ: các ứng dụng Chat hiện tại, việc giao tiếp giữa những người chat với nhau đòi hỏi thông tin phải cập nhật liên tục và tự động đẩy đến cho các người dùng còn lại. Hay việc cần thống báo đến các bên liên quan khi hệ thống có dữ liệu mới được thêm vào.
Hiện tại có rất nhiều cơ chế được các DB hỗ trợ việc này như:
·        RabitMQ: cung cấp cơ chế message system.
·        RethinkDB: cung cấp cơ chế hỗ trợ Realtime dễ dàng cho lập trình viên – dựa trên message system nhưng được chú trọng xây dựng.
·        Redis: cung cấp cơ chế Pub/Sub.

4.2.          Khái niệm về Redis

Redis là hệ thống lưu trữ key-value với rất nhiều tính năng và được sử dụng rộng rãi.
Redis nổi bật bởi việc hỗ trợ nhiều cấu trúc dữ liệu cơ bản (hash, list, set, sorted set, string), đồng thời cho phép scripting bằng ngôn ngữ lua.
Bên cạnh lưu trữ key-value trên RAM với hiệu năng cao, redis còn hỗ trợ lưu trữ dữ liệu trên đĩa cứng (persistent redis) cho phép phục hồi dữ liệu khi gặp sự cố. Ngoài tính năng replicatation (sao chép giữa master-client), tính năng cluster (sao lưu master-master) cũng đang được phát triển .
Để sử dụng một cách hiệu quả những tính năng redis hỗ trợ cũng như vận hành redis với hiệu suất cao nhất thì việc am hiểu hệ thống lưu trữ này là rất quan trọng.

4.3.          Cơ chế PUB/SUB trong Redis

Cơ chế PUB/SUB gồm:
·        PUB (PUBLISH): Đẩy dữ liệu vào 1 kênh.
·        SUB (SUBSCRIBE): Đăng kí vào 1 kênh.
Nếu hiểu đơn giản thì hình dung như ta đăng kí vào 1 kênh truyền hình nào đó, khi đài truyền hình đẩy về kênh đó các dữ liệu, ta không cần làm gì cả dữ liệu vẫn luôn được tự cập nhật.
Trong Redis cơ chế này cũng y như vậy thôi các bạn, khi các bạn đăng kí vào 1 kênh, khi dữ liệu được đẩy vào kênh này bạn sẽ nhận được dữ liệu mới.
pub_sub
Sử dụng đặc tính này cho bài toán cập nhật số các bản tin mới được thêm vào cho người dùng một cách tự động.
Ta thực hiện việc đặt người dùng(SUB) vào 1 kênh (ở đây kênh này là số bản tin mới). Thì khi có một bản tin được thêm vào hệ thống Redis sẽ tự động phát sinh sự kiện (PUB), sự kiện(PUB) này chúng ta có thể bắt được nhờ vào Redis cung cấp, ta thực hiện xử lý số liệu để cập nhật cho người dùng.

5.     Zookeeper

5.1.          Khái niệm

Zookeeper là 1 dịch vụ tập trung để duy trì thông tin cấu hình, đặt tên, cung cấp sự đồng bộ phân tán và cung cấp các dịch vụ nhóm.
Nói cách khác, Zookeeper là 1 dịch vụ đồng bộ hóa nhân rộng (replicated synchronization service) với sự nhất quán cuối cùng. Trong một hệ thống cluster có nhiều nodes khác nhau và 1 node đóng vai trò là master. Giả sử master node lỗi với bất kỳ lý do gì. Trong trường hợp này, vai trò của master node được chuyển cho 1 node khác. Vai trò chính của master node là quản lý việc ghi (writer) theo thứ tự. Zookeeper sẽ gán mater node mới và đảm bảo rằng hệ thống cluster thực hiện tiếp xử lý mà không gặp vấn đề.

5.2.          Vai trò

·        Zookeeper quản lý toàn bộ quy trình (workflow) việc khởi động (start) và dừng (stop) các nodes khác nhau trong cluster.
·        Trong cluster khi bất kỳ xử lý nào cần cấu hình để hoàn thành tác vụ. Zookeeper đảm bảo node đó được cấu hình nhất quán.
·         Trong trường hợp master node lỗi, Zookeeper có thể gán master node mới và đảm bảo cluster làm việc bình thường.

Tài liệu tham khảo:
Tiếng Việt:
https://viblo.asia/visudoblog/posts/amoG818Ovz8P
http://kipalog.com/posts/Tim-hieu-ve-apache-kafka
Tiếng Anh:
https://www.tutorialspoint.com/apache_kafka/index.htm
Demo running apache Kafka for windows:
https://dzone.com/articles/running-apache-kafka-on-windows-os

Tài liệu chia sẻ cho Cộng đồng Dev, 
Xin vui lòng ghi rõ nguồn dẫn nếu có ý định dùng lại ^_^

Bài mới

Bài đăng nổi bật