Database Replication là gì?

 Tưởng tượng rằng, chúng ta đang trong một dự án của một công ty được xây dựng khởi đầu sử dụng cơ sở dữ liệu "X" để lưu trữ các dữ liệu về khách hàng và sản phẩm,... Sau một khoảng thời gian hoạt động, dữ án này phát triển ngày càng lớn mạnh với lượng người dùng trên khắp thế giới ngày một tăng nhanh. Như một lẽ tất yếu, lượng dữ liệu cần phải lưu trữ/thao tác cũng tăng lên rất rất nhiều lần.

Giả sử, cùng một khoảng thời gian có đến 5000 người dùng thực hiện các thao tác liên quan đến việc truy vấn trên hơn 1 triệu đơn vị dữ liệu lưu trữ. Thế là, cơ sở dữ liệu "X" này phải tiếp nhận 5000 truy vấn này và xử lý hết tất cả chúng. Đoán xem điều gì sẽ xảy ra? Chắc chắn rằng tốc độ xử lý của hệ thống của chúng ta sẽ bị chậm đi khi mà lượng dữ liệu cần xử lý trên 1 node server là quá nhiều như vậy, thậm chí nó có thể gây ra tình trạng "crash" cơ sở dữ liệu dẫn việc ngưng hoạt động của hệ thống.

Để giải quyết được hai vấn đề nêu trên bao gồm tốc độ xử lý chậm và việc crash cơ sở dữ liệu chúng ta cần đến sự trợ giúp của Database Replication.

Database Replication là gì?

Database Replication là một kỹ thuật/nguyên lý thiết kế sử dụng trong việc mở rộng (scale) cơ sở dữ liệu bằng cách duy trì các bản sao của dữ liệu trên nhiều server cơ sở dữ liệu khác nhau.



Các loại Data Replication

Có 2 loại data replication dụ trên thời gian chuyển đổi dữ liệu giữa các node.

Giả sử hệ thống phân tán của chúng ta có 3 server cơ sở dữ liệu A, B, C. Dựa trên giả thiết này và cùng xem cách hoạt động mỗi loại replication.

Synchronous

Máy khách (Client) gửi dữ liệu đến server A và dữ liệu sẽ được sao chép đến server B và server C. Sau khi dữ liệu hoàn thành sao chép, các thông báo hoàn thành sẽ được gửi về cho server A và server A sẽ gửi thông báo đến Máy khách.

  • Ưu điểm: Đảm bảo dữ liệu trên tất cả các server cơ sở dữ liệu là giống nhau - tính đồng nhất giữa các server 

  • Khuyết điểm: Server A mất thêm một khoảng thời gian để đợi dữ liệu được đồng bộ và gửi hồi đáp lại cho Máy khách. Nếu có một server nào đó không có hồi đáp hoàn thành sao chép dữ liệu thi toàn bộ quá trình sẽ bị rollback (quay trở lại ban đầu)

Asynchronous

Máy khách (Client) gửi dữ liệu đến server A, server A sẽ phản hồi các thao tác cho Máy khách, sau đó dữ liệu thay đổi mới được đồng bộ trên server B và C.

  • Ưu điểm: Phản hồi gửi đến Máy khách là ngay lập tức.

  • Khuyết điểm: Có thể dẫn đến sự không đồng bộ khi công việc sao chép dữ liệu đến các server khác xảy ra các vấn đề về mạng.

Các loại Replication Environment

Multi-Master Replication


Mỗi node đều đóng vai trò là master node nơi mà Máy khách có thể thực hiện cả việc đọc và ghi dữ liệu. Giữa các node có thể được đồng bộ bằng cả 2 cách nêu trên (Synchronous và Asynchronous)

Nhưng khi sử dụng Asynchronous vấn đề về xung đột dữ liệu rất dễ xảy ra khi các Máy khách cập nhật cùng một đơn vị dữ liệu nhưng trên các master-node khác nhau.

Master-Slave Replication

Máy khách chỉ có quyền đọc/ghi dữ liệu trên master-node. Các slave-node xung quanh sẽ sao chép lại dữ liệu từ master-node, dữ liệu ở slave-node chỉ dùng để đọc. Việc sao chép cũng có thể sử dụng 2 cách trên.

MongoDB

MongoDB sử dụng Master-slave replication, kỹ thuật được mô tả ở hình dưới:

Nếu master-node ngưng hoạt động, một slave-node sẽ được chọn thay thế để giữ hệ thống hoạt động bình thường. Nếu master-node không giao tiếp với slave-node trong 10 giây, master-node này sẽ được cho là ngưng hoạt động và quá trình chọn một master-node mới sẽ diễn ra, thường quá trình này sẽ mất khoảng 12 giây (bao gồm cả thời gian đánh dấu master-node ngưng hoạt động).


Trong khoảng thời gian cho quá trình tuyển chọn này, các máy khách sẽ không thể ghi dữ liệu nhưng việc dọc dữ liệu vẫn được được xử lý bình thường.

Tải cân bằng (Load balancing Replicas)

Ở MongoDB, Máy khách đọc dữ liệu từ một node chính mặc định có thể được chuyển hướng Request đến một node thứ cấp khác để cân bằng tải. Chúng ta chỉ cần "nói" với MongoDB driver rằng chúng ta muốn thực hiện việc đọc dữ liệu trên node thứ cấp, Mongo driver sẽ tự động phân biệt các node và điều hướng.

Lệnh đọc tham chiếu: db.getMongo().setReadPref(‘secondary’) 

Post a Comment

Mới hơn Cũ hơn