MySQL Router

Đăng bởi Lưu Đại vào ngày 29-04-2024

1. Vấn đề

  • Khi sử dụng master / slave database đã bao giờ bạn tự hỏi làm thế nào để ứng dụng biết được query read thì sẽ điều hướng vào database nào? ( tương tự với query write) 
  • Khi master database bị chết thì làm sao ứng dụng biết được slave nào lên làm master thay cho master cũ (mình đã tham khảo nhiều bài hướng dẫn setup master / slave db trên mạng, tuy nhiên những bài này fix cứng host và port của master và slave db mình cũng không hiểu họ sẽ handle trường hợp db bị chết như thế nào?).

2. Nên hay không phân biệt master database và slave database ở tầng ứng dụng (VD: Rails app)

  • Câu trả lời là ở tầng Rails app ứng dụng không nên phân biệt đâu là slave database, master database. Cũng có thể code tay phần này nhưng sẽ tiềm ẩn nhiều lỗi 
  • Một trong những cách giải quyết vấn đề này là sử dụng tools mà các DBMS cung cấp sẵn. Trong bài này mình đề cập tới MySQL Router. 
  • Rails app sẽ không connect trực tiếp vào với các database như trước mà sẽ chỉ connect tới MySQL Router. MySQL Router sẽ nhận request từ Rails app sau đó quyết định xem request đó sẽ được đưa tới database nào. 
  • Kiến trúc sẽ như hình vẽ dưới đây: 

3. MySQL Router

  • Như đã đề cập ở trên MySQL Router đóng vai trò như một middleware đứng giữa ứng dụng và database nhằm quyết định xem request sẽ được xử lý ở database nào (nghe như nginx, load balancer vậy nhỉ 😁).
  • Do các server database có thể bị down trong quá trình sử dụng nên MySQL Router nên được cài chung host với app. 
  • Trong file config của MySQL Router phải có sẵn list các database / database cluster đang hoạt động. List này sẽ được MySQL Router kéo ra khi khởi động và được cache lại.
  • MySQL Router sẽ giữ ít nhất một kết nối tới mỗi database trong list được config để theo dõi tình trạng của database / database cluster và cập nhật cache. Như vậy mỗi khi có một database bị down MySQL Router sẽ biết ngay lập tức và không gửi query tới database này nữa. 
  • Nhờ vào đó MySQL Router có thể biết được lúc nào master server down và tự động chọn ra một slave lên thành master mới. Mặc định thì MySQL Router sẽ chọn slave có data mới nhất và nếu các slave khác có data mà slave được chọn chưa có MySQL Router sẽ apply các thay đổi này lên slave được chọn [reference].

4. Tham khảo