Skip to content

Làm sao để sync nhiều cụm database với nhau? #2

@phanstasmal

Description

@phanstasmal

Q:

Làm sao để sync nhiều cụm database với nhau?

A:

1. Sync realtime

Dùng một cơ chế gọi remote các thao tác dữ liệu, thực hiện trên master xong, sau đó remote write (gọi hàm write) qua các cụm còn lại
Cái này đáp ứng nhu cầu realtime, nhưng các cụm (hoặc các nút dữ liệu) còn lại, sẽ có một độ trễ cập nhật nhất định, gọi là lag
Tụi database có replicate (dạng node nào cũng chứa data) thường rất thích phong cách này, chú ý là replicate lại chia thành nhiều kiểu, phần đó nói sau (hoặc khi nào buồn thì nói)

2. async

a. Cơ chế dump, dump all image của database rồi copy qua. Cái này thì hay làm bằng tay, nhưng thực tế là làm vậy downtime như hạm + rất chậm, làm tay chứ ko ai cho db tự vận hành mà làm vậy, trừ khi dùng để backup
b. Cơ chế dùng log thay đổi (gọi là command log, commit log, change log ... các kiểu). Dạng này khi có thay đổi, nó write vào 1 file tăng tuyến tính, khi các cụm (hay node) data muốn sync data từ server master, nó tự request để lấy đoạn mà nó chưa có (tức là lấy mốc từ last update time) bằng cách đó các node data từ chưa đồng bộ dữ liệu vẫn có thể sync data từ con master về được mà ko cần dump hết data

Q:

Realtime sync: tại sao lại xảy ra tình trạng lag?

A:

Khi write vào db thường phải sử dụng transaction để tránh tình trạng lỗi db, time open và close db thường khá chậm, thế nên khi con master write xong một lượng dữ liệu lớn thì mới đẩy qua các con còn lại.
Cơ chế này bọn replicate rất thích vì 1 con được update là các con còn lại update theo, chỉ phụ thuộc con master.

cái này ko hẳn, vì như bên anh ko có khái niệm transaction
vẫn dùng remote
lag đó là do thằng master update rồi, thằng khác get ngay trên nó thì có ngay, nhưng chưa kịp write xuống slave node
đoạn thời gian ngắn đó gọi là lag
như anh đọc trong cuốn sách thì có 1 cách dùng anh thấy rất hay
khi db vận hành bình thường:
mode remote được duy trì
khi 1 mode bị tạch, thì khi nó hồi sinh, vẫn cần sync data với node master, nó sẽ dùng commit log để lấy được last update kể từ record cuối nó đã ghi được

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions