
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.
Đây là một điều rất đau đầu, nếu không để
ý và thiết kế hệ thống ngay từ đầu thì khi gặp vấn đề xảy ra sẽ rất khó để giải
quyết và làm cho toàn bộ hệ thống mất ổn định.
1.2.
Message queue

Message Queue là một mô hình giao tiếp truyền tin bất động
bộ. Có nghĩa trao đổi giữa người gửi và người nhận không cần xảy ra đồng thời,
tại cùng 1 thời điểm. Người gửi có thể đẩy tin cần gửi vào hàng đợi (queue), và
sau đó một số tiến trình độc lập sẽ đẩy tin từ hàng đợi đến người nhận.
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
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

-
Các topic được phân chia thành những
phân vùng dữ liệu khác nhau. Mỗi phân vùng dữ liệu được sếp thứ tự trong quá
trình truy cập dữ liệu. Mỗi gói dữ liệu gởi đến hệ thống sẽ được đánh số thứ tự
theo ID.
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 (Reliability–Availability–Scalability),
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 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.
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:
Demo
running apache Kafka for windows:
https://dzone.com/articles/running-apache-kafka-on-windows-os