Sao chép bằng bộ bản sao là một phương pháp mạnh mẽ để tăng khả năng phục hồi dữ liệu của toàn bộ cơ sở dữ liệu MongoDB của bạn
Trong bài viết này, tôi sẽ hướng dẫn bạn
Bắt đầu nào
[Bài viết này là một phần của Hướng dẫn MongoDB của chúng tôi. Sử dụng menu bên phải để điều hướng. ]
Bản sao MongoDB là gì?
Nói một cách đơn giản, sao chép MongoDB là quá trình tạo một bản sao của cùng một tập dữ liệu trong nhiều máy chủ MongoDB. Điều này có thể đạt được bằng cách sử dụng Bộ bản sao. Bộ bản sao là một nhóm các phiên bản MongoDB duy trì cùng một tập dữ liệu và liên quan đến bất kỳ quy trình mongod nào
Bản sao cho phép quản trị viên cơ sở dữ liệu cung cấp
- Dữ liệu dự phòng
- Tính sẵn sàng cao của dữ liệu
Việc duy trì nhiều máy chủ MongoDB với cùng một dữ liệu cung cấp quyền truy cập phân tán vào dữ liệu đồng thời tăng khả năng chịu lỗi của cơ sở dữ liệu bằng cách cung cấp các bản sao lưu
Ngoài ra, sao chép cũng có thể được sử dụng như một phần của cân bằng tải, trong đó các hoạt động đọc và ghi có thể được phân phối trên tất cả các phiên bản tùy thuộc vào trường hợp sử dụng
Cách sao chép MongoDB hoạt động
MongoDB xử lý sao chép thông qua Bộ bản sao, bao gồm nhiều nút MongoDB được nhóm lại với nhau thành một đơn vị
Bộ bản sao yêu cầu tối thiểu ba nút MongoDB
- Một trong các nút sẽ được coi là nút chính nhận tất cả các thao tác ghi
- Những cái khác được coi là nút phụ. Các nút phụ này sẽ sao chép dữ liệu từ nút chính
Phương pháp sao chép cơ bản
Mặc dù nút chính là phiên bản duy nhất chấp nhận thao tác ghi, bất kỳ nút nào khác trong bộ bản sao đều có thể chấp nhận thao tác đọc. Chúng có thể được định cấu hình thông qua ứng dụng khách MongoDB được hỗ trợ
Trong trường hợp nút chính không khả dụng hoặc không thể hoạt động, nút phụ sẽ đảm nhận vai trò của nút chính để cung cấp dữ liệu liên tục. Trong trường hợp như vậy, việc lựa chọn nút chính được thực hiện thông qua một quy trình có tên là Bầu chọn tập hợp bản sao, trong đó nút phụ phù hợp nhất được chọn làm nút chính mới
Quy trình nhịp tim
Heartbeat là quá trình xác định trạng thái hiện tại của nút MongoDB trong bộ bản sao. Ở đó, các nút thiết lập bản sao gửi ping cho nhau cứ sau hai giây [do đó có tên]. Nếu bất kỳ nút nào không ping lại trong vòng 10 giây, các nút khác trong bộ bản sao sẽ đánh dấu nút đó là không thể truy cập được
Chức năng này rất quan trọng đối với quy trình chuyển đổi dự phòng tự động trong đó nút chính không thể truy cập được và các nút phụ không nhận được nhịp tim từ nút đó trong khung thời gian được phân bổ. Sau đó, MongoDB sẽ tự động chỉ định một máy chủ phụ đóng vai trò là máy chủ chính
Bản sao thiết lập cuộc bầu cử
Các cuộc bầu cử trong bộ bản sao được sử dụng để xác định nút MongoDB nào sẽ trở thành nút chính. Các cuộc bầu cử này có thể xảy ra trong các trường hợp sau
- Mất kết nối với nút chính [được phát hiện bằng nhịp tim]
- Đang khởi tạo một bộ bản sao
- Thêm một nút mới vào một bộ bản sao hiện có
- Bảo trì bộ Bản sao bằng cách sử dụng stepDown hoặc rs. phương pháp cấu hình lại
Trong quá trình bầu cử, đầu tiên, một trong các nút sẽ giương cờ yêu cầu bầu cử và tất cả các nút khác sẽ bỏ phiếu để chọn nút đó làm nút chính. Thời gian trung bình để hoàn tất quy trình bầu chọn là 12 giây, giả sử rằng cài đặt cấu hình bản sao ở giá trị mặc định. Một yếu tố chính có thể ảnh hưởng đến thời gian hoàn thành cuộc bầu cử là độ trễ của mạng và yếu tố này có thể gây ra sự chậm trễ trong việc đặt bản sao của bạn hoạt động trở lại với nút chính mới
Bộ bản sao không thể xử lý bất kỳ thao tác ghi nào cho đến khi quá trình bầu chọn hoàn tất. Tuy nhiên, các hoạt động đọc có thể được phục vụ nếu các truy vấn đọc được định cấu hình để xử lý trên các nút phụ. MongoDB 3. 6 hỗ trợ các trình điều khiển kết nối tương thích được định cấu hình để thử lại
Bộ bản sao MongoDB vs Cụm MongoDB
Bộ bản sao tạo nhiều bản sao của cùng một tập dữ liệu trên các nút của bộ bản sao. Mục tiêu cơ bản của một bộ bản sao là để
- Tăng tính khả dụng của dữ liệu
- Cung cấp giải pháp sao lưu tích hợp
Các cụm hoạt động khác nhau. Cụm MongoDB phân phối dữ liệu trên nhiều nút bằng khóa phân đoạn. Quá trình này sẽ chia nhỏ dữ liệu thành nhiều phần được gọi là phân đoạn và sau đó sao chép từng phân đoạn vào một nút riêng biệt
Mục đích chính của một cụm là hỗ trợ các tập dữ liệu cực lớn và các hoạt động có thông lượng cao bằng cách thay đổi quy mô khối lượng công việc theo chiều ngang
Sự khác biệt chính giữa bộ bản sao và cụm là
- Một bộ bản sao sao chép toàn bộ tập dữ liệu
- Một cụm phân phối khối lượng công việc và lưu trữ các mẩu dữ liệu [phân đoạn] trên nhiều máy chủ
MongoDB cho phép người dùng kết hợp hai chức năng này bằng cách tạo một cụm phân đoạn, trong đó mỗi phân đoạn được sao chép sang một máy chủ thứ cấp để cung cấp tính khả dụng và dự phòng dữ liệu cao
Xử lý sự chậm trễ sao chép
Một mối quan tâm chính khi cấu hình sao chép là độ trễ sao chép [lag]. Điều này đề cập đến độ trễ trong quá trình sao chép sang nút phụ sau khi cập nhật lên nút chính trong bộ bản sao
Độ trễ sao chép nhất định trong khi sao chép tập dữ liệu lớn là bình thường. Tuy nhiên, các yếu tố sau có thể làm tăng độ trễ sao chép, phủ nhận lợi ích của việc sao chép cập nhật
- Độ trễ mạng. Vì bạn đang xử lý nhiều phiên bản MongoDB nằm trong các máy chủ khác nhau trong quá trình sao chép, nên phương thức giao tiếp chính sẽ là mạng. Nếu mạng không đủ để đáp ứng nhu cầu của quá trình sao chép, thì sẽ có sự chậm trễ trong việc sao chép dữ liệu trong toàn bộ bản sao. Do đó, tốt hơn hết là luôn định tuyến lưu lượng truy cập của bạn trong một mạng ổn định với đủ băng thông
- Thông lượng đĩa. Nếu các nút sao chép sử dụng các loại đĩa khác nhau [e. g. , nút chính sử dụng SSD trong khi các nút phụ sử dụng ổ cứng HDD làm đĩa], sẽ có độ trễ trong quá trình sao chép do các nút phụ sẽ xử lý các truy vấn ghi chậm hơn so với nút chính. Đây là một vấn đề phổ biến trong triển khai nhiều bên thuê và quy mô lớn
- khối lượng công việc nặng. Việc thực hiện các thao tác ghi nặng và kéo dài trên nút chính cũng sẽ dẫn đến sự chậm trễ trong quá trình sao chép. Vì vậy, tốt nhất là định cấu hình chính xác MongoDB Write Concern để quá trình sao chép có thể theo kịp khối lượng công việc mà không ảnh hưởng đến hiệu suất tổng thể của bộ bản sao
- Nhiệm vụ nền. Một bước quan trọng khác là xác định các tác vụ nền như cập nhật máy chủ, công việc định kỳ và kiểm tra bảo mật có thể gây ra các tác động không mong muốn đối với việc sử dụng mạng hoặc ổ đĩa, gây ra sự chậm trễ trong quá trình sao chép
- Hoạt động cơ sở dữ liệu. – Một số truy vấn cơ sở dữ liệu có thể thực thi chậm, trong khi một số truy vấn có thể mất nhiều thời gian để thực hiện. Sử dụng trình lược tả cơ sở dữ liệu, bạn có thể xác định các truy vấn như vậy và cố gắng tối ưu hóa chúng cho phù hợp
Định cấu hình Bộ bản sao
Các phần trên đã bao gồm tất cả các lý thuyết quan trọng liên quan đến sao chép. Tiếp theo, hãy định cấu hình bộ bản sao bằng các phiên bản MongoDB được cài đặt trên ba máy chủ Ubuntu
Thiết lập môi trường
Mỗi máy chủ Ubuntu sẽ có phiên bản MongoDB riêng với cổng MongoDB tiêu chuẩn 27017 có thể truy cập thông qua tường lửa. MongoDB khuyến nghị sử dụng tên máy chủ DNS hợp lý thay vì địa chỉ IP khi định cấu hình bộ bản sao trong môi trường sản xuất. Đó là để tránh gián đoạn giao tiếp trong bộ bản sao do thay đổi địa chỉ IP
Bạn có thể cập nhật tệp /etc/hosts để gán tên máy chủ cho từng máy chủ trong môi trường thử nghiệm. Ở đó, bạn phải thêm các tên máy chủ được đề cập bên dưới làm máy chủ chỉ ra từng nút và khởi động lại từng máy chủ để tải cấu hình mới
/etc/hosts
10.10.10.56 mongodb-node-01 10.10.10.57 mongodb-node-02 10.10.10.58 mongodb-node-03
Bắt đầu phiên bản MongoDB
Trước khi bắt đầu phiên bản MongoDB, bạn cần sửa đổi tệp cấu hình trong mỗi máy chủ để phản ánh địa chỉ IP và chỉ ra bộ bản sao. Hãy thực hiện các sửa đổi sau trong mỗi mongod. tập tin conf
mongodb-nút-01
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-01# replica set replication: replSetName: replicasetMain
mongodb-nút-02
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-02# replica set replication: replSetName: replicasetMain
mongodb-nút-03
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-03# replica set replication: replSetName: replicasetMain
Sau khi cập nhật xong, hãy khởi động lại dịch vụ mongod trong từng phiên bản để tải lại cấu hình
sudo systemctl restart mongod
Khởi tạo bộ bản sao
Bạn có thể khởi tạo một bộ bản sao bằng cách sử dụng rs. khởi tạo phương thức[]. Phương thức này chỉ được yêu cầu thực thi trên một cá thể MongoDB duy nhất trong bộ bản sao. Trong phương thức khởi tạo, bạn có thể chỉ định tên bộ bản sao và thành viên. Các chi tiết này phải khớp với các cấu hình bạn đã thực hiện trong từng tệp cấu hình ở bước trước
rs.initiate[ { _id : "replicasetMain", members: [ { _id: 0, host: "mongodb-node-01:27017" }, { _id: 1, host: "mongodb-node-02:27017" }, { _id: 2, host: "mongodb-node-03:27017" } ] }]
Kết quả
sử dụng rs. conf[], bạn có thể xem cấu hình bộ bản sao như bên dưới
rs.conf[]
Kết quả
Xác thực sao chép dữ liệu
Bây giờ bạn đã định cấu hình bộ sao chép, bước tiếp theo là xác thực quy trình sao chép. Để làm điều đó, trước tiên hãy đăng nhập vào nút MongoDB chính trong bộ bản sao
Sau đó, bạn cần tạo một bộ sưu tập với một số dữ liệu mẫu bằng các lệnh sau
use replicatestdata db.createCollection["replicatestCollection01"] db.replicatestCollection01.insertMany[[ {name: "test_record_one", description: "testing replica set", record: 1}, {name: "test_record_two", description: "testing replica set", record: 2}, {name: "test_record_three", description: "testing replica set", record: 3} ]]
Kết quả
Tiếp theo, đăng nhập vào nút phụ và kiểm tra xem dữ liệu có bị sao chép không. Một điều quan trọng cần lưu ý ở đây là theo mặc định, các truy vấn đã đọc bị tắt trong các nút phụ. Vì vậy, bạn cần kích hoạt chúng bằng lệnh sau
________số 8Sau đó, bạn có thể tìm kiếm dữ liệu và xác minh xem chúng có được sao chép tốt vào nút phụ hay không
show dbs use replicatestdata show collections db.replicatestCollection01.find[].sort[{record: 1}].pretty[]
Kết quả
Kết quả trên chỉ ra rằng dữ liệu của nút chính đã được sao chép thành công sang phiên bản phụ
Thêm một nút mới vào Bộ bản sao
sử dụng rs. add[], bạn có thể thêm một nút mới vào bộ bản sao hiện có
Trước khi thêm một nút mới, bạn cần cấu hình nó. Đối với điều đó, sửa đổi mongd. conf để chỉ ra bộ bản sao và khởi động lại dịch vụ mongod
mongodb-nút-04
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-01# replica set replication: replSetName: replicasetMain0
Sau đó, chuyển đến nút chính của bộ bản sao và chạy lệnh add[] với các tham số được liệt kê bên dưới
- máy chủ đề cập đến địa chỉ IP hoặc tên máy chủ của nút mới
- mức độ ưu tiên cho biết tính đủ điều kiện tương đối của nút mới để trở thành nút chính. [ưu tiên 0 có nghĩa là nút không thể trở thành nút chính trong bất kỳ trường hợp nào. ]
- phiếu bầu cho biết nút đó có khả năng bỏ phiếu trong các cuộc bầu cử để chọn nút chính hay không
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-01# replica set replication: replSetName: replicasetMain1
Kết quả
Lệnh trên sẽ thêm một nút mới vào bộ bản sao. Bạn có thể xác minh xem nút mới đã được thêm chưa bằng cách sử dụng lệnh rs. lệnh status[], lệnh này sẽ hiển thị thông tin chi tiết của nút mới
# network interfaces net: port: 27017 bindIp: 127.0.0.1,mongodb-node-01# replica set replication: replSetName: replicasetMain2
Kết quả
Cuối cùng, dữ liệu trong các nút khác sẽ được tự động sao chép sang nút mới
Xóa một nút khỏi Bộ bản sao
rs. lệnh remove[] có thể được sử dụng để xóa một nút khỏi bộ bản sao. Bạn cần tắt phiên bản máy chủ trước khi thử xóa một nút. Khi xóa, bạn có thể chỉ định nút nào sẽ bị xóa bằng tên của nút đó