复制策略深入探讨

在之前的博客中,我们讨论了复制最佳实践和不同类型的复制,例如批量、站点和存储桶。但是,随着所有这些不同类型的复制类型的出现,人们不得不想知道在哪里使用哪种复制策略?从现有 S3 兼容数据存储迁移数据时,您使用 mc mirror 还是 Batch?在集群之间进行复制时,应该使用站点复制还是存储桶复制?

今天我们将揭开这些不同复制策略的神秘面纱,看看在哪种情况下应该使用哪种策略。

从现有源复制

通常,如果您本地驱动器或现有 S3 兼容存储上已有数据,我们建议您使用以下两种方法之一来复制数据。

  • 批量复制:这必须需要 MinIO 或其他 S3 兼容存储(例如 AWS)的现有源。

  • 使用 mc mirror :这可以是本地目录或 NFS 挂载等。

在详细介绍之前,让我们先看一下一些先决条件。

在 mc 中为 MinIO 集群创建一个名为 miniostore 的 alias 。

mc alias set miniostore 

在 miniostore 中创建一个存储桶, olderstore 中的数据将传输到其中。

mc mb miniostore/mybucket

在 mc 中为 S3 兼容存储中的现有存储桶创建另一个 alias 。

mc alias set olderstore 

在这种情况下,我们假设 oldstore 中已经有一个名为 mybucket 的存储桶。

让我们看一下如何使用批量复制将数据从现有的 S3 兼容源迁移到 MinIO 存储桶。

为批量复制配置创建yaml

mc batch generate olderstore/ replicate

您应该看到类似于下面的 replication.yaml 文件, source 是 olderstore ,目标是 miniostore 。

replicate:apiVersion: v1# source of the objects is `olderstore` aliassource:type: TYPE # valid values are "s3"bucket: BUCKETprefix: PREFIX# NOTE: if source is remote then target must be "local"# endpoint: ENDPOINT# credentials:#   accessKey: ACCESS-KEY#   secretKey: SECRET-KEY#   sessionToken: SESSION-TOKEN # Available when rotating credentials are used# target where the objects is `miniostore` aliastarget:type: TYPE # valid values are "s3"bucket: BUCKETprefix: PREFIX# NOTE: if target is remote then source must be "local"# endpoint: ENDPOINT# credentials:#   accessKey: ACCESS-KEY#   secretKey: SECRET-KEY#   sessionToken: SESSION-TOKEN # Available when rotating credentials are used[TRUNCATED]

使用以下命令执行批量复制

mc batch status olderstore/ E24HH4nNMcgY5taynaPfxu●∙∙Objects:    	28766Versions:   	28766Throughput: 	3.0 MiB/sTransferred:	406 MiBElapsed:    	2m14.227222868sCurrObjName:	share/doc/xml-core/examples/foo.xmlcatalogs

使用上面的复制作业 ID(在本例中为 E24HH4nNMcgY5taynaPfxu ),我们可以找到批处理作业的状态。

mc batch list olderstore/ID                  	TYPE        	USER        	STARTEDE24HH4nNMcgY5taynaPfxu  replicate   	minioadmin  	1 minute ago

您可以列出并查找当前正在运行的所有批处理作业的配置。

mc batch describe olderstore/ E24HH4nNMcgY5taynaPfxureplicate:apiVersion: v1
mc batch describe olderstore/ E24HH4nNMcgY5taynaPfxu

例如,如果批处理作业使网络饱和并且您需要稍后在流量最少时恢复它,您也可以取消并启动批处理作业。

mc mirror

让我们快速看一下 mc mirror 在这种情况下如何工作。

mc mirror --watch olderstore/mybucket miniostore/mybucket

上面的命令与rsync类似。它不仅会将数据从 olderstore 复制到 miniostore ,还会在 olderstore 上查找传入的较新对象,然后将它们复制到 miniostore

您可以比较两个桶,看看数据是否复制成功。

mc diff olderstore/mybucket miniostore/mybucket

就这么简单。

哪个是更好的选择?

虽然 mc mirror 看起来简单明了,但我们实际上推荐使用批量复制方法从现有的S3兼容存储中迁移数据,原因有几个。

批量复制在服务器端运行,而 mc mirror 在客户端运行。这意味着批复制拥有运行 MinIO 服务器来执行批处理作业的全部可用资源。另一方面, mc mirror 受到运行命令的客户端系统的瓶颈,因此您的数据会走更长的路线。换句话说,使用批量复制时,跟踪路由将类似于 olderstore -> miniostore ,但使用镜像时,将类似于 olderstore -> mc mirror -> miniostore 。

批处理作业是一次性过程,允许精细控制复制。例如,在运行复制时,如果您发现网络已饱和,您可以取消批量复制作业,然后在流量最少的非工作时间恢复。如果某些对象无法复制,作业将重试多次,以便最终复制对象。

那么批量复制就没有缺点吗?嗯,不是很多。我们在现实世界中看到的一个可能的问题是,有时批量复制很慢而且不是即时的。根据网络传输和速度,与其他方法相比,您可能会发现速度有些慢。话虽这么说,我们仍然建议批量复制,因为它更稳定,并且我们可以更好地控制数据迁移的方式和时间。

复制到另一个站点

一旦 MinIO 集群中有数据,您需要确保将数据复制到另一个站点的另一个 MinIO 集群,以实现冗余、性能和灾难恢复目的。有多种方法可以做到这一点,但在本例中我们讨论以下两种:

  • 站点复制
  • 桶复制

一旦数据进入 MinIO 对象存储集群,它就提供了多种不同的复制和管理数据的可能性。

第一步是设置 3 个相同的 MinIO 集群,并分别将它们命名为 minio1、minio2 和 minio3。我们假设 site1 已使用批量复制将数据迁移到它。

mc alias set minio1 http:// minioadmin minioadminmc alias set minio2 http:// minioadmin minioadminmc alias set minio3 http:// minioadmin minioadmin

跨所有 3 个站点启用站点复制

mc admin replicate info minio1SiteReplication enabled for:Deployment ID               		 | Site Name  	 | Endpointf96a6675-ddc3-4c6e-907d-edccd9eae7a4 | minio1 		 | http://0dfce53f-e85b-48d0-91de-4d7564d5456f | minio2 		 | http://8527896f-0d4b-48fe-bddc-a3203dccd75f | minio3 		 | http://

验证跨 3 个站点的站点复制设置是否正确

mc admin replicate info minio1

使用以下命令检查当前复制状态

mc admin replicate status minio1

启用站点复制后,数据将自动开始在所有站点之间复制。根据要传输的数据量、网络和磁盘速度,跨站点同步对象可能需要几个小时到几天的时间。

如果花费的时间比平时更长,或者您仍然没有看到所有内容都已复制,则可以执行 resync 命令,如下所示

mc admin replicate resync start minio1 minio2 minio3

可以使用以下命令检查 status

mc admin replicate resync status minio1 minio2 minio3

最终所有数据将被复制到 minio2 和 minio3 站点。

桶复制

桶复制,顾名思义,是基于 ARN 在 MinIO 中的特定桶上设置复制。

设置以下两个MinIO别名

来源:

mc alias set minio1 

目的地:


mc alias set minio2 

在 minio2 端设置两个别名后,创建一个复制用户 repluser 并在具有权限的 minio2 端存储桶上为此用户设置用户策略执行本策略中列出的操作作为复制的最低要求。

mc admin user add minio2 repluser repluserpwd

设置 repluser 运行复制操作所需的最低策略

$ cat > replicationPolicy.json << EOF{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["s3:GetBucketVersioning"],"Resource": ["arn:aws:s3:::destbucket"]},{"Effect": "Allow","Action": ["s3:ReplicateTags","s3:GetObject","s3:GetObjectVersion","s3:GetObjectVersionTagging","s3:PutObject","s3:ReplicateObject"],"Resource": ["arn:aws:s3:::destbucket/*"]}]}

将上面的 replpolicy 附加到 repluser


$ mc admin policy add minio2 replpolicy ./replicationPolicy.json
$ mc admin policy set minio2 replpolicy user=repluser

现在这就是有趣的地方。现在您已经在 minio2 集群上创建了复制用户 (repluser) 和复制策略 (replpolicy),您需要在 minio1 上实际设置存储桶复制目标。这还没有启动存储桶复制,它只是为稍后我们实际启动该过程时进行设置。

$ mc replicate add minio1/srcbucket https:/repluser:repluserpwd@replica-endpoint:9000/destbucket --service "replication" --region "us-east-1"Replication ARN = 'arn:minio:replication:us-east-1:28285312-2dec-4982-b14d-c24e99d472e6:destbucket'

最后,让我们开始复制过程。

$ mc replicate add minio1/srcbucket --remote-bucket https:/repluser:repluserpwd@replica-endpoint:9000/destbucket

现在,上传到源存储桶且满足复制条件的任何对象都将由 MinIO 服务器自动复制到远程目标存储桶。通过禁用配置中的特定规则或完全删除复制配置,可以随时禁用复制。

哪个是更好的选择?

那么,为什么我们不能对所有事情都使用站点到站点复制,而为什么我们需要使用批量复制呢?批量复制提供了对复制过程的更多控制。当您第一次启动站点复制时,请将其视为消防水带,一旦启动,站点复制过程就有可能使用网络上的所有可用网络带宽,达到其他应用程序无法使用网络吞吐量的程度。另一方面,虽然有时批量复制可能很慢,但它不会在初始数据传输期间中断您的现有网络。当您只想复制少数存储桶而不是整个集群时,存储桶复制通常很有用。

好的,那么站点复制呢?批量复制对于连续复制来说并不理想,因为一旦批量作业结束,它就不会复制任何新对象。因此,您必须以一定的时间间隔重新运行批量复制作业,以确保增量复制到 minio2 站点。另一方面,如果您有主动-主动复制设置,站点复制允许将数据从 minio1 复制到 minio2 ,反之亦然。

不可能同时启用存储桶和站点复制,您必须选择其中之一。因此,通常除非您只想复制特定存储桶中的某些存储桶或某些对象,否则我们强烈建议使用站点复制,因为它不仅会复制现有存储桶和对象,还会复制创建的任何新存储桶/对象。此外,无需太多配置,您就可以以分布式方式设置复制,北美可以有 minio1 ,非洲可以有 minio2 ,这样 MENA(中东和北非)区域就会添加数据 minio2 和北美地区将向 minio1 添加数据,并且它们将相互复制。

最后的想法

在这篇文章中,我们深入探讨了存储桶、批量和站点复制类型。虽然没有固定的规则来使用特定的复制策略,但我们 SUBNET 的工程师在处理了无数的集群设置、迁移它们、扩展它们、考虑灾难恢复场景之后,我们的工程师提出了上述复制策略,这应该对大多数人有帮助人们正在考虑将数据迁移到 MinIO。

如果您对复制或最佳实践有任何疑问,请联系我们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在MFC对话框中嵌入web网页时事件失效问题

2010-04-20 日志 在MFC对话框中嵌入web网页时&#xff0c;网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…

C语言推荐书籍

本书详细讲解了C语言的基本概念和编程技巧。全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章&#xff5e;第15章详细讲解了C语言的相关知识&#xff0c;包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串…

自然语言处理Gensim入门:建模与模型保存

文章目录 自然语言处理Gensim入门&#xff1a;建模与模型保存关于gensim基础知识1. 模块导入2. 内部变量定义3. 主函数入口 (if __name__ __main__:)4. 加载语料库映射5. 加载和预处理语料库6. 根据方法参数选择模型训练方式7. 保存模型和变换后的语料8.代码 自然语言处理Gens…

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路2. 代码实现 题目链接&#xff1a;3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路 这道题倒是没啥特别的思路&#xff0c;直接暴力求解就是了&#xff0c;因此…

WPF 【十月的寒流】学习笔记(1):DataGrid过滤

文章目录 相关链接代码仓库前言环境DataGrid 数据筛选项目配置使用原理主要代码&#xff08;详细代码可以看我的GitHub仓库&#xff09;Models.PersonDataGirdViewDataGridViewModel 实现效果 总结 相关链接 十月的寒流 在 WPF 中制作 DataGrid 的数据筛选功能 WPF 中如何制作 …

Redis分布式锁正确使用

分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。 分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis非常适合作为分布式锁使用,并且在各个公司都大规模的使用。 本文将由浅入深的探究Redis分…

2024年上半年第一次课

文章目录 一、加入课程QQ群&#xff08;一&#xff09;加入QQ群&#xff08;二&#xff09;加群要求 二、加入超星学习通&#xff08;一&#xff09;安装超星学习通&#xff08;二&#xff09;利用学习通签到&#xff08;三&#xff09;查看课程内容&#xff08;四&#xff09;…

Python多线程编程:深入理解threading模块及代码实战【第99篇—Multiprocessing模块】

Python多线程编程&#xff1a;深入理解threading模块及代码实战 在Python编程中&#xff0c;多线程是一种常用的并发编程方式&#xff0c;它可以有效地提高程序的执行效率&#xff0c;特别是在处理I/O密集型任务时。Python提供了threading模块&#xff0c;使得多线程编程变得相…

CSS 的块级元素和行内元素

CSS 的块级元素和行内元素 常见的块级元素&#xff1a;h1 - h6&#xff0c;p&#xff0c;div&#xff0c; ul&#xff0c; ol&#xff0c; li等 常见的行内元素&#xff1a;a&#xff0c;strong&#xff0c;b&#xff0c;em&#xff0c;i&#xff0c;span等 块级元素的特点 独…

数字化转型导师坚鹏:政府数字化转型智慧城市类案例研究

政府数字化转型智慧城市类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚政府数字化转型的智慧城市类成功案例 不清楚政府数字化转型的城市大脑类成功案例 不清楚政府数字化转型的综合实践类成功案例 课程特色&#xff1a; 针对性强 …

MATLAB环境下基于粒子群优化算法和离散小波变换的心电信号降噪

由于现实环境的复杂性以及信号获取设备的非理想特性等原因&#xff0c;导致人们在获得信号的过程中会引入各种各样的噪声成分&#xff0c;这不但会使得信号质量达不到实际要求&#xff0c;而且会掩盖信号中的重要细节。这也就要求我们在对数字信号进行具体地分析处理之前&#…

Unity接入SQLite (一):SQLite介绍

1.简介 SQLite是一个开源的嵌入式关系数据库管理系统。它是一种轻量级的数据库引擎&#xff0c;不需要单独的服务器进程&#xff0c;可以直接嵌入到应用程序中使用。Sqlite使用简单、高效&#xff0c;并且具有对标准SQL的完整支持。它适用于需要在本地存储和访问数据的应用程序…

Python读写XML文件的技术指南【第100篇—读写XML文件】

Python读写XML文件的技术指南 在软件开发中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;是一种广泛用于数据存储和交换的格式。Python作为一门强大而灵活的编程语言&#xff0c;提供了许多库和工具来处理XML文件。本篇技术博客将介绍如何使用Python读写XML文件&…

免编程经验,搭建宠物店小程序轻松实现

在如今的互联网时代&#xff0c;小程序商城已成为各行业推广和销售的热门方式。对于花店来说&#xff0c;搭建一个自己的小程序商城不仅可以提升品牌形象&#xff0c;还可以方便顾客在线选购花卉产品。下面就来教大家如何轻松搭建一个花店小程序商城&#xff0c;并通过引流获得…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言&#xff1a; 这段时间一直专注于数据报表的开发&#xff0c;当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅&#xff0c;美观的Excel文档格式的来展示数据&#xff0c;当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

【大数据】Flink 内存管理(四):TaskManager 内存分配(实战篇)

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…

解决启动服务报./nginx -s reload nginx: [emerg] unknown directive “错误

重启服务报错 bug: ./nginx -s reload nginx: [emerg] unknown directive "? 原因&#xff1a; 一、可能打开没有关闭 二、刚刚编辑的没成功&#xff0c;乱码了&#xff0c;格式问题&#xff0c;重新配置

嵌入式学习 Day 23

一. 进程基本概念: 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&#xff09;…

面向对象进阶——抽象类,接口,内部类

第一章 抽象类 1.1 概述 1.1.1 抽象类引入 ​ 父类中的方法&#xff0c;被它的子类们重写&#xff0c;子类各自的实现都不尽相同。那么父类的方法声明和方法主体&#xff0c;只有声明还有意义&#xff0c;而方法主体则没有存在的意义了(因为子类对象会调用自己重写的方法)。…

01|Mysql底层存储引擎

1. 聚集索引&#xff08;聚簇&#xff09;与非聚集索引 1.1 聚集索引 索引和数据存储在一起。叶子节点存储了完整的数据记录&#xff1b; 1.2 非聚集索引 MyISAM存储引擎就是非聚集索引&#xff0c;索引和数据文件是分开存储的。索引在MYI文件中&#xff0c;数据在MYD文件中…