跨区域(异地)双活解决方案
跨区域双活解决方案
目标
当某个区域数据中心不可访问时,客户的上传下载服务可以无缝切换到另一个区域数据中心
限制
同步存在特定延迟,在某区域数据中心故障后的同步无法在新的数据中心访问,仅支持国内区域做双活同步
双活上传下载域名
上传域名
双活地区(主-备) | 服务端上传域名 | 客户端上传域名 |
---|---|---|
华东-华北 | up-z0-z1.qiniup.com | upload-z0-z1.qiniup.com |
华北-华东 | up-z1-z0.qiniup.com | upload-z1-z0.qiniup.com |
华东-华南 | up-z0-z2.qiniup.com | upload-z0-z2.qiniup.com |
华南-华东 | up-z2-z0.qiniup.com | upload-z2-z0.qiniup.com |
华北-华南 | up-z1-z2.qiniup.com | upload-z1-z2.qiniup.com |
华南-华北 | up-z2-z1.qiniup.com | upload-z2-z1.qiniup.com |
【注】:up-z0-z1.qiniup.com 表示华东空间为主,华北空间为备,当华东空间上传出现问题,默认解析到华北空间进行上传
z0:华东,z1:华北,z2 华南
下载域名
双活地区(主-备) | 下载源站域名 |
---|---|
华东-华北 | iovip-z0-z1.qbox.me |
华北-华东 | iovip-z1-z0.qbox.me |
华东-华南 | iovip-z0-z2.qbox.me |
华南-华东 | iovip-z2-z0.qbox.me |
华北-华南 | iovip-z1-z2.qbox.me |
华南-华北 | iovip-z2-z1.qbox.me |
【注】:上述只是源站域名,不同区域的空间可以创建相同的域名,但是需要进行特殊处理,请联系技术支持
双活的两个空间通过API建立绑定关系
空间绑定
将双活的两个空间建立绑定关系,例如:A(华东),B(华北)创建了绑定关系,那么两个空间可以共用上传 token,如果 token 签的是 A 空间,那么你使用华东的上传域名 up.qiniu.com 上传是正常上传到 A 空间,如果使用华北的上传域名 up-z1.qiniup.com,那么就会上传到与 A 空间有绑定关系的 B 空间
请求包:
POST /bind/<bucket1>/to/<bucket2>
Host: api.qiniu.com
Authorization: 普通用户权限
返回包(JSON):
200 OK
<bucket1> <bucket2>
: 需要绑定的两个空间名称,顺序不分先后。需要绑定的两个空间需要属于不同区域,支持共享空间(后续可能扩展使用场景,此处未对权限进行检测,使用方进行检查)
绑定的两个空间,其中任意一个均只能与另一区域的一个空间进行绑定,如有b1,b2,b3分别属于区域z1,z2,z1,若b1,b2已经建立绑定关系,则b2,b3无法再建立绑定关系,因为b2已经与属于z1的b1建立绑定关系,将不能再与属于z1的其他空间建立绑定关系
解除空间绑定
请求包:
POST /unbind/<bucket1>[/to/<bucket2>]
Host: api.qiniu.com
Authorization: 普通用户权限
返回包(JSON):
200 OK
<bucket1> <bucket2>
: 需要解除绑定的空间名称,如只传入一个参数则会解绑该空间存在的所有绑定
存在绑定关系的空间在进行drop,cancelShare,transfer时需要先解除绑定
查询空间绑定
请求包:
POST /bindings/[<bucket1>][/to/<bucket2>]
Host: api.qiniu.com
Authorization: 普通用户权限
返回包(JSON):
200 OK
<bucket1> <bucket2>
: 空间名称,如只传bucket1则会查询与bucket1有关的绑定,如传入两个参数则查询两个空间的绑定是否存在,如都不传则查询该用户下的所有绑定(最后的/不能省略)
创建双活跨区域同步任务
将文件从一个区域同步到另一区域,双活跨区域同步优先级最高,以保证切备时下载资源正常
创建任务
请求
POST /dualsync/task/create HTTP/1.1
Content-Type: application/json
Body:
{
"name":"Z0-Z1", #任务名称,必须
"uid":12345, #用户Id,必须
"bkts":["test-z0","test-z1"], #双向同步的空间,必须
"is_sync":true, #是否同步历史数据,非必须,默认不同步
"conflict_strategy":0,#同步时文件冲突(同步文件与目标文件Hash不一致)处理策略,0:强制覆盖目标文件,1:如果当前文件上传时间较新则覆盖目标文件,2:跳过当前同步
"prefix":"ABC" #同步过滤前缀,非必须
}
响应
HTTP/1.1 200 OK
Body:
{
"id":"59faeb9c834c515be2000001"
}
删除任务
请求
POST /dualsync/task/delete HTTP/1.1
Content-Type: application/json
Body:
{
"id":"59faeb9c834c515be2000001" #任务Id,必须
}
响应
HTTP/1.1 200 OK
暂停任务
请求
POST /dualsync/task/stop HTTP/1.1
Content-Type: application/json
Body:
{
"id":"59faeb9c834c515be2000001" #任务Id,必须
}
响应
HTTP/1.1 200 OK
启动任务
请求
POST /dualsync/task/start HTTP/1.1
Content-Type: application/json
Body:
{
"id":"59faeb9c834c515be2000001" #任务Id,必须
}
响应
HTTP/1.1 200 OK