导读
“在腾讯云团队协助下,经过7x24小时的努力,微盟数据已经全面找回,并且公布商家赔偿计划。”--刷爆朋友圈的信息
科技界的圈子并不小,承包朋友圈,也可承包微博热搜。微博字数有限,仅仅能看到事情结果。朋友圈的公众号有详细叙述事情起伏经过,看得人心潮澎湃。
腾讯云团队在此次数据恢复中表现的硬核技术实力,是我们透过众多公关文必须看到的东西。抛开一个个租赁的计费账单,这也是云厂商真正的价值所在之一。
当然,令人激动的消息并不是事情的结束。微盟事件后,所有人开始积极思考,该做哪些事情提高系统数据安全。
权限账户分级、数据容灾、法律严惩等讨论近期也是不少。
思路推进,自然考虑使用各云厂商提供的各种数据安全解决方法。
例如腾讯云数据库,本身提供高可用架构的同时,也提供完备的周期自动备份方案。如果使用的是云数据库,那么日常备份的任务无需额外的操作。
当前最完备的系统安全方案中,一定有一条最安全的方法,是保证云数据库每日全量与增量数据完整备份的同时,保存1到n份副本到本地或其他储存介质中,并且定期检查备份可用,做周期的备份恢复演习。
当然各云厂商已经烙好了大饼,切好了小块,最后每一口还是要自己张嘴吃的。
本文解决其中一个最叶子结点的小事情,以实现能够保存多份备份副本到本地或其他存储介质中。
即以云数据库CDB for Mysql 为例,通过云API 接口实现自动下载全量备份文件和binlog日志到本地服务器。
实现方法大纲如下:
1. 安装开发工具集(SDK)环境
2. 使用api 3.0 explorer 调用腾讯云API 3.0 接口,快速生成SDK代码
3. 编写语言脚本,截取有效备份文件下载链接
4. 调用接口实现下载
文末提供python 代码示例,供腾讯云用户参考使用。
下面通过示例阐述操作步骤,示例语言python。
步骤 1.安装SDK,可选语言包括Python,Java,PHP,Go等。下载链接请查看:https://github.com/TencentCloud
点击链接下载 Tencent Cloud SDK 3.0 for Python 的zip 包,并且根据页面提示的步骤安装SDK环境。 https://github.com/TencentCloud/tencentcloud-sdk-python
root@VM_93_197_centos ~# mkdir /sdk_python
root@VM_93_197_centos ~# cd /sdk_python
root@VM_93_197_centos sdk_python# ls
tencentcloud-sdk-python-master.zip
root@VM_93_197_centos sdk_python# unzip tencentcloud-sdk-python-master.zip
root@VM_93_197_centos sdk_python# cd tencentcloud-sdk-python-master/
root@VM_93_197_centos tencentcloud-sdk-python-master# python setup.py install
步骤 2. 使用腾讯云API 3.0 explorer 工具,调用接口DescribeBackups(查询数据备份文件列表)获得备份文件的内/外网下载地址,并生成SDK可执行代码。
在腾讯云提供的API 3.0 explorer 工具页面,根据提示信息,填写必要参数,即可在线调用测试参数和接口。
云API 3.0 explorer 地址:https://console.cloud.tencent.com/api/explorer?Product=cdb&Version=2017-03-20&Action=DescribeBackups&SignVersion=
接口DescribeBackups 参考文档:https://cloud.tencent.com/document/product/236/15842
参数说明 (官方文档中亦有):
个人秘钥:安全凭证,包括 SecretId 和 SecretKey
Region: 实例所在地域,例如华东地域(上海)
InstanceId: 实例的标识ID,例如cdb-abcdefg
Offset: 偏移量,例如0
Limit: 分页大小,例如1
注意事项:
用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄漏,请立刻禁用该安全凭证。
附:申请安全凭证的具体步骤如下:
- 登录 腾讯云管理中心控制台。
- 前往 云API密钥 的控制台页面。
- 在 云API密钥 页面,单击【新建密钥】即可以创建一对密钥。
使用API 3.0 explorer 操作图示:
步骤 3.
复制云api explorer 生成的python 代码到SDK环境中,不需要任何改动,运行即可获得接口DescriberBackups 的调用结果。
root@VM_93_197_centos v20190711# python /API/Mysql/backup.py
{"TotalCount": 14, "RequestId": "050382e1-exxx-41cb-a510-xxxxx89c", "Items": [{"Status": "SUCCESS", "FinishTime": "2020-02-28 09:06:21", "Name": "xxxxxxbackup_20200228000511.xb", "Creator": "SYSTEM", "IntranetUrl": "https://mysql-database-backup-sh-xxxxxxxxFoctet-stream", "InternetUrl": "https://mysql-database-backup-sh-xxxxxxxFoctet-stream", "Date": "2020-02-28 09:06:17", "BackupId": 157109760, "Type": "physical", "Size": 1818642237}]}
前3步均不需要任何代码能力,简单实用。
步骤4.
需要编写脚本实现自动下载。
基本实现方法为:云api 接口输出json格式,包含备份文件的下载链接intraneturl。通过python脚本截取有效的url, 并且通过调用wget 进行下载。更多文件路径和备份文件管理的逻辑可以根据需要修改添加。
步骤5. 重复1-4步,实现binlog文件查看以及下载。
其中使用接口DescribeBinlogs(查询二进制日志备份文件列表)获得binlog文件的内/外网下载地址
接口DescribeBinlogs 参考文档:https://cloud.tencent.com/document/api/236/15843
本文提供完整的python 代码示例,供参考。可实现下载备份文件以及binlog日志。完整代码请查看文末。
代码使用方法:
1. 修改secretId、secredKey、region、instanceIds列表,其中多个instanceId使用逗号分隔。
参数i,j 设定每个实例下载的备份数量。例如,设置i=0,j=2 即下载每个实例最新的2个备份/binlog增量日志。
2. 在备份目录下运行脚本,即可下载多个实例的最新备份文件/日志binlog文件到当前目录下。
示例:
root@VM_93_197_centos CDB# pwd
/Backups/CDB
root@VM_93_197_centos CDB# python /API/Mysql/cdb_backup.py
start to download the backup of cdb-xxxx
100% .......................................................................... 1179758 / 1179758
...
root@VM_93_197_centos CDB# ls -lrt
total 4640
-rw-r--r-- 1 root root 1180947 Mar 3 23:35 cdb182xx_backup_20200303000425.xb
-rw-r--r-- 1 root root 1180950 Mar 3 23:35 cdb182xx_backup_20200302000428.xb
-rw-r--r-- 1 root root 1179759 Mar 3 23:35 cdb184xx_backup_20200303000458.xb
-rw-r--r-- 1 root root 1179758 Mar 3 23:35 cdb184xx_backup_20200302000459.xb
root@VM_93_197_centos CDB#
root@VM_93_197_centos CDB# python /API/Mysql/cdb_binlog.py
start to download the backup of cdb-xxx
100% ........................................................................ 353 / 353
...
root@VM_93_197_centos CDB# ls -lrt
total 16
-rw-r--r-- 1 root root 353 Mar 4 00:21 cdb184xx_binlog_mysqlbin.000002
-rw-r--r-- 1 root root 241 Mar 4 00:21 cdb184xx_binlog_mysqlbin.000003
-rw-r--r-- 1 root root 848 Mar 4 00:21 louxxx_binlog_mysqlbin.000016
-rw-r--r-- 1 root root 848 Mar 4 00:21 louxxx_binlog_mysqlbin.000015
Python 完整代码示例
///cdb_backup.python 完整代码
# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cdb.v20170320 import cdb_client, models
import json
import os
import wget
# Please modify with your own Key.
secretId=""
secretKey=""
# The region of your instance locates in.
region=""
# Seperate instance IDs with comma ","
instanceIds = ["",""
# defind how many backups to get,i=offset,j=limit
i =
j =
# Get the result of DescriberBackup
def GetUrlofBackups(each_instance):
try:
cred = credential.Credential(secretId,secretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = "cdb.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cdb_client.CdbClient(cred, region, clientProfile)
req = models.DescribeBackupsRequest()
params = {"InstanceId":each_instance,"Offset":i,"Limit":j}
param = json.dumps(params)
req.from_json_string(param)
resp = client.DescribeBackups(req)
url_output = resp.to_json_string()
result = json.loads(url_output)
return result
except TencentCloudSDKException as err:
print(err)
# start to download the backups of each instance
for ID in instanceIds:
try:
backupresult = GetUrlofBackups(ID)
for each_result in backupresult["Items"]:
url = each_result["IntranetUrl"]
notification="start to download the backup of " ID
print(notification)
wget.download(url)
except TencentCloudSDKException as err:
print(err)
///cdb_binlog.python 完整代码
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cdb.v20170320 import cdb_client, models
import wget
import json
import os
# Please modify with your own Key.
secretId=""
secretKey=""
# The region of your instance locates in.
region=""
# Seperate instance IDs with comma ","
instanceIds = ["",""]
# defind how many backups to get,i=offset,j=limit
i =
j =
# Get the result of DescribeBinlogs
def GetUrlofBinlog(each_instance):
try:
cred = credential.Credential(secretId,secretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = "cdb.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = cdb_client.CdbClient(cred, region, clientProfile)
req = models.DescribeBinlogsRequest()
params = {"InstanceId":each_instance,"Offset":i,"Limit":j}
param = json.dumps(params)
req.from_json_string(param)
resp = client.DescribeBinlogs(req)
DescribeBinlog = resp.to_json_string()
result = json.loads(DescribeBinlog)
return result
except TencentCloudSDKException as err:
print(err)
# start to download the binlog of each instance
for ID in instanceIds:
try:
binlogresult = GetUrlofBinlog(ID)
for each_result in binlogresult["Items"]:
url = each_result["IntranetUrl"]
notification="start to download the backup of " ID
print(notification)
wget.download(url)
except TencentCloudSDKException as err:
print(err)