Nhân rộng đã được áp dụng rộng rãi trong các hệ thống cơ sở dữ liệu để đảm bảo tính sẵn sàng cao của dữ liệu thông qua việc tạo dự phòng. Về cơ bản, đây là chiến lược tạo một bản sao của cùng một dữ liệu trong các máy chủ đang chạy khác nhau có thể ở các máy khác nhau để trong trường hợp máy chủ chính bị lỗi, một máy khác có thể được mang đến để tiếp tục phục vụ.
Tập hợp bản sao là một nhóm các cá thể MongoDB duy trì cùng một tập dữ liệu. Chúng là cơ sở của việc triển khai sản xuất. Nhân rộng có lợi bởi thực tế là dữ liệu luôn có sẵn từ một máy chủ khác đề phòng trường hợp hệ thống máy chủ chính bị lỗi. Bên cạnh đó, nó cải thiện thông lượng đọc bằng cách cho phép máy khách gửi yêu cầu đọc đến các máy chủ khác nhau và nhận phản hồi từ máy chủ gần nhất.
Một tập hợp bản sao tạo thành một số nút mang dữ liệu có thể được lưu trữ trong các máy khác nhau và một nút trọng tài. Một trong những nút mang dữ liệu này được gắn nhãn là nút chính trong khi các nút khác là nút phụ. Nút chính nhận tất cả các thao tác ghi và sau đó sao chép dữ liệu sang các nút khác sau khi hoàn thành thao tác ghi và các thay đổi được ghi lại trong một oplog.
Trọng tài là một ví dụ bổ sung không duy trì một tập dữ liệu nhưng cung cấp một số đại biểu trong một tập hợp bản sao bằng cách phản hồi nhịp tim và yêu cầu bầu cử của các thành viên tập hợp bản sao khác. thành viên tập hợp bản sao với tập dữ liệu.
Tự động chuyển đổi dự phòng
Một nút chính có thể bị lỗi do một số lý do như mất điện hoặc ngắt kết nối mạng do đó không thể giao tiếp với các thành viên khác. Nếu thông tin liên lạc bị ngắt trong hơn khoảng thời gian bầu cử đã định cấu hìnhTimeoutMillis, một trong những người thứ hai sẽ kêu gọi một cuộc bầu cử để tự đề cử mình làm bầu cử sơ bộ mới. Nếu cuộc bầu cử hoàn tất và thành công, cụm tiếp tục hoạt động bình thường. Trong khoảng thời gian này, không có thao tác ghi nào có thể được thực hiện. Tuy nhiên, các truy vấn đã đọc có thể được định cấu hình để hoạt động bình thường trên tạp chí thứ hai trong khi truy vấn chính ngoại tuyến.
Đối với quy trình sao chép tối ưu, thời gian trung bình trước khi cụm chọn một nhóm chính mới tối đa phải là 12 giây với cài đặt cấu hình sao chép mặc định. Điều này có thể bị ảnh hưởng bởi các yếu tố như độ trễ mạng có thể kéo dài thời gian, do đó người ta nên xem xét kiến trúc của cụm để đảm bảo thời gian này không được đặt quá cao.
Giá trị cho voteTimeoutMillis có thể được hạ xuống từ 10000 (10 giây) mặc định, do đó, giá trị chính có thể được phát hiện đầu tiên trong thời gian rất nhanh. Tuy nhiên, điều này có thể khiến các cuộc bầu cử diễn ra thường xuyên vì các yếu tố nhỏ, chẳng hạn như độ trễ mạng tạm thời mặc dù nút chính hoạt động tốt. Điều này sẽ dẫn đến các vấn đề chẳng hạn như khôi phục cho các hoạt động ghi.
Chịu trách nhiệm cho các bộ bản sao
Như đã đề cập, một tập hợp bản sao có thể có các thành viên từ các máy chủ khác nhau, do đó làm cho việc duy trì cụm phức tạp hơn. Chúng tôi cần một nền tảng duy nhất mà từ đó tập hợp bản sao này có thể được duy trì một cách dễ dàng. Ansible là một trong những công cụ cung cấp cái nhìn tổng quan hơn cho việc định cấu hình và quản lý một tập hợp bản sao. Nếu bạn chưa quen với ansible, vui lòng tóm tắt nhanh từ bài viết này để hiểu những kiến thức cơ bản về cách tạo playbook.
Tham số cấu hình
- Arbiter_at_index: điều này xác định vị trí của trọng tài trong danh sách thành viên tập hợp bản sao. Một bộ nhớ trọng tài không có bất kỳ dữ liệu nào như các thành viên khác và không thể được sử dụng làm nút chính. Nó chỉ có sẵn để tạo ra một túc số trong cuộc bầu cử. Ví dụ:nếu bạn có một số thành viên chẵn, thì tốt hơn là thêm một trọng tài sao cho nếu số phiếu bằng nhau, nó sẽ thêm số 1 để tạo thành thành viên chiến thắng. Giá trị được gán phải là một số nguyên.
- chaining_allowed: Điều này nhận một giá trị boolean và xác định xem các thành viên phụ khác có nên sao chép từ các thành viên phụ khác hay không nếu chuỗi _allowed =true. Ngược lại, nếu chuỗi _allowed =false, các thành viên phụ khác chỉ có thể sao chép từ chính. Giá trị mặc định là true.
- bầu cử_timeout_secs: theo mặc định giá trị là 10000 (lấy giá trị nguyên). Đó là thời gian tính bằng mili giây để phát hiện khi nào nút chính không thể truy cập được hoặc đúng hơn là không giao tiếp với các thành viên khác, do đó sẽ kích hoạt một cuộc bầu cử. Đặt giá trị này thành giá trị trung bình là 12 giây. Nếu đặt quá cao, sẽ mất nhiều thời gian trước khi phát hiện ra lỗi chính và do đó sẽ lâu hơn để thực hiện một cuộc bầu cử. Vì điều này ảnh hưởng đến hoạt động ghi, bạn có thể mất rất nhiều dữ liệu trong khoảng thời gian đó. Mặt khác, nếu nó được đặt quá thấp, sẽ có thể thường xuyên kích hoạt một cuộc bầu cử ngay cả khi trường hợp không nghiêm trọng đến mức đó và vẫn có thể tiếp cận được sơ bộ. Do đó, bạn sẽ có quá nhiều lần khôi phục cho các hoạt động ghi, đến một lúc nào đó có thể dẫn đến tính toàn vẹn hoặc không nhất quán của dữ liệu kém.
- heartbeat_timeout_secs: Các nhóm bản sao cần giao tiếp với nhau trước một cuộc bầu cử bằng cách gửi một tín hiệu được gọi là nhịp tim. Sau đó, các thành viên cần phản hồi tín hiệu này trong một khoảng thời gian cụ thể mà theo mặc định được đặt thành 10 giây. Heartbeat_timeout_secs là số giây mà các thành viên tập hợp bản sao chờ đợi một nhịp tim thành công từ nhau và nếu một thành viên không phản hồi, nó được đánh dấu là không thể truy cập được. Tuy nhiên, điều này chỉ áp dụng cho phiên bản giao thức 0. Do đó, giá trị của nó là một số nguyên.
- login_host: Đây là máy chủ lưu trữ cơ sở dữ liệu đăng nhập. Theo mặc định cho MongoDB là máy chủ cục bộ.
- login_database: mặc định là quản trị viên và là nơi lưu trữ thông tin đăng nhập. (lấy giá trị chuỗi)
- login_user: tên người dùng mà quá trình xác thực sẽ được thực hiện. (lấy giá trị chuỗi)
- login_password: mật khẩu để xác thực người dùng. (lấy một giá trị chuỗi)
- login_port: Đây là cổng MongoDB để máy chủ đăng nhập. (nhận một giá trị nguyên)
- thành viên: xác định danh sách các thành viên tập hợp bản sao. Nó là một chuỗi được phân tách bằng dấu phẩy hoặc danh sách yaml, tức là mongodb0:27017, mongodb2:27018, mongodb3:27019… Nếu không có số cổng, thì 27017 được giả định.
- protocol_version: lấy một số nguyên xác định phiên bản của quá trình sao chép. 0 hoặc 1
- replica_set: đây là một giá trị chuỗi xác định tên của tập hợp bản sao.
- ssl: giá trị boolean xác định có sử dụng kết nối SSL khi kết nối với cơ sở dữ liệu hay không.
- ssl_certs_reqs: điều này chỉ định xem chứng chỉ có được yêu cầu từ phía bên kia của kết nối hay không và có cần phải xác thực nó nếu được cung cấp hay không. Các lựa chọn cho điều này là CERT_NONE, CERT_OPTIONAL và CERT_REQUIRED. Giá trị mặc định là CERT_REQUIRED.
- xác thực: nhận một giá trị boolean xác định xem có thực hiện bất kỳ xác thực cơ bản nào trên cấu hình bộ bản sao được cung cấp hay không. Giá trị mặc định là true.
Tạo bộ bản sao MongoDB bằng Ansible
Đây là một ví dụ đơn giản về các tác vụ để thiết lập một tập hợp bản sao trong không thể trả được. Hãy gọi tệp này là task.yaml
# Create a replicaset called 'replica0' with the 3 provided members
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_user: admin
login_password: root
replica_set: replica0
arbiter_at_index:2
election_timeout_secs:12000
members:
- mongodb1:27017
- mongodb2:27018
- mongodb3:27019
when: groups.mongod.index(inventory_hostname) == 0
# Create two single-node replicasets on the localhost for testing
- name: Ensure replicaset replica0 exists
mongodb_replicaset:
login_host: localhost
login_port: 3001
login_user: admin
login_password: root
login_database: admin
replica_set: replica0
members: localhost:3000
validate: yes
- name: Ensure replicaset replica1 exists
mongodb_replicaset:
login_host: localhost
login_port: 3002
login_user: admin
login_password: secret
login_database: root
replica_set: replica1
members: localhost:3001
validate: yes
Trong playbook của chúng tôi, chúng tôi có thể gọi các nhiệm vụ như
---
- hosts: ansible-test
remote_user: root
become: yes
Tasks:
- include: tasks.yml
Nếu bạn chạy điều này trong playbook của mình, ansible-playbook -i stock.txt -c ssh mongodbcreateReplcaSet.yaml, bạn sẽ nhận được phản hồi nếu tập hợp bản sao đã được tạo hay chưa. Nếu khóa mongodb_replicaset được trả về với giá trị thành công và mô tả về tập hợp bản sao đã được tạo, thì bạn đã sẵn sàng.
Kết luận
Trong MongoDB nói chung, thật tẻ nhạt khi định cấu hình một bộ bản sao cho các cá thể mongod có thể được lưu trữ bởi các máy khác nhau. Tuy nhiên, Ansible cung cấp một nền tảng đơn giản để thực hiện điều tương tự bằng cách chỉ xác định một vài tham số như đã thảo luận ở trên. Nhân rộng là một trong những quy trình đảm bảo ứng dụng hoạt động liên tục do đó cần được cấu hình tốt bằng cách thiết lập nhiều thành viên trong thế giới sản xuất. Trọng tài được sử dụng để tạo túc số trong quá trình bầu cử do đó cần được đưa vào tệp cấu hình bằng cách xác định vị trí của nó.