K8s之mongodb副本集部署

MongoDB replicaset

本文档适用 3.2.20 ~ 5.0.5,更高版本可以用helm.

1.什么是MongoDB副本集

MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。

2.MongoDB复制原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行
这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下所示:
在这里插入图片描述
以上结构图总,客户端总主节点读取数据,在客户端写入数据到主节点是, 主节点与从节点进行数据交互保障数据的一致性。

3.MongoDB 副本集可用分两种:

3.1 Master-Slave 主从复制

实现数据同步只需要在某一台服务器启动时加上"-master"参数,以指明此服务器的角色是primary;另一台服务器加上"-slave"和"-source"参数,以指明此服务器的角色是slave。

主从复制的优点如下:

  • 从服务器可以执行查询工作,降低主服务器访问压力。
  • 在从服务器执行备份,避免备份期间锁定主服务器的数据。
  • 当主服务器出现故障时,可以快速切换到从服务器,减少当机时间。

注意:MongoDB 的最新版本已不再推荐此方案。主从复制虽然可以承受一定的负载压力,但这种方式仍然是一个单点,如果主库挂了,数据写入就成了风险。

Replica Sets复制集

MongoDB 在 1.6 版本对开发了新功能replica set,这比之前的replication 功能要强大一 些,
增加了故障自动切换和自动修复成员节点, 各个DB 之间数据完全一致,大大降低了维 护成功。auto
shard 已经明确说明不支持replication paris,建议使用replica set,replica set 故障切换完全自动。

Replica Sets的结构类似一个集群,完全可以把它当成一个集群,因为它确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他节点马上会将业务接管过来而无须停机操作。

4.MongoDB 之 OCP 部署

4.1 部署

openssl rand -base64 400 > ./key.txt
oc new-project middleware-mongo 
oc create secret generic replicasets-key -n middleware-mongo --from-file=keyfile=./key.txt
oc adm policy add-scc-to-user anyuid -z default
oc apply -f service-headless.yaml
oc apply -f StatefulSet.yaml

StatefulSet.yaml,注意修改storageClassName

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
  #namespace: __NS__
spec:
  serviceName: mongo
  replicas: 3
  selector:
    matchLabels:
      role: mongo
      environment: prod
      replicaset: rs
  template:
    metadata:
      labels:
        role: mongo
        environment: prod
        replicaset: rs
    spec:
      containers:
        - name: mongodb-container
          #这里填3.2.20 或者 5.0.5,已经验证
          image: mongo:5.0.5
          command:
            - "numactl"
            - "--interleave=all"
            - "mongod"
            - "--bind_ip"
            - "0.0.0.0"
            - "--replSet"
            - "rs"
            - "--auth"
            - "--clusterAuthMode"
            - "keyFile"
            - "--keyFile"
            - "/etc/secrets-volume/keyfile"
            - "--setParameter"
            - "authenticationMechanisms=SCRAM-SHA-1"
          resources:
            requests:
              cpu: 500m
              memory: 500Mi
            limits:
              cpu: 500m
              memory: 500Mi
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: secrets-volume
              readOnly: true
              mountPath: /etc/secrets-volume
            - name: mongdb-storage
              #数据的默认存储位置: /data/db
              mountPath: /data/db
      volumes:
        - name: secrets-volume
          secret:
            secretName: replicasets-key
            defaultMode: 256
  volumeClaimTemplates:
    - metadata:
        name: mongdb-storage
      spec:
        storageClassName: XXX
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            #根据实际情况更改
            storage: 512Gi

service-headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: mongo
  #namespace: __NS__
  labels:
    name: mongo
spec:
  ports:
    - port: 27017
      targetPort: 27017
  clusterIP: None
  selector:
    role: mongo
    environment: prod
    replicaset: rs

以上也可以使用脚本 mongo_replicaset.sh

4.2 设置复本

$ mongo
> use admin
> rs.initiate({_id: "rs", version: 1, members: [
         { _id: 0, host : "mongo-0.mongo.middleware-mongo:27017" },   
         { _id: 1, host : "mongo-1.mongo.middleware-mongo:27017" },
         { _id: 2, host : "mongo-2.mongo.middleware-mongo:27017" }
   ]});
{ "ok" : 1 }
rs:OTHER> 
rs:SECONDARY> 
rs:SECONDARY> rs.status()
设置admin用户
rs:PRIMARY> db.createUser({ user: "admin", pwd: "123456", roles: [{ role: "root", db: "admin" }] })
rs:PRIMARY> exit
bye
设置自定义用户test
$ mongo
rs:PRIMARY> use admin
rs:PRIMARY> db.auth('admin','123456')
1
rs:PRIMARY> use test
rs:PRIMARY> db.createUser({user: "test",pwd: "123456",roles: [ { role: "dbOwner", db: "test" } ]})

4.3 继续外部验证连接(用multus暴露)-非必须

不需要外部连接的 可以忽略这边

apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: net10-120-122
  namespace: default
spec:
  config: |-
    {
      "cniVersion": "0.3.1",
      "name": "net10-mongo-test",
      "type": "macvlan",
      "master": "ens224",
      "mode": "bridge",
      "ipam": {
        "type": "whereabouts",
        "range": "10.10.10.0/24", 
        "range_start": "10.10.10.120",
        "range_end": "10.10.10.122",
        "routes": [
          { "dst": "10.10.0.0/16", "gw": "10.10.10.1" }
        ]
      }
    }

给StatefulSet设置网络

spec:
  template:
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: default/net10-mongo-test

编译windows的hosts文件,来假设window也解析到mongo-0.mongo mongo-1.mongo mongo-2.mongo

10.10.10.120 mongo-0.mongo.middleware-mongo
10.10.10.121 mongo-1.mongo.middleware-mongo
10.10.10.122 mongo-2.mongo.middleware-mongo

通过robot 3T工具进行连接

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值