longhorn使用minio备份

longhorn支持备份存储在NFS或者与S3兼容的服务器中,比如AWS S3,minio或者oss等。这里介绍minio方式。

部署minio

集群A,部署minio,我这里用的velero中的minio。

file

部署后的nodePort地址有问题,容器d端口用的9000,需要修改为console的端口41972。

file

file

longhorn对接minio

对接官方文档地址:
https://longhorn.io/docs/1.3.2/snapshots-and-backups/backup-and-restore/set-backup-target/#set-up-a-local-testing-backupstore

打开longhorn-ui,选择setting-general-Backup Target

s3://rancherbackups@dummyregion/longhorn
minio-secret

file

添加secret

echo -n minio | base64
echo -n minio123 | base64
# 地址可以查看minio pod日志
echo -n http://10.42.6.10:9000 | base64

cat minio-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: longhorn-system
type: Opaque
data:
  AWS_ACCESS_KEY_ID: bWluaW8=
  AWS_SECRET_ACCESS_KEY: bWluaW8xMjM=
  AWS_ENDPOINTS: aHR0cDovLzEwLjQyLjYuMTA6OTAwMA==

file

注意

target因为是本地的,没有region,所以需要设置一个空的region。
secret需要提前创建,AWS_ENDPOINTS的地址需要设置为API的地址,不是console地址。不然会报错:S3 API Requests must be made to API port。

创建备份

部署mysql服务,rancher上启动应用商店,搜索mysql,存储选择longhorn。

file

file

在longhorn上创建备份

file

file

查看备份

file

查看label

file

获取url

file

查看minio中的bucket内容

file

备份同步

在集群B中指定同样的target,secret

file

创建minio-api svc

在集群A中

apiVersion: v1
kind: Service
metadata:
  labels:
    component: minio
  name: minio-api
  namespace: velero
spec:
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 30910
    port: 9000
    protocol: TCP
    targetPort: 9000
  selector:
    component: minio
  sessionAffinity: None
  type: NodePort

获取minio-api地址

echo -n http://172.16.255.201:30910 | base64
aHR0cDovLzE3Mi4xNi4yNTUuMjAxOjMwOTEw

创建secret

在集群B中

cat minio-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: minio-secret
  namespace: longhorn-system
type: Opaque
data:
  AWS_ACCESS_KEY_ID: bWluaW8=
  AWS_SECRET_ACCESS_KEY: bWluaW8xMjM=
  AWS_ENDPOINTS: aHR0cDovLzE3Mi4xNi4yNTUuMjAxOjMwOTEw

返回longhorn,点击backup,查看备份已经同步。

file

经测试,创建一个276M的备份,同步大约需要3分钟。

file

删除备份

file

等待自动同步,查看集群B中备份也已经删除。

file

创建容灾恢复卷

容灾恢复 (DR) 卷是一种特殊卷,主要用于在整个主集群出现故障时将数据存储在备份集群中。灾难恢复卷用于提高Longhorn卷的弹性。对于灾难恢复卷,Last Backup表示其原始备份卷的最新备份。

在集群B的longhorn页面这种,使用集群A的Volume备份,在集群B中创建一个容灾恢复卷。

file

file

点击OK,再点击volume页面,查看容灾恢复卷。

file

在集群A的mysql中插入数据

mysql -u root -p
create database test;
use test;
CREATE TABLE Persons
    -> (
    -> Id_P int,
    -> LastName varchar(255),
    -> FirstName varchar(255),
    -> Address varchar(255),
    -> City varchar(255)
    -> );
show tables;
INSERT INTO Persons VALUES ('1', 'qq', 'aa', 'hz', 'zj');
INSERT INTO Persons VALUES ('2', 'ww', 'ss', 'hz', 'zj');
INSERT INTO Persons VALUES ('3', 'ee', 'dd', 'hz', 'zj');
select * from Persons;

file

访问集群A的longhorn页面,对这个卷再次进行备份。

file

如果之前的备份加了label,后面的备份也需要加上对应的label,否则无法正常备份。
file

过一会可以看到集群B中的容灾恢复卷图标变成了灰色,代表这个卷正在同步集群A中volume的最新备份数据Last Backup,此时无法激活和使用容灾恢复卷。

file

同步完成后,图标变成蓝色。

file

file

Recurring Jobs

使用longhorn ui设置Recurring Jobs

如果在集群A中对Volume设置了定时任务自动备份,集群B中的longhorn会定时轮询最新的备份,将增量数据信息自动同步到容灾恢复卷,以保持与集群A中Volume数据一致。

使用StorageClass设置Recurring Jobs

使用StorageClass创建的任何卷都将自动设置这些recurring jobs。

allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    longhorn.io/last-applied-configmap: |
      ......
      parameters:
        numberOfReplicas: "3"
        staleReplicaTimeout: "30"
        fromBackup: ""
        fsType: "ext4"
        dataLocality: "disabled"
        recurringJobs: '[
        {
          "name":"snap",
          "task":"snapshot",
          "cron":"*/1 * * * *",
          "retain":1
        },
        {
          "name":"backup",
          "task":"backup",
          "cron":"*/2 * * * *",
          "retain":1
        }
      ]'
    name: longhorn

需要设置的字段:

  1. name:job的名称。不要在一个recurring Jobs中使用重复的名称。并且name的长度不能超过8个字符。
  2. task:job的类型。它仅支持snapshot(定期创建快照)或backup(定期创建快照然后进行备份)。
  3. cron:Cron表达式。job的执行时间。
  4. retain:Longhorn将为job保留多少快照/备份(snapshots/backups)。应该不少于 1。

分离卷时允许Recurring Job

file

启用这个选项,即使卷已分离,也可以进行周期性备份(recurring backup)。
在卷自动附加(attached automatically)期间,卷状态不是ready,Workload无法使用该卷。Workload必须等到recurring job完成才可以使用。

注意

为了避免当卷长时间没有新数据时,recurring jobs可能会用相同的备份和空快照覆盖旧的备份/快照的问题,Longhorn执行以下操作:

  1. Recurring backup job仅在自上次备份以来卷有新数据时才进行新备份。
  2. Recurring snapshot job仅在卷头(volume head)中有新数据(实时数据)时才拍摄新快照。

在集群B中恢复mysql应用

集群B中没有mysql namespace,先创建ns。
file

激活灾难恢复卷

file

可以选择块设备或者iscsi格式,点击OK。

file

等待volume变成Detached状态后,创建PVC。

file

不建议修改PV和PVC的名称,点击OK创建。

file

返回rancher,查看PVC已经创建。

file

使用恢复的PVC创建mysql应用

导入A集群的mysql-secret,svc,deployment到集群B中。查看B集群中的mysql应用。
file

进入容器,查询数据。A集群中插入的数据已经自动同步到了B集群中。
file

file

longhorn使用oss备份

对于oss,需要启用virtual-hosted-style方式访问。

启用方法

将值为true的新字段 VIRTUAL_HOSTED_STYLE 添加到secret中,例如:

apiVersion: v1
kind: Secret
metadata:
  name: oss-secret
  namespace: longhorn-system
type: Opaque
data:
  AWS_ACCESS_KEY_ID: aaaaaa
  AWS_SECRET_ACCESS_KEY: bbbbbb
  AWS_ENDPOINTS: cccccc
  VIRTUAL_HOSTED_STYLE: dHJ1ZQ== # true
  • AWS_ACCESS_KEY_ID:oss用户名
  • AWS_SECRET_ACCESS_KEY:oss密码
  • AWS_ENDPOINTS:oss地址
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x