现代企业的运营离不开IT系统的支撑,而数据则是IT系统的核心,也是企业的核心资产,关乎企业的生存与发展。一旦出现数据信息丢失或毁损,将严重影响企业和客户利益,甚至影响到企业的行业竞争力和市场声誉,其重要性不言而喻。但是就像人生不如意事十有八九,人为操作失误,设备系统故障、病毒侵袭、自然灾害等威胁数据安全的因素往往就在不经意间骤然发生。作为IT系统管理员,总是要千方百计地维护IT系统业务连续性和数据的完整性。通常会采取部署防火墙,安装防病毒软件,系统双活、异地容灾等措施,而数据备份则作为数据保护的最后手段,是数据安全的最后一道防线。
之前有一定规模数据量的企业会购买备份软件及大容量磁带库来实现企业数据的集中备份,这是当时性价比较高的数据备份办法。随着分布式对象存储的出现与普及,用对象存储构建企业数据集中备份系统更具有优势,主要表现在:
MinIO 对象存储系统是为海量数据存储、人工智能、大数据分析而设计,基于Apache License v2.0 开源协议的对象存储系统,它完全兼容 Amazon S3 接口,单个对象最大可达 5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。关于MinIO 对象存储的具体工作原理在网上可搜到大量的资料,本文不再赘述,这里简单总结一下使用体验:
不足之处是:
不支持向集群中添加单个节点并进行自动调节的扩容方式。
MinIO支持以单机模式、分布式集群模式、联盟模式部署。
软件下载(linux-amd64):
# wget https://dl.min.io/server/minio/release/linux-amd64/minio -P /usr/local/bin/
# chmod +x /usr/local/bin/minio
仅用一台主机作为MinIO Server,又分两种启动模式:
# minio server /data
对象直接存储在/data目录下,不会建立副本,也不会启用纠删码机制。
该模式最大的好处是没有技术门槛,“开箱即用”,缺点是单机无高可用保障。如果您的对象存储容量要求不大,访问不太频繁,服务无需全天候在线,该模式不失为一种简便易行的好办法。
# minio server /data1 /data2 /data3 /data4
即启动minio server时传入多个目录参数(每个目录对应一块硬盘)。系统自动生成若干纠删组,每个纠删组包含4至16块硬盘。存储数据对象时,先进行纠删分片,默认策略是得到相同数量的数据分片和校验分片,然后分散存储至纠删组内的硬盘,纠删组内一半硬盘损坏不丢数据。同样,单机无高可用保障。
在多台主机上部署MinIO服务,组建为分布式存储集群,对外以一个整体提供服务。如一个由四个节点,每节点2块硬盘的MinIO分布式集群启动命令(在集群所有节点上运行):
# export MINIO_ACCESS_KEY=QS8W8H15JS0F6ZRN0F9S
# export MINIO_SECRET_KEY=IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4
# minio server --address :9000 http://172.16.2.{101...104}/data{1...2}
系统自动在集群内生成若干纠删组,每个纠删组包含4至16块硬盘。存储数据对象时,先进行纠删分片,然后将数据分片和校验分片分散存储至纠删组内的硬盘。与“纠错码单机模式”不同的是:分布式集群纠删组的硬盘会尽量取自于不同节点,避免单机模式无高可用性的弊端,最多允许一半节点宕机,数据仍可读。
MinIO集群采用去中心化架构,各节点间为对等关系,连接至任一节点均可实现对集群的访问,通过Load Balancer或DNS轮询等方式实现节点间的负载均衡。由于集群每个节点都能提供对象存储服务,其整体性能优于“机头”式的对象存储。
MinIO集群要求节点的硬件配置,磁盘数量完全对等。MinIO集群节点数不少于4个,但一般不超过32个,集群通过分布式锁保证强一致性,若集群节点数过大,维护强一致性将带来性能问题。
联盟模式即通过引入etcd和coreDNS,将多个MinIO分布式集群在逻辑上组成一个联盟,对外以一个整体提供服务,并提供统一的命名空间。
MinIO联盟集群的架构下图所示。
说明:
联盟会将所有存储桶域名和存储桶实际所在的集群节点IP地址写入etcd中;
coreDNS解析储桶域名对应的集群节点IP;
外部应用依赖coreDNS定位存储桶的实际存储节点,再进行数据访问。
启动包含两个MinIO分布式集群的联盟:
**在MinIO集群1所有节点上运行(4节点,每节点2块盘)**
# export MINIO_ETCD_ENDPOINTS="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379"
# export MINIO_DOMAIN=domain.com
# export MINIO_PUBLIC_IPS=172.16.2.101,172.16.2.102, 172.16.2.103,172.16.2.104
# minio server http://minio{101...104}.domain.com/data{1...2}
**在MinIO集群2所有节点上运行(6节点,每节点3块盘):**
# export MINIO_ETCD_ENDPOINTS="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379"
# export MINIO_DOMAIN=domain.com
# export MINIO_PUBLIC_IPS=172.16.2.105,172.16.2.110
# minio server http://minio{105...110}.domain.com/data{1...3}
联盟模式部署不要求各集群的节点数和磁盘数对等;联盟中单个集群故障不影响其它集群;通过不断添加新的集群来扩大整个系统,MinIO对象存储系统几乎可以无限的扩展总体性能和容量。
MinIO Client (mc)是用Go语言开发的MinIO客户端软件,兼容Amazon S3、Ceph RGW等对象存储,支持AWS Signature v2和v4。目前官网上有Windows、linux、darwin三种平台mc可下载,下载地址:https://dl.min.io/client/mc/release
软件下载(linux-amd64):
# wget https://dl.min.io/client/mc/release/linux-amd64/mc -P /usr/local/bin/
# chmod +x /usr/local/bin/mc
常用命令:
**增加alias:obs, alias相当于访问某一对象存储(MinIO、AWS S3、Ceph RGW等)的handle**
# mc alias set obs http://172.16.2.101/ QS8W8H15JS0F6ZRN0F9S IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4
**查询alias**
# mc alais ls
**创建存储桶**
# mc mb obs/bucket1
**上传文件**
# mc cp /tmp/test.txt obs/bucket1
**查看存储桶**
# mc ls obs/bucket1
[2021-04-02 14:53:08 CST] 0B test.txt
**帮助**
# mc --help
对象存储可以用于两大类数据的备份:一类是指普通文件,如office文档、图片文件,视频影像文件等,普通文件的特点是其内容不会持续改变;第二类是数据库,数据库的数据文件一直处于open状态,其内容是持续变化的。这两类数据也是企业最核心的数据。其它诸如操作系统备份、虚拟机备份、CDP实时备份等,对象存储显然不太适合。
下面分别介绍普通文件及数据库的备份办法。
利用mc、s3cmd、aws-cli工具将普通文件备份到对象存储。mc支持Windows、linux、darwins平台,s3cmd、aws-cli则是用python开发,支持多种平台。
mc备份示例:
# mc cp test.dat obs/bucket1
或者
# mc mirror /backup obs/bucket1
s3cmd配置及备份示例:
# s3cmd --configure
Access Key: QS8W8H15JS0F6ZRN0F9S
Secret Key: IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4
Default Region [US]: default
S3 Endpoint [s3.amazonaws.com]: 172.16.2.101:9000
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 172.16.2.101:9000/%(bucket)
Encryption password:
Use HTTPS protocol [Yes]: No
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: ENTER
Test access with supplied credentials? [Y/n] n
Save settings? [y/N] y
# s3cmd mb s3://bucket2
# s3cmd put test.dat s3://bucket2
aws cli配置及备份示例:
# aws configure
AWS Access Key ID [None]: Q3AM3UQ867SPQQA43P2F
AWS Secret Access Key [None]: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
Default region name [None]: default
Default output format [None]: ENTER
# aws --endpoint-url https://172.16.2.101:9000 s3 mb s3://bucket3
# aws --endpoint-url https://172.16.2.101:9000 s3 cp test.dat s3://bucket3
数据库一般都具有数据转储的工具或SQL命令,如Oracle exp/expdp、mysql mysqldump、SQLServer backup database等。数据库最简单的备份方式是:利用数据库转储工具或命令将数据库转储,然后备份转储文件。数据库转储备份属于逻辑备份,对于小型数据库是可行的,对于TB级大型数据库则力所不及,因为转储可能要耗费很长时间,转储文件巨大,本地磁盘容量可能不足,大型数据库一般会选择物理备份,将数据库直接备份到大容量的磁带库。
RMAN是Oracle数据库的备份与恢复组件,DBA通常会利用RMAN把数据库物理备份到磁盘或磁带库。从Oracle 9i R2开始,通过在Oracle服务器上安装安全云备份模块(Oracle Secure Backup Cloud Module,OSB云模块),RMAN可以直接备份数据到AWS S3或兼容S3的对象存储,无需备份到本地后再上传。参考:https://docs.oracle.com/database/121/RCMRF/web_services.htm#RCMRF90489。
这里简单介绍一下部署OSB云模块及RMAN备份到MinIO的步骤:
安装文件osbws_installer.zip下载地址:
https://www.oracle.com/database/technologies/secure-backup-s3.html
解压后生成两个文件,
osbws_install.jar: OSB云模块安装jar包,支持多种平台
osbws_readme.txt:OSB云模块安装说明文件
# su - oracle
$ java -jar ./osbws_install.jar \
-AWSID QS8W8H15JS0F6ZRN0F9S \
-AWSKey IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4 \
-walletDir $ORACLE_HOME/dbs/osbws_wallet \
-libDir $ORACLE_HOME/lib \
-awsEndPoint 172.16.2.101 \
-awsPort 80 \
-no-import-certificate \
-location default
说明:
osbws{sid}.ora: OSB云模块参数文件
osbws_wallet目录: 包含加密的AWSID、AWSKEY等信息
这里假设数据库sid为tadb
$ vi $ORACLE_HOME/dbs/osbwstadb.ora
OSB_WS_HOST=http://172.16.2.101
#OSB_WS_LOCATION=default
OSB_WS_BUCKET=bucket1
OSB_WS_VIRTUAL_HOST=FALSE
OSB_WS_WALLET=’location=file:/oracle/product/11.2/db_1/dbs/osbws_wallet CREDENTIAL_ALIAS=minio_aws’
RMAN> show all;
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/oracle/product/11.2/db_1/lib/libosbws.so,SBT_PARMS=(OSB_WS_PFILE=/oracle/product/11.2/db_1/dbs/osbwstadb.ora)';
……
$ rman target /
RMAN> backup tablespace users;
Starting backup at 20210405 10:27:53
……
piece handle=g6vrh8l9_1_1 tag=TAG20210405T102753 comment=API Version 2.0,MMS Version 12.2.0.2
channel ORA_SBT_TAPE_1: backup set complete, elapsed time: 00:00:03
Finished backup at 20210405 10:27:56
RMAN> shutdown immediate
RMAN> host '/bin/rm /oradata/tadb/users01.dbf';
RMAN> startup mount
RMAN> restore tablespace users;
……
channel ORA_SBT_TAPE_1: restore complete, elapsed time: 00:00:01
Finished restore at 20210407 14:11:54
RMAN> recover tablespace users;
……
media recovery complete, elapsed time: 00:00:00
Finished recover at 20210407 14:12:00
RMAN> alter database open;
database opened
xtrabackup是 Percona公司开发的一个用于MySQL数据库备份的开源工具,支持MySQL、Percona server和MariaDB,是广受欢迎的MySQL物理备份工具。官网地址:https://www.percona.com/
xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,不能备份MyISAM数据表。从2.4.14版本开始(对应于mysql5.7),支持stream模式直接存储到AWS S3或兼容S3的对象存储,无需备份到本地后再上传。
这里也简单介绍一下部署及备份恢复过程:
# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
# yum install -y ./percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
# xtrabackup --backup --stream=xbstream \
--user=root --password=123456 \
--extra-lsndir=/tmp --target-dir=/tmp | xbcloud put \
--storage=s3 --s3-endpoint=http://172.16.2.101 \
--s3-access-key='QS8W8H15JS0F6ZRN0F9S' \
--s3-secret-key='IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4' \
--s3-bucket='mysql' \
--parallel=10 \
--insecure \
--s3-bucket-lookup=PATH $(date '+%Y%m%d%H%M%S')-full_backup
……
210405 18:05:54 completed OK!
210405 18:05:54 xbcloud: Upload completed.
# systemctl stop mysqld
# cd /var/lib/mysql
# rm -rf ib_buffer_pool ibdata1 mysql performance_schema sys
# xbcloud get \
--storage=s3 --s3-endpoint=http://172.16.2.101 \
--s3-access-key='QS8W8H15JS0F6ZRN0F9S' \
--s3-secret-key='IRDCiiHxhVd5eDbkcVRh77R00VdS3NTgx5J7JXg4' \
--s3-bucket='mysql' \
--parallel=10 \
--insecure \
--s3-bucket-lookup=PATH 20210405180549-full_backup 2>download.log | xbstream -x -C /var/lib/mysql --parallel=10
# chown -R mysql:mysql /var/lib/mysql
# systemctl start mysqld
目前还没有SQL Server数据库直接备份到对象存储的工具。SQL Server的备份办法是:通过其SQL命令BACKUP DATABASE把数据库转储出来,然后把转储文件上传到对象存储。
这里也简单演示一下备份及恢复过程:
C:\> type backup.bat
set tag=%Date:~0,4%%Date:~5,2%%Date:~8,2%
set db=%1%
if "%db%"=="" exit
echo BACKUP DATABASE %db% TO DISK='C:\SQLdata\Backup\%db%_%tag%.bak' > c:\backup.sql
sqlcmd –S localhost –U sa –P xxx -i c:\backup.sql
mc cp C:\SQLdata\Backup\%db%_backup_%tag%.bak obs/sqlserver
C:\> backup.bat oiw
…
已处理百分之 92。
已为数据库 'oiw',文件 'oiw' (位于文件 1 上)处理了 328 页。
……
C:\>mc cp obs/sqlserver/oiw_backup_20210407.bak C:\SQLdata\Backup
C:\>sqlcmd –S localhost –U sa –P xxx
1> drop database oiw
2> go
1> RESTORE DATABASE oiw FROM DISK='C:\SQLdata\Backup\oiw_20210407.bak'
2> GO
已为数据库 'oiw',文件 'oiw' (位于文件 1 上)处理了 328 页。
……
一般数据库也没有专用的软件或agent直接备份数据到对象存储,其备份方法类似SQL Server备份:先转储数据库,然后备份转储文件。也有一些应用的数据库对数据文件一致性要求不高,直接备份其数据文件即可,需根据具体情况具体分析。
利用MinIO Client(mc)的mirror命令,可轻松实现文件系统和对象存储之间,对象存储与对象存储之间的数据同步复制。mc mirror同步支持的对象存储不仅仅是MinIO,也包括兼容AWS S3的任何对象存储。
**同步本地目录到对象存储**
# mc mirror --overwrite --remove --watch /backup obs/backup
**同步对象存储site-A到对象存储site-B**
# mc mirror --overwrite --remove --watch site-A/backup site-B/backup
**甚至可以交叉同步复制,参见mc mirror --help**
Site-A: $ mc mirror --active-active siteA siteB
Site-B: $ mc mirror --active-active siteB siteA
(此处obs、site-A、site-B 是对象存储alias,可以是兼容AWS S3的任何对象存储)
有些行业机构的数据必须有异地备份, mc mirror一条简单的命令就帮助用户实现需求。
本文简要介绍了用对象存储作为企业数据备份系统的优势,MinIO部署模式,数据备份方法,数据同步复制等。MinIO极简设计、性能卓越、运维简单。是企业数据集中备份的理想解决方案。此外,MinIO也非常适合作为医疗影像、视频监控、视频点播等海量数据的静态资源服务器,互联网上这类文章很多,不赘述。
本文“MinIO部署”一节的内容参考或摘录了中国农业银行李云婷,艾明浩的文章:https://blog.csdn.net/csdnnews/article/details/114860023,特此申明,并对作者表示感谢。