MongoDB - Replication

Xin chào, những người đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới thú vị của việc sao lưu MongoDB. Là một giáo viên khoa học máy tính gần gũi, tôi rất vui mừng được hướng dẫn các bạn trong hành trình này. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - chúng ta sẽ bắt đầu từ những điều cơ bản và dần dần nâng cao. Vậy, hãy lấy một tách cà phê (hoặc trà, nếu đó là sở thích của bạn), và chúng ta cùng bắt đầu!

MongoDB - Replication

Tại sao cần Sao lưu?

Hãy tưởng tượng bạn đang giữ tất cả những bức ảnh gia đình quý giá trong một album. Điều gì sẽ xảy ra nếu album đó bị hư hại hoặc mất tích? Đó là một suy nghĩ đáng sợ, phải không? Đúng vậy, đó chính là lý do chúng ta cần sao lưu trong cơ sở dữ liệu!

Sao lưu trong MongoDB giống như tạo ra nhiều bản sao của album ảnh đó và lưu trữ chúng ở những nơi khác nhau. Dưới đây là lý do tại sao điều này lại quan trọng:

  1. Hiệu suất cao: Nếu một máy chủ bị sập, dữ liệu của bạn vẫn có thể truy cập từ các máy chủ khác.
  2. An toàn dữ liệu: Nhiều bản sao có nghĩa là dữ liệu của bạn vẫn an toàn ngay cả khi một bản sao bị hư hại.
  3. Tăng cường hiệu suất đọc: Nhiều bản sao cho phép thực hiện các thao tác đọc phân tán, làm cho cơ sở dữ liệu của bạn nhanh hơn.
  4. Phục hồi thảm họa: Trong trường hợp một thảm họa lớn, bạn có thể phục hồi dữ liệu từ các địa điểm khác nhau.

Cách Sao lưu hoạt động trong MongoDB

Bây giờ, hãy cùng hiểu cách MongoDB thực hiện phép thuật sao lưu này. MongoDB sử dụng khái niệm gọi là "Replica Sets". Hãy tưởng tượng một replica set là một nhóm các máy chủ MongoDB chứa cùng một dữ liệu.

Dưới đây là một sơ đồ đơn giản để hình dung:

   [Primary]
      /|\
     / | \
    /  |  \
   /   |   \
[Secondary][Secondary]
  1. Node Primarily: Đây là máy chủ chính nhận tất cả các thao tác ghi.
  2. Nodes Secundary: Đây là các bản sao của node chính. Chúng sao lưu dữ liệu của node chính để giữ cho dữ liệu luôn cập nhật.

Khi bạn ghi dữ liệu vào node chính, nó ghi lại thao tác này trong "oplog" (log thao tác). Các node secunday sau đó sao chép oplog này và áp dụng các thao tác tương tự vào dữ liệu của riêng chúng.

Dưới đây là một đoạn mã giả để minh họa quá trình này:

# Trên Node Primarily
def write_data(data):
    store_data(data)
    log_operation(data)

# Trên Nodes Secundary
while True:
    new_operations = fetch_new_operations_from_primary()
    for operation in new_operations:
        apply_operation(operation)

Tính năng của Replica Set

Replica sets của MongoDB có một số tính năng tuyệt vời giúp cuộc sống của chúng ta dễ dàng hơn:

  1. Tự động failover: Nếu node chính bị失败, một node secunday tự động trở thành node chính mới.
  2. Tự động phục hồi: Khi một node bị失败 trở lại trực tuyến, nó tự động đồng bộ với node chính hiện tại.
  3. Cấu hình linh hoạt: Bạn có thể có các loại node khác nhau trong một replica set, như node ẩn hoặc node trễ.

Hãy cùng xem bảng các loại node khác nhau:

Loại Node Mô tả Trường hợp sử dụng
Regular Secondary Bản sao chuẩn của node chính Đ replication và failover
Hidden Không可见 cho các ứng dụng Dành cho sao lưu hoặc báo cáo
Delayed Sao lưu dữ liệu với độ trễ Bảo vệ chống lại lỗi con người
Arbiter Không giữ dữ liệu, chỉ bỏ phiếu trong cuộc bầu cử Giữ số lượng node lẻ

Thiết lập một Replica Set

Bây giờ, hãy cùng làm việc thực tế và thiết lập một replica set! Chúng ta sẽ tạo một replica set ba node trên máy tính本地.

Đầu tiên, tạo ba thư mục dữ liệu riêng biệt:

mkdir -p /data/rs1 /data/rs2 /data/rs3

Bây giờ, khởi động ba instance của mongod:

mongod --replSet myrs --port 27017 --dbpath /data/rs1
mongod --replSet myrs --port 27018 --dbpath /data/rs2
mongod --replSet myrs --port 27019 --dbpath /data/rs3

Kết nối với một trong các instance và khởi tạo replica set:

rs.initiate({
   _id: "myrs",
   members: [
      { _id: 0, host: "localhost:27017" },
      { _id: 1, host: "localhost:27018" },
      { _id: 2, host: "localhost:27019" }
   ]
})

Mã này tạo một replica set có tên là "myrs" với ba thành viên. Hàm rs.initiate() thiết lập cấu hình replica set.

Thêm Thành viên vào Replica Set

Nếu bạn muốn thêm nhiều thành viên vào replica set của mình sau này? Không có vấn đề gì! MongoDB cho phép bạn thêm mới thành viên một cách linh hoạt.

Dưới đây là cách bạn có thể thêm một thành viên mới:

rs.add("localhost:27020")

Lệnh này thêm một thành viên mới chạy trên cổng 27020 vào replica set hiện tại của chúng ta.

Bạn cũng có thể loại bỏ một thành viên nếu cần:

rs.remove("localhost:27020")

Nhớ rằng, luôn tốt nhất để có số lượng thành viên votes lẻ trong một replica set. Điều này giúp trong cuộc bầu cử khi chọn một node chính mới.

Và thế là xong, các bạn! Chúng ta đã bao quát các kiến thức cơ bản về sao lưu MongoDB. Từ việc hiểu tại sao chúng ta cần sao lưu, đến việc thiết lập replica set của riêng mình, chúng ta đã đi một chặng đường dài.

Nhớ rằng, thực hành là cách tốt nhất để thành thạo. Hãy thử thiết lập replica set của riêng bạn, chơi với các cấu hình khác nhau, và đừng sợ mắc lỗi. Đó là cách chúng ta học hỏi!

Như giáo sư cơ sở dữ liệu cũ của tôi từng nói, "Trong thế giới dữ liệu,冗余 không phải là lỗi, đó là tính năng!" Chúc các bạn sao lưu vui vẻ!

Credits: Image by storyset