OSS采用多可用区(AZ)机制,将用户的数据分散存放在同一地域(Region)的3个可用区。当某个可用区不可用时,仍然能够保障数据的正常访问。OSS同城冗余存储提供99.9999999999%(12个9)的数据设计持久性以及99.995%的服务可用性。

使用场景

同城冗余存储能够提供机房级容灾能力。当发生断网、断电或者灾难事件导致某个机房不可用时,OSS仍能继续提供强一致性的服务。整个故障切换过程用户无感知、业务不中断、数据不丢失,满足关键业务系统对于恢复时间目标(RTO)以及恢复点目标(RPO)等于0的强需求。

注意事项

  • 支持地域

    仅华南1(深圳)、华北2(北京)、华东1(杭州)、华东2(上海)、中国(香港)、新加坡以及印度尼西亚(雅加达)地域支持同城冗余存储。

  • 计费说明

    相对于本地冗余存储,同城冗余存储会产生更高的存储费用。更多信息,请参见OSS产品定价

  • 创建方式

    目前仅支持在创建Bucket时开启同城冗余存储。对于已创建的Bucket,您可以利用迁移工具(例如ossimport在线迁移服务等),将现有Bucket中的数据迁移到已开启同城冗余存储的Bucket中。

支持的存储类型

OSS的同城冗余存储目前支持标准存储类型、低频访问存储类型。这两种存储类型的各项对比指标如下:

对比指标 标准存储类型 低频访问存储类型
数据设计持久性 99.9999999999%(12个9) 99.9999999999%(12个9)
服务可用性 99.995% 99.50%
对象最小计量单位 64 KB
最短存储时间 30天
数据取回费用 按实际获取的数据量收取,单位GB
数据访问 实时访问,毫秒延迟 实时访问,毫秒延迟
图片处理 支持 支持

使用OSS控制台

  1. 登录OSS管理控制台
  2. 单击Bucket列表,然后单击创建Bucket
  3. 创建Bucket面板,按如下说明配置各项参数。
    参数 是否必选 描述
    Bucket名称 Bucket名称在OSS范围内必须全局唯一。Bucket名称命名规则如下:
    • 所选定的存储空间名称在阿里云OSS的所有现有存储空间名称中必须具有唯一性。
    • 只能包括小写字母、数字和短划线(-)。
    • 必须以小写字母或者数字开头和结尾。
    • 长度必须在3~63字符之间。
    地域 Bucket的数据中心。

    如需通过ECS内网访问OSS,请选择与您ECS相同的地域。更多信息,请参见 OSS访问域名使用规则

    Endpoint Bucket所在地域对应的外网Endpoint。
    存储类型 Bucket的存储类型。
    • 标准存储:提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问。适用于各种社交、分享类的图片、音视频应用、大型网站、大数据分析等业务场景。
    • 低频访问存储:提供高持久性、较低存储成本的对象存储服务。有最低存储时间(30天)和最小计量单位(64 KB)要求。支持数据实时访问,访问数据时会产生数据取回费用,适用于较低访问频率(平均每月访问频率1到2次)的业务场景。
    • 归档存储:提供高持久性、极低存储成本的对象存储服务。有最低存储时间(60天)和最小计量单位(64 KB)要求。数据需解冻(约1分钟)后访问,解冻会产生数据取回费用。适用于数据长期保存的业务场景,例如档案数据、医疗影像、科学资料、影视素材等。
    • 冷归档存储:提供高持久性的对象存储服务,费用在四种存储类型最低。有最低存储时间(180天)和最小计量单位(64 KB)要求。数据需解冻后访问,解冻时间根据数据大小和选择的解冻模式决定,解冻会产生数据取回费用。适用于需要超长时间存放的极冷数据,例如因合规要求需要长期留存的数据、大数据及人工智能领域长期积累的原始数据、影视行业长期留存的媒体资源、在线教育行业的归档视频等业务场景。
      说明

      仅华东5(南京本地地域)、韩国(首尔)、泰国(曼谷)不支持冷归档存储。

    有关存储类型的更多信息,请参见存储类型介绍

    HDFS服务 如果您希望通过JindoSDK访问OSS实现数据湖场景,需要开通HDFS服务。开通HDFS功能前,需单击前往授权,并按照页面指引完成授权操作。
    重要
    • 仅华东1(杭州)、华东2(上海)、华南1(深圳)、华北2(北京)、华北 3(张家口)和新加坡地域支持开启HDFS服务,请联系技术支持申请使用。HDFS服务开启后不支持关闭,请谨慎操作。
    • 归档以及冷归档存储类型Bucket不支持开启HDFS服务。
    同城冗余存储 Bucket的数据容灾类型。
    • 启用:开启后,将以同城冗余ZRS的方式存储您的OSS数据。同城冗余采用多可用区(AZ)机制,将您的数据冗余存储在同一地域(Region)的3个可用区。可支持单个可用区(机房)整体故障时(如断电、火灾等),仍然能够保障数据的正常访问。
      重要 仅华南1(深圳)、华北2(北京)、华东1(杭州)、华东2(上海)、中国(香港)、新加坡以及印度尼西亚(雅加达)地域支持开启同城冗余存储。此外,同城冗余存储的费用较高,且开启后不支持关闭,请谨慎操作。

      有关同城冗余存储的更多信息,请参见同城冗余存储

    • 关闭:以本地冗余LRS的方式存储您的OSS数据。本地冗余将您的数据冗余存储在同一个可用区的不同存储设备上,可支持两个存储设备并发损坏时,仍维持数据不丢失,可正常访问。
    版本控制 选择是否开通版本控制功能。
    • 开通:开通Bucket版本控制功能后,针对数据的覆盖和删除操作将会以历史版本的形式保存下来。当您在错误覆盖或者删除Object后,能够将Bucket中存储的Object恢复至任意时刻的历史版本。更多详情请参见版本控制介绍
    • 不开通:不开通版本控制功能,则不保存覆盖或删除的数据。
    读写权限 选择Bucket的读写权限。
    • 私有(private):只有该存储空间的拥有者可以对该存储空间内的文件进行读写操作,其他人无法访问该存储空间内的文件。
    • 公共读(public-read):只有该存储空间的拥有者可以对该存储空间内的文件进行写操作,任何人(包括匿名访问者)可以对该存储空间中的文件进行读操作。
      警告 互联网上任何用户都可以对该Bucket内文件进行访问,这有可能造成您数据的外泄以及费用激增,请谨慎操作。
    • 公共读写(public-read-write):任何人(包括匿名访问者)都可以对该存储空间内文件进行读写操作。
      警告 互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可能会侵害您的合法权益。除特殊场景外,不建议您配置公共读写权限。
    服务端加密 选择是否开启服务器端加密。
    说明 仅华东5(南京本地地域)不支持开启服务器端加密。
    • 服务端加密方式:选择Object的加密方式。
      • :不启用服务器端加密。
      • OSS完全托管:使用OSS托管的密钥进行加密。OSS会为每个Object使用不同的密钥进行加密,作为额外的保护,OSS会使用定期轮转的主密钥对加密密钥本身进行加密。
      • KMS:使用KMS默认托管的CMK或指定CMK ID进行加解密操作。

        使用KMS加密方式前,需要开通KMS服务。具体步骤,请参见购买专属KMS实例

    • 加密算法可选择AES256或SM4加密算法。
    • 加密密钥服务端加密方式选择KMS时,可配置此项。参数说明如下:
      • alias/acs/oss:使用默认托管的CMK生成不同的密钥来加密不同的Object,并且在Object被下载时自动解密。
      • CMK ID:使用指定的CMK生成不同的密钥来加密不同的Object,并将加密Object的CMK ID记录到Object的元信息中,具有解密权限的用户下载Object时会自动解密。选择指定的CMK ID前,您需在KMS管理控制台创建一个与Bucket处于相同地域的普通密钥或外部密钥。详情请参见导入密钥材料
    实时日志查询 如果您希望在不付费的情况下实时查询最近7天的OSS访问日志,请选择开通

    有关实时日志查询的更多信息,请参见实时日志查询

    如果您不需要进行实时日志查询,请保持不开通的默认配置。

    定时备份 如果您希望定时备份您的OSS数据,请选择开通。此时,OSS将自动创建备份计划,并由混合云备份HBR执行备份频率为每天备份一次OSS数据,备份文件保存一周的任务。
    重要
    • 仅华东1(杭州)、华东2(上海)、华南1(深圳)、华北2(北京)、华北3(张家口)、中国(香港)、新加坡、澳大利亚(悉尼)、印度尼西亚(雅加达)、美国(硅谷)地域支持定时备份功能。
    • 不支持为低频访问、归档和冷归档存储类型的Bucket配置定时备份。
    • 不支持备份和恢复软链接(Symlink)、归档和冷归档存储类型的Object以及Object的读写权限ACL。
    • 如果HBR未开通或未授权HBR访问OSS,则无法创建定时备份计划。

    更多信息,请参见定时备份

    如果您不需要定时备份您的OSS数据,请保持不开通的默认配置。

  4. 单击确定

使用阿里云SDK

以下仅列举常见SDK在创建Bucket时开启同城冗余存储的代码示例。关于其他SDK在创建Bucket时开启同城冗余存储的代码示例,请参见SDK简介

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CreateBucketRequest;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建CreateBucketRequest对象。
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);

            // 如果创建存储空间的同时需要指定存储类型和数据容灾类型, 请参考如下代码。
            // 此处以设置存储空间的存储类型为标准存储为例介绍。
            //createBucketRequest.setStorageClass(StorageClass.Standard);
            // 数据容灾类型默认为本地冗余存储,即DataRedundancyType.LRS。如果需要设置数据容灾类型为同城冗余存储,请设置为DataRedundancyType.ZRS。
            //createBucketRequest.setDataRedundancyType(DataRedundancyType.ZRS);
            // 设置存储空间的权限为公共读,默认为私有。
            //createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);

            // 创建存储空间。
            ossClient.createBucket(createBucketRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    // 设置Bucket的存储类型为低频访问类型,默认是标准类型。
    $options = array(
        OssClient::OSS_STORAGE => OssClient::OSS_STORAGE_IA
    );
    // 设置Bucket的读写权限为公共读,默认是私有读写。
    $ossClient->createBucket($bucket, OssClient::OSS_ACL_TYPE_PUBLIC_READ, $options);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");        
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret'
});

// 创建存储空间。
async function putBucket() {
  try {
    const options = {
      storageClass: 'Standard', // 存储空间的默认存储类型为标准存储,即Standard。如果需要设置存储空间的存储类型为归档存储,请替换为Archive。
      acl: 'private', // 存储空间的默认读写权限为私有,即private。如果需要设置存储空间的读写权限为公共读,请替换为public-read。
      dataRedundancyType: 'LRS' // 存储空间的默认数据容灾类型为本地冗余存储,即LRS。如果需要设置数据容灾类型为同城冗余存储,请替换为ZRS。
    }
    // 填写Bucket名称。
    const result = await client.putBucket('examplebucket', options);
    console.log(result);
  } catch (err) {
    console.log(err);
  }
}

putBucket();        
# -*- coding: utf-8 -*-
import oss2

# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')

# 创建存储空间。
# 如果需要在创建存储空间时设置存储类型、存储空间访问权限、数据容灾类型,请参考以下代码。
# 以下以配置存储空间为标准存储类型,访问权限为私有,数据容灾类型为同城冗余存储为例。
bucketConfig = oss2.models.BucketCreateConfig(oss2.BUCKET_STORAGE_CLASS_STANDARD, oss2.BUCKET_DATA_REDUNDANCY_TYPE_ZRS)
bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE, bucketConfig)
using Aliyun.OSS;

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
var accessKeyId = "yourAccessKeyId";
var accessKeySecret = "yourAccessKeySecret";
// 填写Bucket名称。
var bucketName = "examplebucket";

// 初始化OssClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
// 创建存储空间。
try
    {
        var request = new CreateBucketRequest(bucketName);
        //设置读写权限ACL为公共读PublicRead,默认为私有权限。
        request.ACL = CannedAccessControlList.PublicRead;
        //设置数据容灾类型为同城冗余存储。
        request.DataRedundancyType = DataRedundancyType.ZRS;
        client.CreateBucket(request);
        Console.WriteLine("Create bucket succeeded");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Create bucket failed. {0}", ex.Message);
    }
package main

    import (
        "fmt"
        "os"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建名为examplebucket的存储空间,并设置存储类型为低频访问oss.StorageIA、读写权限ACL为公共读oss.ACLPublicRead、数据容灾类型为同城冗余存储oss.RedundancyZRS。
    err = client.CreateBucket("examplebucket", oss.StorageClass(oss.StorageIA), oss.ACL(oss.ACLPublicRead), oss.RedundancyType(oss.RedundancyZRS))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}
id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:@"<StsServer>"];
OSSClientConfiguration *cfg = [[OSSClientConfiguration alloc] init];
cfg.maxRetryCount = 3;
cfg.timeoutIntervalForRequest = 15;

// 由于client在释放时会取消持有的session中的所有任务并将session置为无效,因此请保证client的生命周期在请求完成前不会被释放。
// Endpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
OSSClient *client = [[OSSClient alloc] initWithEndpoint:@"Endpoint" credentialProvider:credentialProvider clientConfiguration:cfg];

OSSCreateBucketRequest * create = [OSSCreateBucketRequest new];
// 设置存储空间名称为examplebucket。
create.bucketName = @"examplebucket";
// 设置访问权限为私有。
create.xOssACL = @"private";
// 设置存储类型为低频访问类型IA。
create.storageClass = OSSBucketStorageClassIA;

OSSTask * createTask = [client createBucket:create];

[createTask continueWithBlock:^id(OSSTask *task) {
    if (!task.error) {
        NSLog(@"create bucket success!");
    } else {
        NSLog(@"create bucket failed, error: %@", task.error);
    }
    return nil;
}];            
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /*初始化OSS账号信息。*/
    /*阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
    std::string AccessKeyId = "yourAccessKeyId";
    std::string AccessKeySecret = "yourAccessKeySecret";
    /*yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /*填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /*初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /*指定新创建bucket的名称、存储类型和ACL。*/
    CreateBucketRequest request(BucketName, StorageClass::IA, CannedAccessControlList::PublicReadWrite);
    /*设置数据容灾类型为同城冗余存储。*/
    //request.setDataRedundancyType(DataRedundancyType::ZRS);

    /*创建Bucket。*/
    auto outcome = client.CreateBucket(request);

    if (!outcome.isSuccess()) {
        /*异常处理。*/
        std::cout << "CreateBucket fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        ShutdownSdk();
        return -1;
    }

    /*释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

使用命令行工具ossutil

关于使用ossutil在创建Bucket时开启同城冗余存储的具体步骤, 请参见mb(创建存储空间)

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucket