реплика mongodb-набор запросов на чтение kubernetes serivce

#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, если вы хотите прочитать о других возможных значениях параметра предпочтения чтения.