2015-02-18 21 views
12

Ai đó có thể cho tôi biết thuật toán tái cân bằng cho người tiêu dùng Kafka không? Tôi muốn hiểu số lượng phân vùng và chuỗi tiêu dùng ảnh hưởng đến điều này như thế nào.Thuật toán tái cân bằng người tiêu dùng của Kafka

Cảm ơn bạn,

+0

thể trùng lặp của [Kafka Consumer Tái cân bằng] (http://stackoverflow.com/questions/27181693/kafka-consumer-rebalancing) –

+2

@ChrisForrence Cảm ơn bạn đã đầu vào, tuy nhiên đó không bao gồm các thuật toán trong các chi tiết tôi đang tìm kiếm, như hiện tại với Kafka 0.8 chúng ta thấy một số hành vi kỳ lạ, và tôi cần phải hiểu thuật toán để giải thích cho điều này. – NSA

+0

Bạn nên thêm thông tin đó vào câu hỏi của mình, sau đó;) [This] (http://stackoverflow.com/q/26757733/899126) người ta có thể giúp thêm một chút –

Trả lời

23

Ok như vậy có 2 thuật toán tái cân bằng tại thời điểm này - RangeRoundRobin. Chúng còn được gọi là Chiến lược phân chia phân vùng.

Đối với sự đơn giản giả sử chúng ta có một chủ đề T1 với 10 phân vùng và chúng tôi cũng có 2 người tiêu dùng với cấu hình khác nhau (ví dụ như để được rõ ràng hơn) - C1 với num.streams thiết lập để 1C2 với num.streams thiết lập để 2.

Dưới đây là làm thế nào mà sẽ làm việc với Range chiến lược:

Phạm vi đưa ra các phân vùng có sẵn trong số thứ tự và tiêu dùng chủ đề theo thứ tự tự từ điển. Vì vậy, trong trường hợp của chúng tôi thứ tự của các phân vùng sẽ là 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 và thứ tự của chủ đề người tiêu dùng sẽ là C1-0, C2-0, C2-1. Sau đó, số lượng phân vùng được chia cho số lượng chuỗi người tiêu dùng để xác định số lượng phân đoạn mà mỗi chuỗi người tiêu dùng nên sở hữu. Trong trường hợp của chúng tôi nó không phân chia như nhau, do đó, các chủ đề C1-0 sẽ nhận được thêm một phân vùng. Việc phân partition cuối cùng sẽ trông như thế này:

C1-0 được phân vùng 0, 1, 2, 3
C2-0 được phân vùng 4, 5, 6
C2-1 được phân vùng 7, 8, 9

Nếu sẽ có 11 phân vùng nhiệm vụ phân vùng cho những người tiêu dùng sẽ thay đổi một chút:

C1-0 sẽ nhận phân vùng 0, 1, 2, 3
C2-0 sẽ nhận được các phân vùng 4, 5, 6, 7
C2-1 sẽ nhận được các phân vùng 8, 9, 10

Vậy là xong.

Cấu hình tương tự sẽ không hoạt động cho chiến lược RoundRobin vì nó yêu cầu bằng nhau num.streams trên tất cả người tiêu dùng đã đăng ký cho chủ đề này, vì vậy hãy giả sử cả hai người tiêu dùng có num.streams đặt thành 2 ngay bây giờ. Một khác biệt lớn so với chiến lược Range ở đây là bạn không thể dự đoán được nhiệm vụ sẽ được thực hiện trước khi cân bằng lại. Dưới đây là làm thế nào mà sẽ làm việc với RoundRobin chiến lược:

Đầu tiên, có 2 điều kiện đó phải được đáp ứng trước khi chuyển nhượng thực tế:

a) Mỗi ​​chủ đề có cùng một số con suối trong một trường hợp người tiêu dùng (đó là lý do tại sao tôi đã đề cập ở trên số lượng chủ đề khác nhau cho mỗi người tiêu dùng sẽ không hoạt động)
b) Tập hợp các chủ đề đã đăng ký giống hệt nhau cho mỗi cá thể người tiêu dùng trong nhóm (chúng tôi có một chủ đề ở đây nên hiện tại không phải là vấn đề).

Khi 2 điều kiện này được xác minh, các cặp topic-partition được sắp xếp theo mã băm để giảm khả năng tất cả phân vùng của một chủ đề được gán cho một người tiêu dùng (nếu có nhiều hơn một chủ đề được sử dụng).

Và cuối cùng, tất cả các cặp topic-partition được chỉ định theo kiểu vòng tròn cho các chuỗi tiêu dùng có sẵn. Ví dụ, nếu chúng ta chủ đề-phân vùng sẽ kết thúc được sắp xếp như thế này: T1-5, T1-3, T1-0, T1-8, T1-2, T1-1, T1-4, T1-7, T1-6, T1-9 và người tiêu dùng đề là C1-0, C1-1, C2-0, C2-1 thì nhiệm vụ sẽ là như thế này:

T1-5 đi vào C1-0
T1-3 đi C1-1
T1-0 đi vào C2-0
T1-8 chuyển đến C2-1
Tại thời điểm này, không còn chủ đề người tiêu dùng nào nữa, nhưng vẫn còn nhiều phân đoạn chủ đề hơn, vì vậy việc lặp lại chuỗi chủ đề của người tiêu dùng bắt đầu qua:.210 T1-2 đi vào C1-0
T1-1 đi C1-1
T1-4 đi vào C2-0
T1-7 đi vào C2-1
Và một lần nữa:
T1-6 đi vào C1-0
T1-9 đi C1-1

Tại thời điểm này tất cả chủ đề-partiti các tiện ích được gán và mỗi luồng của người tiêu dùng có số lượng phân vùng gần bằng nhau.

Hy vọng điều này sẽ hữu ích.

+0

Điều gì sẽ xảy ra nếu có nhiều chủ đề người tiêu dùng hơn phân vùng? – Kousha

+1

@Kousha sau đó một số chủ đề tiêu dùng sẽ được nhàn rỗi một sẽ không nhận được bất kỳ phân vùng. – serejja

+0

Có vẻ như round-robin sẽ làm cho tìm kiếm mỗi người tiêu dùng có một số dữ liệu, nhưng không nhất thiết phải tất cả các chủ đề. – Kousha

0

Bạn có thể đọc Kafka docs http://kafka.apache.org/documentation/#impl_brokerregistration về thuật toán đăng ký tiêu dùng và tái cân bằng tiêu dùng thuật toán

Vì nó nói, mỗi người tiêu dùng nào sau đây trong tái cân bằng:

1. For each topic T that C<sub>i</sub> subscribes to 
2. let P<sub>T</sub> be all partitions producing topic T 
3. let C<sub>G</sub> be all consumers in the same group as C<sub>i</sub> that consume topic T 
4. sort P<sub>T</sub> (so partitions on the same broker are clustered together) 
5. sort C<sub>G</sub> 
6. let i be the index position of C<sub>i</sub> in C<sub>G</sub> and let N = size(P<sub>T</sub>)/size(C<sub>G</sub>) 
7. assign partitions from i*N to (i+1)*N - 1 to consumer C<sub>i</sub> 
8. remove current entries owned by C<sub>i</sub> from the partition owner registry 
9. add newly assigned partitions to the partition owner registry 
    (we may need to re-try this until the original partition owner releases its ownership) 

Và cũng lưu ý rằng:

Nếu có nhiều người tiêu dùng hơn phân vùng, một số người tiêu dùng sẽ không nhận được bất kỳ dữ liệu nào. Trong quá trình tái cân bằng, chúng tôi cố gắng gán phân vùng cho người tiêu dùng theo cách làm giảm số lượng nút môi giới mà mỗi người tiêu dùng phải kết nối.

Các vấn đề liên quan