云原生|秒懂云原生容灾备份实践

云原生|秒懂云原生容灾备份实践
最新回答
唐伯虎点蚊香

2024-02-16 05:49:15

云原生容灾备份实践主要涉及需备份的数据、备份任务执行方式、不同组件的备份恢复方法及备份数据存储位置,以下为详细介绍

需备份的数据
  • kubernetes集群资源对象数据:通常存储在集群控制平面连接的etcd中,备份时只需备份etcd中的数据。
  • 容器运行时产生的数据:以cloudUp项目为例,包含以下数据库数据:

    Postgres:cloudUp portal端使用的关系数据库,存储portal的用户数据、配置数据等。

    Mongo:cloudUp devops端使用的nosql数据库,存储devops端的系统配置数据、任务数据等。

    Mysql:cloudUp devops端使用的关系数据库,存储devops的用户数据及用户登录数据等。

    minio:cloudUp devops端使用的对象数据库,存储devops运行时产生的日志数据等。

备份任务执行
  • backup微服务:响应用户的备份策略(即时备份和定时备份),创建备份任务。触发备份任务时,在微服务中创建备份任务pod,并监听pod的运行状态,将任务执行结果记录到数据库中。
  • 备份任务:使用独立的pod运行,采用命令行方式接收备份参数并处理。可将cloudUp中的数据备份到minio、sftp和独立数据卷中,也能选择备份数据进行恢复。
不同组件的备份恢复方法
  • 备份恢复kubernetes:对kuberentes只需对etcd进行备份与恢复,依赖etcd官方提供的snapshot方式。

    备份etcd:使用官方etcdctl工具,在golang中调用etcdutl依赖包

    http://go.etcd.io/etcd/etcdutl/v3
    中的snapshot.Save()方法进行备份。备份完成后根据传入文件名生成备份文件,再根据传入参数选择将备份文件打包并传入到sftp、minio或数据卷中。

    恢复etcd:使用官方etcdctl工具,在golang中调用etcdutl依赖包go,

    http://etcd.io/etcd/etcdutl/v3
    中的snapshot.Restore()方法进行恢复。恢复时生成一个新的etcd数据目录,然后手动将新启动的etcd数据目录替换成生成的数据目录。

  • 备份恢复portal:portal需要备份和恢复postgres。

    备份postgres:采用官方提供的pg dump工具,该工具是postgres自带且依赖postgres环境运行。使用portal对应版本的postgres作为基础镜像即可使用此工具,在golang中使用exec.Command方法启动pg_dump工具。

    恢复postgres:使用对应的sql driver连接到新的postgres数据库,然后执行需要恢复的sql语句。

  • 备份恢复devops:涉及mongo、minio和mysql。

    备份mongo:使用官方提供的MongoDump工具,在golang中调用依赖包

    http://github.com/mongodb/mongo-tools/mongodump
    中的MongoDump.Dump()方法进行数据备份。

    恢复mongo:使用官方提供的MongoRestore工具,在golang中调用依赖包github,com/mongodb/mongo-tools/mongorestore中的MongoRestore.Restore()方法进行数据恢复。

    备份minio:先获取一个桶下的所有object,然后逐一获取object并打包成一个统一的备份文件。

    恢复minio:将备份的object重新写入到minio的对应桶中。

    备份mysql:采用mysql驱动,执行sql语句的方式,从mysql数据库中查询并拼接成sql语句。

    恢复mysql:采用mysql驱动,执行备份sql语句的方式。

备份数据存储

根据传入的参数决定数据存储的目标存储中心,cloudUp定义了三个存储中心:

  • Minio:当传入参数store-.minio-file有值时,将数据存储到minio中。
  • SFTP:当传入参数store-sftp-file有值时,将数据存储到sftp中。
  • volume:当传入参数store-volume-file有值时,将数据存储到volume中。