MinIO多集群数据实时同步与一致性验证方案

#作者:猎人

一、背景

近期某省核心业务讨论的双中心方案:有平台依赖的minio组件,需要实现多个minio集群之间数据库实时同步。

二、方案

  1. 首先保证minio容器中有 mc 命令

安装mc命令

下载mc客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc

添加执行权限
chmod +x mc

移动到/usr/bin目录
mv mc /usr/bin/

2、同步配置(以下配置只在主集群服务中配置)

(1)能登录后台的话,直接在minio客户端执行命令即可

命令格式:mc config host add name http://ip:端口 用户名 密码

  • name: 自定义配置名称
  • ip: 访问该minio服务的ip
  • 端口: 9000端口映射的端口
  • 用户名\密码: 部署服务设置的账号密码
以此环境为样例:

mc config host add minio_master http://172.18.243.20:32686 admin admin@12345
mc config host add minio_slave http://172.18.243.20:32100 admin admin@12345

(2)k8s方式部署的话,直接挂载configmap配置文件到minio服务的 /.mc/config.json 路径即可

以此环境为样例:

{
    "version": "10",
    "aliases": {
        "minio_master": {
            "url": "http://172.18.243.20:32686", # minio服务地址可以配置域名方式 http://minio-twfho.component:9000
            "accessKey": "admin",
            "secretKey": "admin@12345",
            "api": "s3v4",
            "path": "auto"
        },
		"minio_slave": {
            "url": "http://172.18.243.20:32100", # http://minio-ocazf.component:9000
            "accessKey": "admin", #
            "secretKey": "admin@12345",
            "api": "s3v4",
            "path": "auto"
        }
    }
}

(3)配置完成可以在客户端执行命令查看是否配置成功

mc alias list

3、启动同步服务(以下配置只在主集群服务中配置)

(1)能登录后台的话,直接在minio客户端执行命令即可

命令格式:nohup mc mirror --remove --overwrite --watch minio_master minio_slave &

  • nohup: Linux命令保证服务不被退出
  • mc mirror: minio中固定的客户端命令,用于同步数据
  • –remove: 移除目标上的无关对象
  • –overwrite: 覆盖对象
  • –watch: 持续监控
  • minio_master minio_slave: 上一步中自定义的配置名称
  • & Linux命令保证服务后台运行
  • 具体细节配置可参考官网:http://docs.minio.org.cn/minio/baremetal/reference/minio-cli/minio-mc/mc-mirror.html#command-mc-mirror
命令说明:从服务minio_master同步数据到服务minio_slave,单向同步。
nohup mc mirror --remove --overwrite --watch minio_master minio_slave &
命令说明:将服务minio_master上名为“bucket-demo”的桶的数据迁移到服务器minio_slave的“bucket-demo”桶中
./mc cp --recursive minio_master/bucket-demo/ minio_slave/bucket-demo/
命令说明:将服务minio_master上所有数据迁移到服务minio_slave中
./mc cp --recursive minio_master minio_slave

--recursive 递归拷贝

(2)k8s方式部署的话,将上述命令直接配置在钩子函数中执行(该方式还未验证通过,同步服务启动完成后同步服务,过一会成为了僵尸进程

lifecycle:
  postStart:
    exec:
      command:
      - /bin/bash
      - -c
      - /opt/bitnami/scripts/minio/nohup.sh

nohup.sh 脚本通过configmap方式挂载到minio服务中
nohup.sh 脚本内容跟3.1中的命令一样

验证场景:
1、双向同步需求可以实现,只需要在两个minio集群各自配置 向对方集群同步数据即可(建议只做单向同步,因为两个集群之间互相同步可能造成数据丢失问题。具体原因暂时未知,多次测试看出来的问题)
(1)在双minio集群的每个pod中挂载两个minio集群配置的文件

(2)在双minio集群的每个pod中启动mc mirror同步服务向对方集群同步数据
在这里插入图片描述
(3)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
在这里插入图片描述
Minio-slave
在这里插入图片描述
(4)在目的集群上传一个文件,主集群正常同步到数据
Minio-slave
在这里插入图片描述
Minio-master
在这里插入图片描述
2、4节点的集群,目的集群挂掉一个节点可以正常写入和同步;目的集群挂掉两个节点就只能查看,不能写入和同步
(1)设置节点不可调度,删掉目的集群的一个pod让他拉起不正常
在这里插入图片描述
(2)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
在这里插入图片描述
Minio-slave
在这里插入图片描述
(3)设置节点不可调度,删掉目的集群的两个pod让他拉起不正常
在这里插入图片描述
(4)在主集群上传一个文件,目的集群未同步到数据
Minio-master
在这里插入图片描述
Minio-slave
在这里插入图片描述
(5)目的集群节点恢复正常之后,刚才主集群的数据自动同步过来
在这里插入图片描述
Minio-master
在这里插入图片描述
Minio-slave
在这里插入图片描述
3、4节点的集群,主集群挂掉一个节点可以正常写入和同步;主集群挂掉两个节点就只能查看,不能写入和同步
(1)设置节点不可调度,删掉主集群的一个pod让他拉起不正常
在这里插入图片描述
(2)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
在这里插入图片描述
Minio-slave
在这里插入图片描述
(3)设置节点不可调度,删掉目的集群的两个pod让他拉起不正常
在这里插入图片描述
(4)主集群上传文件失败
在这里插入图片描述

三、yaml样例

1、minio-StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: minio-twfho
  namespace: component
spec:
  podManagementPolicy: Parallel
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app.kubernetes.io/instance: minio-twfho
      app.kubernetes.io/name: minio
  serviceName: minio-twfho-headless
  template:
    metadata:
      annotations:
        checksum/credentials-secret: fd559c1b282e87f436c328a94f336979a323969ea693af8e8b7ccb1f58512777
        configMap: nohup;mcconfig;
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: minio-twfho
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: minio
        helm.sh/chart: minio-10.1.10
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/instance: minio-twfho
                  app.kubernetes.io/name: minio
              namespaces:
              - component
              topologyKey: kubernetes.io/hostname
            weight: 1
      automountServiceAccountToken: true
      containers:
      - env:
        - name: BITNAMI_DEBUG
          value: "false"
        - name: MINIO_DISTRIBUTED_MODE_ENABLED
          value: "yes"
        - name: MINIO_DISTRIBUTED_NODES
          value: minio-twfho-{0...3}.minio-twfho-headless.component.svc.cluster.local:9000/data
        - name: MINIO_SCHEME
          value: http
        - name: MINIO_FORCE_NEW_KEYS
          value: "no"
        - name: MINIO_ROOT_USER
          value: admin
        - name: MINIO_ROOT_PASSWORD
          value: admin@12345
        - name: MINIO_SKIP_CLIENT
          value: "yes"
        - name: MINIO_BROWSER
          value: "on"
        - name: MINIO_PROMETHEUS_AUTH_TYPE
          value: public
        image: boatswain.registry.si-tech.com.cn:30100/component/bitnami/minio:2022.2.16
        imagePullPolicy: Always
        lifecycle:
          postStart:
            exec:
              command:
              - /bin/bash
              - -c
              - /opt/bitnami/scripts/minio/nohup.sh
        livenessProbe:
          failureThreshold: 5
          httpGet:
            path: /minio/health/live
            port: minio-api
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 5
        name: minio
        ports:
        - containerPort: 9000
          name: minio-api
          protocol: TCP
        - containerPort: 9001
          name: minio-console
          protocol: TCP
        readinessProbe:
          failureThreshold: 5
          initialDelaySeconds: 5
          periodSeconds: 5
          successThreshold: 1
          tcpSocket:
            port: minio-api
          timeoutSeconds: 1
        resources: {}
        securityContext:
          runAsNonRoot: true
          runAsUser: 1001
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /data
          name: data
        - mountPath: /opt/bitnami/scripts/minio/nohup.sh
          name: nohup-0
          subPath: nohup.sh
        - mountPath: /.mc/config.json
          name: mcconfig-1
          subPath: config.json
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1001
      serviceAccount: minio-twfho
      serviceAccountName: minio-twfho
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 493
          items:
          - key: nohup.sh
            path: nohup.sh
          name: nohup
          optional: false
        name: nohup-0
      - configMap:
          defaultMode: 420
          items:
          - key: config.json
            path: config.json
          name: mcconfig
          optional: false
        name: mcconfig-1
  updateStrategy:
    type: RollingUpdate
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: minio-twfho
        app.kubernetes.io/name: minio
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: glusterfs-sc
      volumeMode: Filesystem
    status:
      phase: Pending

2、mcconfig-configmap

piVersion: v1
data:
  config.json: "{
        "version": "10",
        "aliases": {
                "minio_master": {
                        "url": "http://minio-twfho.component:9000",
                        "accessKey": "admin",
                        "secretKey": "admin@12345",
                        "api": "s3v4",
                        "path": "auto"
                },
        "minio_slave": {
                        "url": "http://minio-ocazf.component:9000",
                        "accessKey": "admin",
                        "secretKey": "admin@12345",
                        "api": "s3v4",
                        "path": "auto"
                }
        }
}"
kind: ConfigMap
metadata:
  name: mcconfig
  namespace: component

3、nohup-configmap

apiVersion: v1
data:
  nohup.sh: nohup mc mirror --remove --overwrite --watch minio_master minio_slave
    &
kind: ConfigMap
metadata:
  name: nohup
  namespace: component
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值