#mongodb #kubernetes
#mongodb #kubernetes
Вопрос:
Я создал кластер из 3 узлов с 3 физическими машинами в одной сети. Я создал несколько постоянных томов и один класс хранения с помощью этого кода:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: localstorage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local1-1pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes1
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local1-2pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes1
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local1-3pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol3
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes1
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local2-1pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes2
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local2-2pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes2
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local2-3pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol3
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes2
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local3-1pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes3
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local3-2pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes3
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: local3-3pv
labels:
type: local
spec:
storageClassName: localstorage
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/disk/vol3
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes3
---
Затем я создал свои экземпляры mongo в виде наборов реплик с сохранением состояния с помощью этого:
---
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
app: mongo
spec:
ports:
- name: mongo
port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
spec:
selector:
matchLabels:
app: mongo
serviceName: "mongo"
replicas: 3
template:
metadata:
labels:
app: mongo
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo
command:
- mongod
- "--replSet"
- rs0
- "--bind_ip_all"
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongo-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 20Gi
storageClassName: "localstorage"
На первом этапе я инициализирую свой набор реплик с помощью этой команды:
rs.initiate({_id: "rs0", version: 1, members: [
{ _id: 0, host : "mongo-0.mongo:27017" },
{ _id: 1, host : "mongo-1.mongo:27017" },
{ _id: 2, host : "mongo-2.mongo:27017" }
]});
Итак, теперь я пытаюсь создать дополнительную службу, которая будет отвечать за чтение запросов. Как я могу этого добиться? В лучшем случае мой запрос будет автоматически обслуживаться одним из трех наборов реплик. Сначала проверьте наличие первичной и, если она недоступна, получите ее из вторичной реплики. Это просто?
заранее благодарю вас.
Комментарии:
1. Проверьте здесь . Похоже, все, что вам нужно сделать, это изменить
read-preference
сprimary
(по умолчанию) наprimaryPrefered
в клиентской библиотеке. Проверьте свою клиентскую библиотеку для получения подробной информации. Отвечает ли это на ваш вопрос?
Ответ №1:
Если вы хотите читать из вторичных реплик mongodb (в качестве альтернативы, когда основная реплика недоступна), вам не нужна какая-либо специальная настройка.
Все, что вам нужно сделать, это изменить read-preference
параметр с primary
(по умолчанию) на primaryPrefered
в любой используемой вами клиентской библиотеке mongodb (она поддерживается во всех официальных библиотеках, я не могу гарантировать, что это поддерживается в неофициальных библиотеках).
Из документов:
primaryPreferred
В большинстве ситуаций операции считываются из первичного, но если он недоступен, операции считываются из вторичных элементов.
Проверьте документацию mongodb, если вы хотите прочитать о других возможных значениях параметра предпочтения чтения.