1. Giới thiệu
Kafka (Apache Kafka) là một nền tảng dữ liệu phát trực tuyến phân tán ban đầu được LinkedIn phát triển và sau đó được tặng cho Apache Software Foundation, trở thành một dự án cấp cao của Apache. Nó được thiết kế để xử lý các luồng dữ liệu thời gian thực quy mô lớn và hỗ trợ xây dựng các ứng dụng truyền dữ liệu có thông lượng cao, khả năng chịu lỗi. Các đặc điểm của Kafka khiến nó được sử dụng rộng rãi trong thu thập nhật ký, xử lý thời gian thực, kiến trúc hướng sự kiện, giám sát và các lĩnh vực khác.
Sau đây là một số tính năng và khái niệm chính của Kafka:
- Mô hình xuất bản-đăng ký: Kafka sử dụng mô hình xuất bản-đăng ký. Người tạo dữ liệu công bố dữ liệu vào các kênh logic gọi là Chủ đề và người dùng có thể đăng ký các chủ đề này để đọc dữ liệu.
- Kiến trúc phân tán: Kafka là một hệ thống phân tán cho phép mở rộng theo chiều ngang để xử lý lượng dữ liệu lớn. Nó phân phối dữ liệu trên nhiều nút máy chủ để đạt được thông lượng cao và tính khả dụng cao.
- Sự kiên trì: Kafka có thể lưu dữ liệu vào đĩa, đảm bảo dữ liệu được lưu giữ ngay cả sau khi được sử dụng để phân tích và xử lý tiếp theo.
- Phân vùng: Một chủ đề có thể được chia thành nhiều phân vùng, mỗi phân vùng là một chuỗi thông điệp được sắp xếp theo thứ tự. Phân vùng cho phép dữ liệu được mở rộng theo chiều ngang và xử lý song song.
- sao chép: Kafka hỗ trợ phân phối bản sao phân vùng trên các nút khác nhau để cung cấp khả năng dự phòng dữ liệu và khả năng chịu lỗi.
- hiệu suất cao: Thiết kế tối ưu của Kafka cho phép xử lý các luồng dữ liệu thông lượng cao và phù hợp với nhu cầu xử lý dữ liệu thời gian thực.
- Phát trực tuyến: Kafka có thể được sử dụng để xây dựng các ứng dụng xử lý luồng có khả năng xử lý và phân tích luồng dữ liệu theo thời gian thực.
- Hệ sinh thái: Kafka có hệ sinh thái xung quanh phong phú, bao gồm các khung xử lý luồng (như Apache Flink và Spark Streaming), hệ thống lưu trữ dữ liệu (như Hadoop và Cassandra), v.v.
Nhìn chung, Kafka đóng vai trò quan trọng trong các lĩnh vực dữ liệu lớn, xử lý thời gian thực và luồng dữ liệu. Kiến trúc phân tán mạnh mẽ và các chức năng phong phú của nó khiến nó trở thành nền tảng được nhiều công ty ưa chuộng để xử lý dữ liệu thời gian thực.
2. Tôi có thể làm gì?
Kafka là một nền tảng dữ liệu phát trực tuyến phân tán rất linh hoạt và mạnh mẽ, phù hợp với nhiều tình huống kinh doanh khác nhau. Sau đây là một số cách sử dụng phổ biến và tình huống kinh doanh của Kafka:
- Xử lý luồng nhật ký và sự kiện: Kafka nổi trội trong việc thu thập nhật ký và xử lý luồng sự kiện. Nó có thể thu thập dữ liệu nhật ký và sự kiện phân bổ trên nhiều hệ thống và ứng dụng khác nhau để phân tích, giám sát và khắc phục sự cố sau đó.
- Phân tích dữ liệu thời gian thực: Kafka có thể được sử dụng để xây dựng các hệ thống phân tích dữ liệu thời gian thực nhằm truyền dữ liệu từ nhiều nguồn khác nhau đến các nền tảng phân tích, cho phép doanh nghiệp hiểu được tình hình kinh doanh theo thời gian thực và tiến hành khai thác dữ liệu và phân tích thông tin theo thời gian thực.
- Đo lường và giám sát: Kafka có thể thu thập và truyền số liệu hệ thống và dữ liệu giám sát để theo dõi hiệu suất của các ứng dụng và cơ sở hạ tầng, đồng thời hỗ trợ cảnh báo và phản hồi theo thời gian thực.
- Kiến trúc hướng sự kiện: Mô hình xuất bản-đăng ký của Kafka rất phù hợp để triển khai các kiến trúc hướng sự kiện. Các dịch vụ vi mô hoặc thành phần riêng lẻ có thể truyền sự kiện và tin nhắn qua Kafka để tạo nên một hệ thống tách biệt và có khả năng mở rộng cao.
- Phát trực tuyến: Kafka có thể được sử dụng để xây dựng các ứng dụng xử lý luồng nhằm xử lý và phân tích các luồng dữ liệu theo thời gian thực. Các khung xử lý luồng (như Flink và Spark Streaming) kết hợp với Kafka có thể thực hiện xử lý dữ liệu phức tạp theo thời gian thực.
- Đường ống dữ liệu và ETL: Kafka có thể được sử dụng như một đường ống dữ liệu để truyền dữ liệu từ nguồn đến đích, hỗ trợ quy trình ETL (Trích xuất, Chuyển đổi, Tải). Điều này rất hữu ích cho các tình huống dữ liệu lớn như kho dữ liệu và hồ dữ liệu.
- Đẩy thời gian thực: Kafka có thể được sử dụng để triển khai các dịch vụ đẩy thời gian thực, chẳng hạn như đăng ký tin tức, trò chuyện thời gian thực, v.v. Thông tin sẽ được gửi đến người đăng ký ngay sau khi dữ liệu được cập nhật.
- Xử lý dữ liệu Internet vạn vật (IoT): Đối với các ứng dụng IoT, Kafka có thể tiếp nhận và xử lý lượng lớn dữ liệu thiết bị, cho phép truyền dữ liệu từ các thiết bị biên đến các hệ thống lưu trữ và phân tích phụ trợ.
- Tách dữ liệu và cắt đỉnh: Kafka có thể tách rời bên tạo dữ liệu và bên sử dụng dữ liệu, cho phép xử lý không đồng bộ và giảm sự kết nối giữa các hệ thống. Đồng thời, Kafka cũng có thể xử lý trơn tru các đợt tăng đột biến và biến động trong lưu lượng dữ liệu.
Những ngành nào đang sử dụng Kafka:
- Xử lý thanh toán và giao dịch tài chính theo thời gian thực, ví dụ như trên sàn giao dịch chứng khoán, ngân hàng và bảo hiểm.
- Theo dõi và giám sát ô tô, xe tải, đội xe và hàng hóa theo thời gian thực, chẳng hạn như trong ngành hậu cần và ô tô.
- Liên tục thu thập và phân tích dữ liệu cảm biến từ các thiết bị IoT hoặc các thiết bị khác như nhà máy và trang trại gió.
- Thu thập các tương tác và đơn đặt hàng của khách hàng và phản hồi ngay lập tức, chẳng hạn như trong bán lẻ, khách sạn và du lịch, và ứng dụng di động.
- Theo dõi bệnh nhân trong quá trình chăm sóc tại bệnh viện và dự đoán những thay đổi về tình trạng bệnh để đảm bảo điều trị kịp thời trong các tình huống khẩn cấp.
- Kết nối, lưu trữ và cung cấp dữ liệu được tạo ra bởi các bộ phận khác nhau trong công ty của bạn.
- Hoạt động như nền tảng cho các nền tảng dữ liệu, kiến trúc hướng sự kiện và dịch vụ vi mô.
3. Các thành phần cơ bản
-
broker: nút kafka, là nơi cài đặt từng dịch vụ kafka.
-
nhà sản xuất: nhà sản xuất, người gửi tin nhắn.
-
người tiêu dùng: người tiêu dùng, đọc tin nhắn.
-
Zookeeper: Trung tâm thông tin, nơi ghi lại nhiều thông tin khác nhau về Kafka.
-
controller: Một trong những broker, chịu trách nhiệm quản lý toàn bộ cụm với tư cách là leader. Nếu không thành công, nó sẽ sử dụng ZooKeeper để bầu lại một leader.
4. Các thành phần logic
4.1 chủ đề & phân vùng
- đề tài : Chủ đề, kênh tin nhắn, gửi và nhận tin nhắn luôn cần biết tin nhắn được gửi đến đâu
- phân vùng : Phân vùng, mỗi chủ đề có thể có nhiều phân vùng để chia sẻ truyền dữ liệu, nhiều đường dẫn song song, cải thiện thông lượng
- nhóm người tiêu dùng : Nhóm người tiêu dùng, người tiêu dùng có thể chỉ định nhóm khi theo dõi chủ đề
- Người ta thường khuyên nên giữ số lượng người dùng trong cùng một nhóm bằng hoặc ít hơn số phân vùng, vì mỗi phân vùng chỉ có thể được một người dùng trong nhóm người dùng sử dụng.
- Nếu số lượng người dùng lớn hơn số phân vùng, một số người dùng sẽ nhàn rỗi và không thể lấy được phân vùng để sử dụng, dẫn đến lãng phí tài nguyên.
- Tất nhiên, chúng ta cũng có thể đảm bảo rằng số lượng người dùng = số phân vùng + 1. Điều này đảm bảo rằng khi một người dùng ngừng hoạt động, bộ điều phối nhóm người dùng Kafka sẽ tìm thấy những người dùng nhàn rỗi và phân bổ lại các phân vùng của những người dùng bị lỗi và tiếp tục sử dụng.
4.2 bản sao
- bản sao : Bản sao, nhiều bản sao có thể được thiết lập cho mỗi phân vùng và dữ liệu giữa các bản sao là nhất quán. Nó tương đương với bản sao lưu, cải thiện độ tin cậy của dữ liệu (như được hiển thị bên dưới)
- bản sao: người dẫn đầu và người theo sau : Có một leader trong bản sao, và những người khác là những người theo dõi. Leader xử lý tất cả các yêu cầu đọc và ghi, và người theo dõi chỉ chịu trách nhiệm sao lưu dữ liệu. Nếu phân vùng chính bị lỗi, người theo dõi sẽ tiếp quản
Sao chép Phân loại
-
AR (Bản sao được chỉ định) đề cập đến tập hợp các bản sao được chỉ định cho mỗi phân vùng. Trong Kafka, mỗi phân vùng có thể có nhiều bản sao, một trong số đó được bầu làm người dẫn đầu và những bản sao khác là người theo dõi. AR đề cập đến bộ sưu tập tất cả các bản sao bao gồm cả bản sao dẫn đầu.
-
ISR (Bản sao đồng bộ): ISR là tập hợp các bản sao được đồng bộ hóa với bản sao chính. Trong Kafka, một phân vùng chủ đề thường có nhiều bản sao, nhưng chỉ những bản sao đồng bộ với bản sao chính mới có thể được coi là thành viên của ISR. Trong những trường hợp bình thường, tất cả các bản sao trong ISR đều được đồng bộ hóa tin nhắn trước khi đạt đến mức cao nhất, do đó đảm bảo tính nhất quán và độ tin cậy của tin nhắn.
-
OSR (Bản sao không đồng bộ): OSR đề cập đến các bản sao bị tụt hậu so với bản sao chính. Các bản sao này có thể đồng bộ hóa chậm hơn, có thể do độ trễ của mạng hoặc lý do khác. Khi bản sao không đồng bộ với bản chính, nó sẽ được chuyển ra khỏi ISR. Điều này nhằm đảm bảo các bản sao trong ISR luôn đồng bộ với các tin nhắn trước mức nước cao.
Các khái niệm này được sử dụng trong Kafka để quản lý việc phân phối và đồng bộ hóa các bản sao nhằm đảm bảo độ tin cậy và tính nhất quán của dữ liệu.
AR = ISR + OSR.
5. Thẻ tin nhắn
-
offset: offset (chỉ mục), vị trí cụ thể của việc tiêu thụ tin nhắn. Mỗi người tiêu dùng có offset riêng.
-
HW (High Watermark): Ngưỡng nước cao là điểm đánh dấu cho biết vị trí của tin nhắn đã được xác nhận và cam kết. Tất cả các tin nhắn trước HW đều được coi là đã được xử lý và xác nhận. Theo quan điểm của người tiêu dùng, chỉ có những tin nhắn sau mức ngưỡng cao là chưa được xử lý. Mức nước cao nhất chỉ được ghi lại trong ISR (Bản sao đồng bộ) để đảm bảo tính nhất quán và khả năng hiển thị của tin nhắn. Trong một nhóm ISR, tốc độ của mỗi tin nhắn đồng bộ hóa Follower có thể khác nhau và HW luôn trỏ đến vị trí tin nhắn chậm nhất trong số tất cả các ISR.
-
LEO (Log End Offset): Độ lệch cuối nhật ký là dấu hiệu cho biết độ lệch của tin nhắn tiếp theo trong phân vùng hiện tại. LEO là độ lệch lớn nhất trong số tất cả các bản sao trong phân vùng, bao gồm các bản sao trong ISR và OSR (Bản sao không đồng bộ). LEO chỉ ra vị trí của các tin nhắn trong phân vùng chưa được sử dụng.
Tóm lại, HW là vị trí của các tin nhắn đã xác nhận và cam kết, được sử dụng để đảm bảo tính nhất quán và khả năng hiển thị của tin nhắn. LEO là độ lệch của tin nhắn tiếp theo trong phân vùng, được sử dụng để chỉ ra vị trí của tin nhắn chưa được xử lý. Hai độ lệch này đóng vai trò quan trọng trong Kafka và ảnh hưởng đến quá trình xử lý và sử dụng tin nhắn.
Vậy mối quan hệ giữa ba điều này là gì?
Ví dụ, khi số lượng bản sao là 3, giá trị LEO sẽ được cập nhật sau khi tin nhắn được gửi đến Leader A. Follower B và Follower C cũng sẽ kéo tin nhắn từ Leader A theo thời gian thực để tự cập nhật. HW biểu thị độ dịch chuyển logarit đạt được bởi A, B và C cùng lúc, tức là giá trị có LEO nhỏ nhất trong số A, B và C. Do độ trễ giữa B và C khi kéo tin nhắn của A, HW thường nhỏ hơn LEO, tức là LEO>=HW.
6. Lưu trữ tin nhắn
Mỗi chủ đề trong Kafka có thể có nhiều phân vùng. Mỗi phân vùng tạo một thư mục trên broker nơi nó được đặt. Mỗi phân vùng được chia thành nhiều phân đoạn (Phân đoạn tương đương với việc chia các tin nhắn lớn thành nhiều tệp để ngăn các tệp tin nhắn quá lớn và gây ra tốc độ truy xuất chậm). Mỗi phân đoạn có hai tệp log & index. Tệp nhật ký lưu trữ tin nhắn theo trình tự và phân đoạn chỉ mục lưu trữ tin nhắn trong tệp chỉ mục được đặt tên trực tiếp theo độ lệch của tin nhắn đầu tiên trong phân đoạn hiện tại.
Nhật ký: Kafka sử dụng nhật ký để lưu trữ tin nhắn và mỗi phân vùng đều có một nhật ký tương ứng. Nhật ký là một chuỗi thông điệp được sắp xếp theo thứ tự và không thể thay đổi. Bất cứ khi nào có tin nhắn mới đến, chúng sẽ được thêm vào cuối nhật ký của phân vùng, tạo thành một phân đoạn nhật ký phát triển dần dần. Mỗi phân đoạn nhật ký có kích thước cố định, khi đạt đến giới hạn kích thước, phân đoạn nhật ký đó sẽ bị đóng lại và một phân đoạn nhật ký mới sẽ được tạo ra.
Hoạt động thêm nhật ký rất hiệu quả vì nó chỉ yêu cầu thêm tin nhắn mới vào cuối phân đoạn nhật ký và không yêu cầu di chuyển dữ liệu hiện có. Vì nhật ký không thể thay đổi nên một khi tin nhắn đã được viết thì không thể thay đổi hoặc xóa nó. Tính năng này đảm bảo tính bền vững và không thay đổi của dữ liệu Kafka.
Chỉ mục tin nhắn: Chỉ mục tin nhắn là thành phần quan trọng được sử dụng để tăng tốc tìm kiếm tin nhắn. Mỗi phân đoạn nhật ký có một chỉ mục tin nhắn tương ứng, lưu trữ ánh xạ giữa một số độ lệch tin nhắn quan trọng và độ lệch vật lý. Chỉ mục cho phép Kafka nhanh chóng xác định vị trí các tin nhắn ở các vị trí cụ thể mà không cần phải quét toàn bộ nhật ký từng cái một.
Chỉ mục tin nhắn thường được lưu trữ trong bộ nhớ và được chia thành hai phần: chỉ mục bộ nhớ và chỉ mục đĩa. Chỉ mục trong bộ nhớ chứa ánh xạ giữa một phần của độ lệch tin nhắn và vị trí vật lý của nó trong nhật ký, cho phép thực hiện hầu hết các thao tác tra cứu tin nhắn phổ biến trong bộ nhớ rất nhanh chóng. Chỉ mục đĩa chứa thông tin chỉ mục đầy đủ, nghĩa là toàn bộ dữ liệu chỉ mục không cần phải được tải vào bộ nhớ mà được tải khi cần, giúp tiết kiệm không gian bộ nhớ.
Thông qua lập chỉ mục tin nhắn, Kafka có thể nhanh chóng xác định vị trí tin nhắn để sử dụng, theo dõi và xử lý. Điều này rất quan trọng để hỗ trợ xử lý dữ liệu thông lượng cao và tiêu thụ theo thời gian thực.
6.1 Định vị chỉ số
Người tiêu dùng nhận được tin nhắn với độ lệch = 6.
- Có thể sử dụng độ lệch yêu cầu để xác định vị trí của tin nhắn.
0000000000000000000
Trong phân khúc
- vượt qua
00000000000000000000.chỉ số
Tìm giá trị Vị trí của offset = 6
- đến
00000000000000000000.nhật ký
Tìm trực tiếp byte offset 150 và bắt đầu đọc tin nhắn
- Cho đến khi vị trí bắt đầu của tin nhắn tiếp theo được đọc, tức là tin nhắn hiện tại được đọc và tin nhắn được trả về cho Consumer
6.2 Chiến lược phân đoạn lưu trữ
- Giới hạn kích thước nhật ký (chính sách mặc định là 1GB): Các phân đoạn nhật ký của Kafka có kích thước được thiết lập sẵn, thường là giá trị tính bằng byte (ví dụ: 1GB). Khi một phân đoạn nhật ký đạt đến giới hạn này, phân đoạn đó sẽ bị đóng lại và một phân đoạn mới sẽ được tạo để nhận tin nhắn mới.
- Giới hạn thời gian: Một chiến lược phân khúc khác dựa trên thời gian. Kafka cho phép bạn thiết lập thời gian tồn tại tối đa của một phân đoạn nhật ký. Ngay cả khi phân đoạn nhật ký không đạt đến giới hạn kích thước, nó sẽ bị đóng nếu vượt quá thời gian đã chỉ định. Điều này giúp dọn sạch dữ liệu đã hết hạn để ngăn chặn tình trạng tích tụ quá nhiều dữ liệu lịch sử.
6.3 Chính sách xóa nhật ký
- Xóa dựa trên kích thước phân đoạn nhật ký: Khi kích thước của một phân đoạn nhật ký đạt đến ngưỡng được thiết lập trước (
phân đoạn.byte
tham số), phân đoạn nhật ký sẽ bị đóng và được coi là "không hoạt động". Các phân đoạn nhật ký không hoạt động sẽ bị xóa mà không ảnh hưởng đến các lần ghi đang diễn ra. Bằng cách này, các tin nhắn cũ sẽ được xóa và giải phóng dung lượng đĩa.
- Xóa dựa trên thời gian lưu giữ phân đoạn nhật ký: Mỗi phân đoạn nhật ký có giới hạn thời gian lưu giữ, được gọi là
phân đoạn.ms
tham số. Khi một phân đoạn nhật ký bị đóng, nếu thời gian tạo của nó vượt quá thời gian lưu giữ này, nó sẽ bị xóa. Điều này đảm bảo dữ liệu cũ không còn cần thiết sẽ được dọn dẹp kịp thời.
- Xóa dựa trên thời gian lưu giữ tin nhắn: Mỗi chủ đề có thể được thiết lập với thời gian lưu giữ, được gọi là
giữ lại.ms
tham số. Nếu một chủ đề có thời gian lưu giữ được thiết lập và các tin nhắn có dấu thời gian cũ hơn thời gian lưu giữ bị xóa, thì các tin nhắn đó cũng sẽ bị xóa. Chiến lược này đảm bảo rằng các tin nhắn không còn cần thiết trong chủ đề sẽ được tự động dọn sạch.
- Xóa dựa trên nén tin nhắn (Nén nhật ký): Nếu nén tin nhắn được bật (thông qua
chính sách dọn dẹp
Các tham số được thiết lập thành nhỏ gọn
), Kafka sẽ giữ lại tin nhắn mới nhất cho mỗi khóa và các tin nhắn cũ hơn sẽ bị xóa. Chiến lược này giữ lại trạng thái mới nhất của mỗi khóa và phù hợp để lưu trữ thông tin trạng thái.
- Sử dụng kết hợp các chiến lược xóa: Bạn có thể sử dụng nhiều chính sách xóa cùng lúc để quản lý dung lượng lưu trữ theo các chủ đề và nhu cầu khác nhau. Ví dụ, một số chủ đề có thể có chính sách lưu giữ theo thời gian, trong khi các chủ đề khác có thể có chính sách dựa trên kích thước tin nhắn.
Trong Kafka, đơn vị nhỏ nhất của chính sách xóa là phân đoạn nhật ký. Khi điều kiện xóa được đáp ứng, Kafka sẽ xóa toàn bộ phân đoạn nhật ký không còn cần thiết nữa, bao gồm dữ liệu tin nhắn và dữ liệu chỉ mục tương ứng.
Cuối cùng, bài viết này về Kafka-Basics kết thúc tại đây. Nếu bạn muốn biết thêm về Kafka-Basics, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!