Bạn có biết Zendesk, công ty phần mềm CRM hàng đầu, đã giải quyết thách thức lưu trữ dữ liệu khổng lồ như thế nào không? Họ đã chuyển từ DynamoDB sang giải pháp kết hợp MySQL và Amazon S3, giúp tiết kiệm tới 80% chi phí! Bài viết này chia sẻ chi tiết về hành trình tối ưu hóa của Zendesk, từ việc thiết kế pipeline dữ liệu đến triển khai các kỹ thuật nâng cao như Bloom Filter và Count-Min Sketch. Nếu bạn quan tâm đến big data, cloud computing hoặc đang tìm cách tối ưu chi phí cho hệ thống của mình, đây chắc chắn là một case study đáng đọc. Hãy cùng khám phá cách Zendesk đạt được hiệu suất cao với chi phí thấp!

Tags: #database, #system desgin

Zendesk là một công ty phần mềm dịch vụ chăm sóc khách hàng (CRM) có trụ sở tại San Francisco, California. Được thành lập vào năm 2007, Zendesk cung cấp một nền tảng dịch vụ chăm sóc khách hàng dựa trên đám mây cho các doanh nghiệp thuộc mọi quy mô.

Các sản phẩm chính của Zendesk bao gồm:

1.Zendesk Support: Hệ thống quản lý ticket để xử lý các yêu cầu hỗ trợ khách hàng.
2.Zendesk Chat: Giải pháp chat trực tiếp cho website và ứng dụng di động.
3.Zendesk Talk: Hệ thống điện thoại dựa trên đám mây tích hợp với nền tảng hỗ trợ.
4.Zendesk Guide: Cơ sở kiến thức và hệ thống tự phục vụ cho khách hàng.
5.Zendesk Explore: Công cụ phân tích và báo cáo.

Zendesk phục vụ hàng trăm nghìn khách hàng trên toàn thế giới, từ các startup nhỏ đến các tập đoàn lớn. Với quy mô hoạt động lớn như vậy, Zendesk cần xử lý và lưu trữ một lượng lớn dữ liệu, bao gồm logs sự kiện từ các tương tác của khách hàng trên nền tảng của họ.

Kiến trúc ban đầu của Zendesk như sau:

Đứng trước thách thức này, đội ngũ kỹ thuật của Zendesk bắt đầu tìm kiếm một giải pháp thay thế có thể duy trì hiệu suất cao trong khi giảm đáng kể chi phí vận hành.

Các giải pháp thay thế

Trong quá trình tìm kiếm giải pháp thay thế, Zendesk tập trung vào các công nghệ trong hệ sinh thái AWS, vì đó là nền tảng chính của Zendesk:

Amazon S3:

Ưu điểm: Chi phí lưu trữ rất thấp.
Nhược điểm: Gây chậm trễ dữ liệu (khoảng 24 giờ).
Thách thức: Khó khăn trong việc triển khai streaming dữ liệu theo thời gian thực từ Kafka.

Apache Hudi kết hợp với Amazon S3:

Ưu điểm: Đã được sử dụng trong Datalake hiện tại.
Nhược điểm: Gây chậm trễ dữ liệu (khoảng 24 giờ).
Thách thức: Tăng độ phức tạp trong quản lý và gỡ lỗi hệ thống.

Elasticsearch:

Ưu điểm: Khả năng truy vấn mạnh mẽ.
Nhược điểm: Chi phí cao, tương đương với DynamoDB đối với khối lượng lượng dữ liệu hiện tại.
Lưu ý: Zendesk tự quản lý Elasticsearch trên các máy chủ EC2.

MySQL:

Ưu điểm: Khả năng truy vấn linh hoạt
Nhược điểm: Khó mở rộng khi xử lý hàng tỷ bản ghi.
Thách thức: Cần phải chia nhỏ dữ liệu để đạt hiệu suất tốt.

Cách tiếp cận

Cuối cùng, đội ngũ Zendesk đã quyết định sử dụng một cách tiếp cận kết hợp để tận dụng ưu điểm của các giải pháp. Họ chọn sử dụng MySQL để ghi logs từ Kafka, và định kỳ tải dữ liệu lên S3 để cho phép xóa dữ liệu đó khỏi MySQL nhằm tránh quá tải DB. Những ưu điểm của giải pháp này bao gồm:

Chi phí thấp hơn DynamoDB (S3 rất rẻ và chi phí Aurora MySQL không tăng nhanh như DynamoDB khi dữ liệu tăng lên)
Dễ dàng truy vấn dữ liệu (rất dễ trong MySQL, và S3-Select cũng đáp ứng tốt)
Hiệu suất đủ để phục vụ các yêu cầu API về dữ liệu



Quy trình làm việc được mô tả chi tiết như sau:

1.Zendesk lấy logs từ Kafka ở định dạng JSON.
2.Những logs này được ghi vào bảng buffer trong MySQL.
3.Mỗi giờ, một background job khởi động để đọc từ bảng metadata, xác định bản ghi cuối cùng đã được tải lên S3.
4.Background job này đọc các gói bao gồm 10.000 logs từ bảng buffer và tải chúng lên một file S3.
5.Sau mỗi lần tải lên, job sẽ ghi một mục vào bảng metadata cho mỗi file S3, lưu trữ đường dẫn S3, số lượng logs trong file, ID log cuối cùng và timestamp cuối cùng được lưu trong file đó.

Cấu trúc bảng metadata được định nghĩa như sau:

1.Quá trình này tiếp tục cho đến khi tất cả các hàng trong bảng buffer đã được tải lên, ngoại trừ dữ liệu 5 phút cuối cùng để tránh sự chậm trễ của Kafka gây ra vấn đề về thứ tự.
2.Một background job khác cũng khởi động mỗi giờ để xóa dữ liệu trong DB cũ hơn 4 giờ, nhằm kiểm soát kích thước của bảng buffer.

Truy vấn

Sau khi thiết lập pipeline dữ liệu, câu hỏi đặt ra là liệu hệ thống có thể trả về dữ liệu kịp thời khi client gửi các request API hay không.

Biểu đồ trên so sánh hiệu suất của Aurora (màu vàng) với S3-Select (màu tím) khi truy vấn dữ liệu. Đáng chú ý, S3-Select thể hiện tốc độ ấn tượng, đặc biệt khi xét đến việc mỗi file chỉ chứa 10.000 mục. Hơn nữa, chi phí sử dụng S3-Select rất thấp.

Quy trình truy vấn được mô tả chi tiết như sau:

1.Dựa trên khoảng thời gian được chỉ định, hệ thống xác định các file S3 liên quan thông qua các bản ghi trong bảng metadata của MySQL.
2.Nếu không có bộ lọc bổ sung (như user-id, URL...), hệ thống chọn đủ file S3 để đáp ứng số lượng kết quả mong muốn, sử dụng cột log_count trong bảng metadata.
3.Sau khi xác định các file S3 cần truy vấn, hệ thống tạo truy vấn S3-Select. Ví dụ: Trong đó, timestamp là một trường trong JSON được lưu trữ trong file.
4.Các truy vấn S3-Select được thực hiện song song để tối ưu hóa thời gian phản hồi.
5.Nếu không thu được đủ kết quả từ S3, hệ thống sẽ truy vấn thêm logs từ bảng buffer trong MySQL để bổ sung.

Tối ưu hóa

Sau khi triển khai hệ thống cơ bản, đội ngũ Zendesk đã phát hiện một vấn đề về hiệu suất khi khách hàng muốn lọc kết quả bằng các trường khác ngoài timestamp. Ví dụ, khi tìm logs cho một user-id cụ thể, trong trường hợp xấu nhất, hệ thống phải quét tất cả dữ liệu S3 trong phạm vi thời gian để tìm bất kỳ logs nào liên quan, điều này làm cho việc tìm ra những truy vấn nào cần thực hiện song song trở nên khó khăn.

Để giải quyết vấn đề này, họ đã thực hiện một số bước tối ưu hóa:

1.Sao chép dữ liệu: Ban đầu, họ sao chép dữ liệu trong S3 và tổ chức lại theo các trường lọc phổ biến. Tuy nhiên, phương pháp này nhanh chóng trở nên cồng kềnh khi số lượng trường và kết hợp lọc tăng lên.
2.Bộ lọc Bloom: Đội ngũ đã triển khai Bộ lọc Bloom để xác định nhanh chóng liệu một file S3 có thể chứa dữ liệu liên quan hay không. Điều này giúp giảm số lượng file cần quét.
3.Count-Min Sketch: Để ước tính số lượng kết quả trong mỗi file, họ sử dụng cấu trúc dữ liệu Count-Min Sketch. Điều này giúp tối ưu hóa việc chọn file để quét.

Quy trình làm việc mới được mô tả như sau:



Đọc các bản ghi metadata phù hợp với phạm vi thời gian.
Kiểm tra Bộ lọc Bloom và Count-Min Sketch cho mỗi bản ghi metadata.
Chọn các file S3 cần quét dựa trên kết quả từ Bộ lọc Bloom.
Ước tính số lượng kết quả từ Count-Min Sketch để giới hạn số file cần quét.

Cấu trúc dữ liệu mới được lưu trữ trong bảng metadata_bloom_filters:

Phương pháp này cho phép hỗ trợ lọc trên nhiều trường bằng cách kiểm tra các Bộ lọc Bloom tương ứng.

Mặc dù đã cải thiện đáng kể, hệ thống vẫn có thể gặp trường hợp xấu nhất khi nhận được nhiều kết quả giả từ Bộ lọc Bloom. Để giải quyết vấn đề này, Zendesk sử dụng Phân trang dựa trên Con trỏ trong API của họ. Họ cung cấp trường has_more trong phản hồi, cho phép client yêu cầu trang tiếp theo nếu có khả năng còn kết quả trong các file S3 tiếp theo. Trường has_more sẽ được đặt thành false khi không còn file S3 nào để quét trong phạm vi thời gian.

Kết quả của việc chuyển đổi từ DynamoDB sang giải pháp kết hợp MySQL và S3 đã thành công vượt xa mong đợi của đội ngũ Zendesk. Họ đặc biệt ấn tượng với hiệu suất của S3-Select, một công cụ mà ban đầu họ dự đoán sẽ có thời gian phản hồi trong khoảng vài giây. Thực tế, hầu hết các truy vấn chỉ mất khoảng 200-500ms, với một số trường hợp đỉnh điểm lên đến vài giây - một kết quả mà họ tin rằng còn có thể tối ưu hóa thêm bằng cách điều chỉnh số lượng logs trên mỗi file S3. Về mặt tài chính, sự chuyển đổi này đã mang lại lợi ích đáng kể. Chi phí tổng thể của giải pháp mới chỉ bằng chưa đến 20% chi phí trước đây khi sử dụng DynamoDB. Đáng chú ý hơn, trong 20% chi phí này, chỉ có chưa đến 10% là dành cho việc sử dụng kết hợp lưu trữ S3 và S3-Select. Phần còn lại, chiếm hơn 90%, là chi phí cho Aurora - cơ sở dữ liệu MySQL được quản lý của AWS.

Tuy nhiên, khi Zendesk mở rộng quy mô hoạt động, họ nhận ra rằng chi phí sử dụng DynamoDB tăng nhanh chóng. Zendesk đã thử chuyển sang thức thanh toán provisioned billing mode(đặt trước một lượng tài nguyên nhất định và trả phí cố định cho lượng tài nguyên đó, bất có sử dụng hết hay không) của DynamoDB, giúp giảm chi phí khoảng 50%. Tuy nhiên, giải pháp này vẫn không đủ bền vững khi Zendesk tiếp tục mở rộng phục vụ nhiều khách hàng hơn. Đặc biệt, mỗi khi họ muốn cho phép truy vấn trên một trường mới trong logs, phải tạo thêm Global Secondary Indices, làm tăng đáng kể chi phí.

SYDEXA
We learn, we share, we grow together!

About

  • Sydexa

Resources

  • Docs
  • Sydexa Hub

Contact

  • For Work
  • Report

Members

  • Sign in
  • Sign up
  • Portal
@ Sydexa 2024. All copyrights reserved