MongoDB và Kubernetes là một sự kết hợp tuyệt vời, đặc biệt là về độ phức tạp. Tuy nhiên, MongoDB (PSMDB) của Percona cung cấp tính linh hoạt hơn cho cơ sở dữ liệu NoSQL và nó cũng đi kèm với các công cụ hiệu quả cho năng suất ngày nay; không chỉ tại chỗ mà còn có sẵn cho người bản địa trên đám mây.
Tỷ lệ chấp nhận Kubernetes của Ther đang tăng đều đặn. Điều hợp lý là một công nghệ phải có một nhà điều hành để thực hiện những việc sau:tạo, sửa đổi và xóa các mục Máy chủ Percona cho môi trường MongoDB. Nhà khai thác Percona MongoDB Kubernetes chứa các cài đặt k8s cần thiết để duy trì Máy chủ Percona nhất quán cho phiên bản MongoDB. Là một tùy chọn thay thế, bạn có thể so sánh trang này với https://github.com/kubedb/mongodb nhưng KubeDB cho MongoDB cung cấp các tùy chọn rất hạn chế để cung cấp, đặc biệt là trên các hệ thống cấp sản xuất.
Các nhà khai thác Percona Kubernetes tự hào về cấu hình của nó là dựa trên và đang tuân theo các phương pháp hay nhất để cấu hình tập bản sao PSMDB. Điều quan trọng nhất, bản thân nhà điều hành MongoDB cung cấp nhiều lợi ích nhưng tiết kiệm thời gian, môi trường nhất quán là quan trọng nhất. Trong blog này, chúng ta sẽ xem xét tổng quan về lợi ích của điều này, đặc biệt là trong môi trường được đóng gói.
Nhà điều hành này có thể cung cấp những gì?
Toán tử này hữu ích cho PSMDB bằng cách sử dụng một tập hợp bản sao. Điều này có nghĩa là, kiến trúc thiết kế cơ sở dữ liệu của bạn phải tuân theo sơ đồ sau đây
Hình ảnh được mượn từ Tổng quan về Thiết kế Tài liệu của PerconaHình ảnh được mượn từ Tổng quan về Thiết kế Tài liệu của Percona
Hiện tại, các nền tảng được hỗ trợ có sẵn cho nhà điều hành này là:
- OpenShift 3.11
- OpenShift 4.5
- Google Kubernetes Engine (GKE) 1.15 - 1.17
- Amazon Elastic Container Service cho Kubernetes (EKS) 1.15
- Minikube 1.10
- VMWare Tanzu
Các nền tảng Kubernetes khác cũng có thể hoạt động nhưng chưa được kiểm tra.
Giới hạn Tài nguyên
Một cụm chạy nền tảng được hỗ trợ chính thức chứa ít nhất ba Nút, với các tài nguyên sau:
- 2GB RAM
- 2 luồng CPU trên mỗi Node cho cấp phép Pods
- ít nhất 60GB bộ nhớ khả dụng để cấp phép cho Tập riêng tư
Ràng buộc về Bảo mật và / Hoặc Hạn chế
Kubernetes hoạt động giống như khi tạo Pod, mỗi Pod có một địa chỉ IP trong mạng ảo nội bộ của cụm. Tạo hoặc hủy các Nhóm đều là quá trình động, vì vậy bạn không nên liên kết các nhóm của mình với các địa chỉ IP cụ thể được chỉ định để giao tiếp giữa các Nhóm. Điều này có thể gây ra sự cố vì mọi thứ thay đổi theo thời gian do quy mô cụm, lỗi vô ý, mất điện một chiều hoặc thảm họa hoặc bảo trì định kỳ, v.v. Trong trường hợp đó, nhà điều hành khuyến nghị bạn nên kết nối với Máy chủ Percona cho MongoDB thông qua Kubernetes nội bộ Tên DNS trong URI (ví dụ:mongodb + srv:// userAdmin:[email protected]
Nhà điều hành PSMDB Kubernetes này cũng sử dụng mối quan hệ / chống mối quan hệ cung cấp các ràng buộc mà nhóm của bạn có thể được lập lịch để chạy hoặc bắt đầu trên một nút cụ thể. Sở thích xác định các nhóm đủ điều kiện có thể được lên lịch trên nút đã có các nhóm với các nhãn cụ thể. Chống ái lực xác định các nhóm không đủ điều kiện. Cách tiếp cận này làm giảm chi phí bằng cách đảm bảo một số nhóm có trao đổi dữ liệu chuyên sâu chiếm cùng một vùng khả dụng hoặc thậm chí cùng một nút hoặc ngược lại, để trải rộng các nhóm trên các nút khác nhau hoặc thậm chí các vùng khả dụng khác nhau cho mục đích cân bằng và sẵn sàng cao. Mặc dù nhà điều hành khuyến khích bạn đặt mối quan hệ / chống mối quan hệ, nhưng điều này có những hạn chế khi sử dụng Minikube.
Khi sử dụng Minikube, nó có những hạn chế dành riêng cho nền tảng sau. Minikube không hỗ trợ cấu hình cụm nhiều nút vì tính chất cục bộ của nó, điều này mâu thuẫn với các yêu cầu chung về sở thích mặc định của Nhà điều hành. Để sắp xếp điều này, hướng dẫn Cài đặt Máy chủ Percona cho MongoDB trên Minikube bao gồm một bước bổ sung giúp tắt yêu cầu có không ít hơn ba Nút.
Trong phần sau của blog này, chúng tôi sẽ thiết lập Nhà khai thác PMSDB Kubernetes bằng Minikube và chúng tôi sẽ thực hiện theo thiết lập chống mối quan hệ để làm cho nó hoạt động. Điều này khác với việc sử dụng chống chung mối quan hệ như thế nào, nếu bạn thay đổi mối quan hệ chống mối quan hệ, bạn sẽ tăng rủi ro cho tính khả dụng của cụm. Giả sử, nếu mục đích chính của bạn khi triển khai PSMDB của mình vào một môi trường được container hóa là để lan truyền và có tính khả dụng cao hơn nhưng khả năng mở rộng, thì điều này có thể đánh bại mục đích. Tuy nhiên, việc sử dụng Minikube, đặc biệt là tại chỗ và để kiểm tra thiết lập PSMDB của bạn là có thể thực hiện được nhưng đối với khối lượng công việc sản xuất, bạn chắc chắn muốn chạy các nút trên các máy chủ riêng biệt hoặc trong một thiết lập môi trường như vậy, lỗi đồng thời nhiều nhóm khó có thể xảy ra.
Dữ liệu đang chuyển / Dữ liệu lúc nghỉ
Để bảo mật dữ liệu với PSMDB, nhà điều hành cung cấp TLS / SSL cho quá trình chuyển tiếp, sau đó cũng cung cấp mã hóa khi dữ liệu ở trạng thái nghỉ. Đối với khi chuyển tiếp, các tùy chọn bạn có thể chọn là sử dụng trình quản lý chứng chỉ hoặc tạo chứng chỉ của riêng bạn theo cách thủ công. Tất nhiên, bạn có thể tùy chọn sử dụng PSMDB không có TLS cho toán tử này. Kiểm tra tài liệu của họ liên quan đến việc sử dụng TLS.
Đối với dữ liệu ở trạng thái nghỉ, nó yêu cầu thay đổi trong Nhà điều hành PSMDB Kubernetes sau khi bạn tải xuống nhánh github, sau đó áp dụng các thay đổi trên tệp triển khai / cr.yaml. Để kích hoạt điều này, hãy làm như sau theo đề xuất của tài liệu:
- Khóa security.enableEncryption phải được đặt thành true (giá trị mặc định).
- Khóa security.encryptionCipherMode phải chỉ định chế độ mật mã thích hợp để giải mã. Giá trị có thể là một trong hai biến thể sau:
- AES256-CBC (cái mặc định cho Nhà điều hành và Máy chủ Percona cho MongoDB)
- AES256-GCM
security.encryptionKeySecret should specify a secret object with the encryption key:
mongod:
...
security:
...
encryptionKeySecret: my-cluster-name-mongodb-encryption-key
Bí mật khóa mã hóa sẽ được tạo tự động nếu nó không tồn tại. Nếu bạn muốn tự tạo, hãy lưu ý rằng khóa phải là một chuỗi 32 ký tự được mã hóa trong base64.
Lưu trữ Thông tin Nhạy cảm
Nhà điều hành PSMDB Kubernetes sử dụng Kubernetes Secrets để lưu trữ và quản lý thông tin nhạy cảm. Kubernetes Secrets cho phép bạn lưu trữ và quản lý thông tin nhạy cảm, chẳng hạn như mật khẩu, mã thông báo OAuth và khóa ssh. Lưu trữ thông tin bí mật trong Bí mật an toàn và linh hoạt hơn so với việc đưa nguyên văn vào định nghĩa nhóm hoặc trong hình ảnh vùng chứa.
Đối với toán tử này, người dùng và mật khẩu được tạo cho nhóm của bạn được lưu trữ và có thể được lấy bằng cách sử dụng kubectl get secret
Đối với blog này, thiết lập mẫu của tôi đạt được những điều sau với kết quả base64 được giải mã.
kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo "
WrDry6bexkCPOY5iQ
backup
gAWBKkmIQsovnImuKyl
clusterAdmin
qHskMMseNqU8DGbo4We
clusterMonitor
TQBEV7rtE15quFl5
userAdmin
Mỗi mục nhập dành cho sao lưu, người dùng cụm, người dùng theo dõi cụm và người dùng để sử dụng quản trị sẽ hiển thị dựa trên kết quả trên.
Một điều nữa là, Nhà điều hành PSMDB Kubernetes cũng lưu trữ các khóa bí mật và quyền truy cập AWS S3 thông qua Kubernetes Secrets.
Bản sao lưu
Toán tử này hỗ trợ sao lưu, đây là một tính năng rất tiện lợi. Nó hỗ trợ sao lưu theo yêu cầu (thủ công) và sao lưu theo lịch trình và sử dụng công cụ sao lưu Percona Backup cho MongoDB. Hãy lưu ý rằng các bản sao lưu chỉ được lưu trữ trên AWS S3 hoặc bất kỳ bộ lưu trữ nào tương thích với S3.
Sao lưu đã lên lịch có thể được xác định thông qua tệp triển khai / cr.yaml, trong khi việc sao lưu thủ công có thể được thực hiện bất cứ lúc nào bất cứ khi nào nhu cầu là cần thiết. Đối với các khóa bí mật và quyền truy cập S3, nó sẽ được định nghĩa trong tệp deploy / backup-s3.yaml và sử dụng Kubernetes Secrets để lưu trữ các thông tin sau như chúng tôi đã đề cập trước đó.
Tất cả các hành động được hỗ trợ cho Nhà điều hành PSMDB Kubernetes này như sau:
- Sao lưu theo lịch trình
- Sao lưu theo yêu cầu
- Khôi phục cụm từ bản sao lưu đã lưu trước đó
- Xóa bản sao lưu không cần thiết
Sử dụng PSMDB Kubernetes Operator Với Minikube
Trong phần này, chúng tôi sẽ giữ một thiết lập đơn giản bằng Kubernetes với Minikube, bạn có thể sử dụng tại chỗ mà không cần nhà cung cấp đám mây. Đối với thiết lập gốc đám mây, đặc biệt cho môi trường cấp doanh nghiệp và sản xuất, bạn có thể xem tài liệu của họ.
Trước khi chúng tôi tiếp tục các bước, hãy nhớ rằng như đã đề cập ở trên, có một hạn chế đã biết với Minikube vì nó không hỗ trợ cấu hình cụm đa nút xung đột với các yêu cầu sở thích mặc định của nhà điều hành. Chúng tôi sẽ đề cập đến vấn đề này về cách xử lý trong các bước tiếp theo bên dưới.
Đối với blog này, hệ điều hành chủ nơi Minikube của chúng tôi sẽ được cài đặt trên Ubuntu 18.04 (Bionic Beaver).
Hãy cài đặt Minikube
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$ sudo dpkg -i minikube_latest_amd64.deb
Theo tùy chọn, bạn có thể làm theo các bước tại đây nếu bạn đang sử dụng các hệ thống Linux khác nhau.
Hãy thêm khóa bắt buộc để xác thực các gói Kubernetes của chúng tôi và thiết lập kho lưu trữ
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ cat <<eof > /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
deb https://apt.kubernetes.io/ kubernetes-yakkety main
eof
Bây giờ hãy cài đặt các gói bắt buộc
$ sudo apt-get update
$ sudo apt-get install kubelet kubeadm kubectl
Khởi động Minikube xác định bộ nhớ, số lượng CPU và CIDR mà các nút của tôi sẽ được chỉ định,
$ minikube start --memory=4096 --cpus=3 --extra-config=kubeadm.pod-network-cidr=192.168.0.0/16
Kết quả ví dụ cho thấy như,
minikube v1.14.2 on Ubuntu 18.04
Automatically selected the docker driver
docker is currently using the aufs storage driver, consider switching to overlay2 for better performance
Starting control plane node minikube in cluster minikube
Creating docker container (CPUs=3, Memory=4096MB) ...
Preparing Kubernetes v1.19.2 on Docker 19.03.8 ...
kubeadm.pod-network-cidr=192.168.0.0/16
> kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm: 37.30 MiB / 37.30 MiB [---------------] 100.00% 1.46 MiB p/s 26s
> kubectl: 41.01 MiB / 41.01 MiB [---------------] 100.00% 1.37 MiB p/s 30s
> kubelet: 104.88 MiB / 104.88 MiB [------------] 100.00% 1.53 MiB p/s 1m9s
Verifying Kubernetes components...
Enabled addons: default-storageclass, storage-provisioner
Done! kubectl is now configured to use "minikube" by default
Như bạn đã nhận thấy, nó cũng cài đặt các công cụ tiện ích để quản lý và quản trị các nút hoặc nhóm của bạn.
Bây giờ, hãy kiểm tra các nút và nhóm bằng cách chạy các lệnh sau,
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-f9fd979d6-gwngd 1/1 Running 0 45s
kube-system etcd-minikube 0/1 Running 0 53s
kube-system kube-apiserver-minikube 1/1 Running 0 53s
kube-system kube-controller-manager-minikube 0/1 Running 0 53s
kube-system kube-proxy-m25hm 1/1 Running 0 45s
kube-system kube-scheduler-minikube 0/1 Running 0 53s
kube-system storage-provisioner 1/1 Running 1 57s
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready master 2d4h v1.19.2 192.168.49.2 <none> Ubuntu 20.04 LTS 4.15.0-20-generic docker://19.3.8
Bây giờ, hãy tải xuống PSMDB Kubernetes Operator,
$ git clone -b v1.5.0 https://github.com/percona/percona-server-mongodb-operator
$ cd percona-server-mongodb-operator
Hiện chúng tôi đã sẵn sàng triển khai toán tử,
$ kubectl apply -f deploy/bundle.yaml
Như đã đề cập trước đó, các hạn chế của Minikube yêu cầu điều chỉnh để mọi thứ chạy như mong đợi. Hãy làm như sau:
- Tùy thuộc vào dung lượng phần cứng hiện tại của bạn, bạn có thể thay đổi những điều sau theo đề xuất của tài liệu. Vì minikube chạy cục bộ nên tệp triển khai / cr.yaml mặc định phải được chỉnh sửa để điều chỉnh Nhà điều hành cho cài đặt cục bộ với tài nguyên hạn chế. Thay đổi các khóa sau trong phần cài đặt lại:
- các khóa comment resources.requests.memory và resources.requests.cpu (điều này sẽ phù hợp với Nhà điều hành trong các giới hạn mặc định của minikube)
- đặt khóa affinity.antiAffinityTopologyKey thành "không có" (Nhà điều hành sẽ không thể mở rộng cụm trên một số nút)
- Ngoài ra, hãy chuyển khóa allowUnsafeConfigurations thành true (tùy chọn này tắt quyền kiểm soát của Người vận hành đối với cấu hình cụm, giúp bạn có thể triển khai Máy chủ Percona cho MongoDB dưới dạng cụm một nút).
Bây giờ, chúng tôi đã sẵn sàng áp dụng các thay đổi được thực hiện cho tệp deploy / cr.yaml.
$ kubectl apply -f deploy/cr.yaml
Tại thời điểm này, bạn có thể kiểm tra trạng thái của các nhóm và bạn sẽ nhận thấy tiến trình sau giống như bên dưới,
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
percona-server-mongodb-operator-588db759d-qjv29 0/1 ContainerCreating 0 15s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 Init:0/1 0 4s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 34s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 PodInitializing 0 119s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2m29s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 PodInitializing 0 2m1s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2m31s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 33m
mongodb-cluster-s9s-rs0-1 2/2 Running 1 31m
mongodb-cluster-s9s-rs0-2 2/2 Running 0 30m
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 33m
Bây giờ chúng ta gần đến nơi. Chúng tôi sẽ nhận được các bí mật được tạo bởi nhà điều hành để chúng tôi có thể kết nối với các nhóm PSMDB đã tạo. Để làm điều đó, bạn cần liệt kê các đối tượng bí mật trước, sau đó lấy giá trị của yaml để bạn có thể nhận được tổ hợp người dùng / mật khẩu. Mặt khác, bạn có thể sử dụng lệnh kết hợp bên dưới với định dạng tên người dùng:mật khẩu. Xem ví dụ bên dưới,
$ kubectl get secrets
NAME TYPE DATA AGE
default-token-c8frr kubernetes.io/service-account-token 3 2d4h
internal-mongodb-cluster-s9s-users Opaque 8 2d4h
mongodb-cluster-s9s-mongodb-encryption-key Opaque 1 2d4h
mongodb-cluster-s9s-mongodb-keyfile Opaque 1 2d4h
mongodb-cluster-s9s-secrets Opaque 8 2d4h
percona-server-mongodb-operator-token-rbzbc kubernetes.io/service-account-token 3 2d4h
$ kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo" |sed 'N; s/\(.*\)\n\(.*\)/
\2:\1/'
backup:WrDry6bexkCPOY5iQ
clusterAdmin:gAWBKkmIQsovnImuKyl
clusterMonitor:qHskMMseNqU8DGbo4We
userAdmin:TQBEV7rtE15quFl5
Bây giờ, bạn có thể đặt tên người dùng:định dạng mật khẩu và lưu nó ở đâu đó một cách an toàn.
Vì chúng tôi không thể kết nối trực tiếp với Máy chủ Percona cho các nút MongoDB, chúng tôi cần tạo một nhóm mới có ứng dụng mongodb,
$ kubectl run -i --rm --tty percona-client --image=percona/percona-server-mongodb:4.2.8-8 --restart=Never -- bash -il
Cuối cùng, chúng tôi hiện đã sẵn sàng kết nối với các nút PSMDB của mình,
bash-4.2$ mongo "mongodb+srv://userAdmin:[email protected]/admin?replicaSet=rs0&ssl=false"
Ngoài ra, bạn có thể kết nối với các nút riêng lẻ và kiểm tra tình trạng của nó. Ví dụ:
bash-4.2$ mongo --host "mongodb://clusterAdmin:[email protected]:27017/?authSource=admin&ssl=false"
Percona Server for MongoDB shell version v4.2.8-8
connecting to: mongodb://mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb&ssl=false
Implicit session: session { "id" : UUID("9b29b9b3-4f82-438d-9857-eff145be0ee6") }
Percona Server for MongoDB server version: v4.2.8-8
Welcome to the Percona Server for MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://www.percona.com/doc/percona-server-for-mongodb
Questions? Try the support group
https://www.percona.com/forums/questions-discussions/percona-server-for-mongodb
2020-11-09T07:41:59.172+0000 I STORAGE [main] In File::open(), ::open for '/home/mongodb/.mongorc.js' failed with No such file or directory
Server has startup warnings:
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** WARNING: While invalid X509 certificates may be used to
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** connect to this server, they will not be considered
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** permissible for authentication.
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten]
rs0:SECONDARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2020-11-09T07:42:04.984Z"),
"myState" : 2,
"term" : NumberLong(5),
"syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 0,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"lastCommittedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"readConcernMajorityWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"appliedOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"durableOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"lastAppliedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"lastDurableWallTime" : ISODate("2020-11-09T07:42:03.395Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1604907678, 3),
"lastStableCheckpointTimestamp" : Timestamp(1604907678, 3),
"members" : [
{
"_id" : 0,
"name" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3632,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDurable" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),
"lastHeartbeat" : ISODate("2020-11-09T07:42:04.246Z"),
"lastHeartbeatRecv" : ISODate("2020-11-09T07:42:03.162Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1604904092, 1),
"electionDate" : ISODate("2020-11-09T06:41:32Z"),
"configVersion" : 3
},
{
"_id" : 1,
"name" : "mongodb-cluster-s9s-rs0-1.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3632,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDurable" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),
"lastHeartbeat" : ISODate("2020-11-09T07:42:04.244Z"),
"lastHeartbeatRecv" : ISODate("2020-11-09T07:42:04.752Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3651,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604907723, 4),
"signature" : {
"hash" : BinData(0,"HYC0i49c+kYdC9M8KMHgBdQW1ac="),
"keyId" : NumberLong("6892206918371115011")
}
},
"operationTime" : Timestamp(1604907723, 4)
}
Vì nhà điều hành quản lý tính nhất quán của cụm, bất cứ khi nào lỗi hoặc giả sử một nhóm đã bị xóa. Nhà điều hành sẽ tự động bắt đầu một cái mới. Ví dụ:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m7s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl delete po mongodb-cluster-s9s-rs0-1
pod "mongodb-cluster-s9s-rs0-1" deleted
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 0/2 Init:0/1 0 3s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m29s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 0/2 PodInitializing 0 10s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m36s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 2/2 Running 0 26s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m52s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
Bây giờ chúng ta đã hoàn tất. Tất nhiên, bạn có thể cần để lộ cổng, do đó bạn có thể phải đối phó với các điều chỉnh trong triển khai / cr.yaml. Bạn có thể tham khảo tại đây để đối phó.
Kết luận
Percona Kubernetes Operator cho PSMDB có thể là giải pháp hoàn chỉnh của bạn, đặc biệt là cho các môi trường được chứa trong máy chủ Percona của bạn để thiết lập MongoDB. Nó gần như là một giải pháp hoàn chỉnh vì nó có tích hợp dự phòng cho tập hợp bản sao của bạn nhưng nhà điều hành hỗ trợ sao lưu, khả năng mở rộng, tính khả dụng cao và bảo mật.