Đồng bộ hóa mysql với elastic search bằng triggers
Xin chào mọi người
Em có một trường hợp đang cần đồng bộ hóa elastic search với mysql
Em đọc mấy cái blog, với xem người ta nói về giải pháp nhưng vẫn không hiểu áp dụng sao?
Em đang code với grpc, golang, sài cái sql-drivers, làm sao để bắt được sự kiện dữ liệu thay đổi, trigger làm sao? Ý em chưa rõ cái flow như thế nào
4 ANSWERS
Dùng 1 số tools Data Movement Platform. Muốn tự handle thì tìm hiểu CDC hoặc đơn giản hơn là dùng trường updated_at để check thay đổi.
Vấn đề của trigger là hiệu năng kém. Đối với các dữ liệu thay đổi nhiều, dùng trigger có thể tèo luôn db chứ chưa nói tới việc sync sang bên khác.
Cách đơn giản nhất là viết job index lại db mỗi ngày, mỗi giờ
Cách đơn giản nhì là viết 1 job query các thay đổi. Tùy vào yêu cầu mà đặt tần suất thích hợp. Đây là cách được áp dụng đa số.
Cách cũng đơn giản là Thực hiện song song upsert sql và upsert elastic trên code golang. Hoặc gọi upsert elastic sau khi upsert sql thành công.
Cách hoành tráng nhưng phải xem xét: Dùng mấy tool quan sát db log như Capture Data Change của Kafka. Cái này dùng khi không có quyền thay đổi code application, nhưng mất công học. Trong trường hợp này, mình viết code rồi thì sửa luôn trên golang thôi.
Chào bạn,
Haha, nghe câu hỏi của bạn, chắc đang ở level "cầm dao chưa vững mà đã muốn thái thịt bò" rồi đó.
Đừng lo lắng, mình sẽ giúp bạn hiểu rõ hơn về việc đồng bộ hóa MySQL với Elasticsearch bằng Triggers.
Về Flow:
- Trigger: Bạn cần tạo Trigger trong MySQL để bắt sự kiện thay đổi dữ liệu (INSERT, UPDATE, DELETE). Trigger sẽ gọi một hàm hoặc procedure.
- Hàm/Procedure: Hàm/Procedure này sẽ thực hiện logic gửi dữ liệu tới Elasticsearch bằng thư viện Golang tương ứng (có thể là
elastic
hoặcolivere/elastic
). - Elasticsearch Client: Thư viện Golang sẽ tương tác với Elasticsearch, cập nhật/xóa/thêm index dựa trên dữ liệu nhận được từ MySQL.
Gợi ý:
- Thư viện Golang: Sử dụng
olivere/elastic
vì khá phổ biến và dễ dùng. - Kiến thức cần bổ sung: Trigger, Stored Procedure trong MySQL, cơ bản về Elasticsearch API.
- Lưu ý: Trigger có thể ảnh hưởng đến hiệu năng nếu không thiết kế cẩn thận, nhớ nghĩ đến trường hợp xử lý lỗi và đảm bảo dữ liệu được đồng bộ hóa đúng.
Tóm lại: Bạn cần nắm rõ cách trigger gọi procedure/function và procedure/function sẽ làm nhiệm vụ tương tác với API của elasticsearch. Việc thiết kế cần xem xét tới những điểm mình đã cảnh báo nhé.
Hy vọng lời giải thích này hữu ích cho bạn. Chúc bạn thành công!