1. Mở đầu
Phân bổ partition và replica là một yếu tố quan trọng trong việc tối ưu hóa hiệu suất và tính sẵn sàng của hệ thống Kafka. Bài viết này sẽ khám phá quy trình phân bổ các partition giữa các broker, cách Kafka xử lý phân phối trên các rack khác nhau, và quản lý không gian lưu trữ. Chúng ta sẽ cùng tìm hiểu cách Kafka đảm bảo dữ liệu được phân phối đồng đều và hiệu quả, đồng thời làm nổi bật các điểm cần chú ý để duy trì hiệu suất và khả năng mở rộng của hệ thống.
2. Cơ chế
Khi chúng ta tạo một topic, Kafka sẽ quyết định cách phân bổ các partition giữa các broker. Giả sử bạn có 6 broker và tạo một topic với 10 partition cùng hệ số sao chép (replication factor) là 3. Khi đó, Kafka cần phân bổ 30 bản sao của partition cho 6 broker. Mục tiêu của quá trình phân bổ là:
- Phân phối các bản sao đồng đều giữa các broker — trong ví dụ này, mỗi broker sẽ có 5 bản sao.
- Đảm bảo rằng mỗi bản sao của một partition nằm trên các broker khác nhau. Ví dụ, nếu partition 0 có leader trên broker 2, thì các follower phải nằm trên broker 3 và 4, nhưng không được đặt trên broker 2 và không được cả hai cùng nằm trên broker 3.
- Nếu các broker có thông tin về rack (có từ Kafka 0.10.0 trở lên), thì các bản sao của mỗi partition sẽ được phân bổ vào các rack khác nhau nếu có thể. Điều này giúp tránh tình trạng partition bị mất hoàn toàn nếu có sự cố ảnh hưởng đến cả một rack.
Để làm điều này, chúng ta bắt đầu với một broker ngẫu nhiên (giả sử là broker 4) và phân bổ các partition cho từng broker theo phương pháp round robin để chọn vị trí của leader. Ví dụ, leader của partition 0 sẽ ở broker 4, leader của partition 1 sẽ ở broker 5, leader của partition 2 sẽ ở broker 0 (vì chỉ có 6 broker), và tiếp tục như vậy. Sau đó, với mỗi partition, chúng ta đặt các replica ở các broker tiếp theo, theo thứ tự tăng dần so với leader. Nếu leader của partition 0 ở broker 4, follower đầu tiên sẽ ở broker 5 và follower thứ hai ở broker 0. Leader của partition 1 ở broker 5, nên follower đầu tiên ở broker 0 và follower thứ hai ở broker 1.
Khi rack awareness được tính đến, thay vì chọn các broker theo thứ tự số, chúng ta sắp xếp danh sách broker sao cho luân phiên giữa các rack. Giả sử broker 0 và 1 nằm trên cùng một rack, còn broker 2 và 3 trên một rack khác. Thay vì chọn theo thứ tự từ 0 đến 3, chúng ta sắp xếp thành 0, 2, 1, 3—mỗi broker sẽ được chọn luân phiên từ một rack khác nhau (Xem Hình 2). Ví dụ, nếu leader của partition 0 nằm trên broker 2, replica đầu tiên sẽ được đặt trên broker 1, thuộc rack khác. Điều này rất có lợi vì nếu rack đầu tiên ngừng hoạt động, chúng ta vẫn có một replica trên rack khác, giúp partition vẫn khả dụng. Hình 1. Partition và bản sao được gán cho các broker trên các rack khác nhau.
Sau khi chúng ta chọn đúng broker cho mỗi partition và replica, bước tiếp theo là quyết định thư mục nào sẽ được sử dụng cho các partition mới. Quá trình này được thực hiện độc lập cho từng partition, và quy tắc rất đơn giản: chúng ta đếm số lượng partition trên mỗi thư mục và thêm partition mới vào thư mục có ít partition nhất. Điều này có nghĩa là nếu bạn thêm một ổ cứng mới, tất cả các partition mới sẽ được tạo trên ổ cứng đó. Lý do là vì, cho đến khi mọi thứ được cân bằng, ổ cứng mới sẽ luôn có ít partition nhất.
3. Lưu ý
Chú ý đến dung lượng ổ cứng
Lưu ý rằng việc phân bổ partition cho các broker không xem xét không gian còn trống hoặc tải hiện tại, và việc phân bổ partition cho các ổ cứng chỉ dựa trên số lượng partition mà không xét đến kích thước của các partition. Điều này có nghĩa là nếu một số broker có nhiều dung lượng ổ cứng hơn các broker khác, một số partition có kích thước lớn bất thường, hoặc chúng ta có các ổ cứng có kích thước khác nhau trên cùng một broker, chúng ta cần phải cẩn thận với việc phân bổ phân vùng.
4. Thông tin kết nối
Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:
LinkedIn: https://www.linkedin.com/in/nguyentrungnam/ Facebook: https://www.facebook.com/trungnam.nguyen.395/
Rất mong được kết nối và cùng thảo luận!