在目前大IT企业大环境下,一个稳定安全可靠的云厂商对于在云计算大背景下,用云企业是很是高兴的事情,免去了传统IDC运维的长时间周期,下降运维人员对底层设备的技术门槛,按需按量根据业务动态弹性使用云资源,可谓大小企业的IT利好。对于数据安全,国内外公有云及各私有云厂商都存在使人触目惊心的时刻,更况且其余厂商和咱们的平常操做,有人操做的地方就有误操做,百分之一的风险但若是一旦发生就是100%的问题,虽SLA但或多或少存在影响,客户反馈若是阿里的A地域发生故障,例如地质灾害或不可控因素引起的ecs没法访问,用户数据都在云上没法操做状况下该如何,在此就国内很是优秀的公有云阿里云来讲,能够参考云服务器的数据备份和恢复来将咱们的数据备份,提升数据安全可靠性,用户建立ECS数据盘的快照,并使用快照进行磁盘的回滚,同时能够经过自定义镜像来长久保存咱们的数据。在此基础上考虑到不一样地域灾备的高额度IT成本,对此能够经过制做快照策略,快照级别备份,可是当遇到跨地域级别的灾难时,咱们的数据是否高可用呢?html
在最大程度的下降IT成本,又想在不可控大规模地域性灾难面前作些什么,天天凌晨业务低峰期对ECS制做镜像,同时复制到其余的不一样地域,如北京的镜像复制到上海,当北京整个region异常状况下,可利用复制在目标地域的ECS建立出来,在此抛砖引玉,后续能够将ecs在目标地域开出来并关机,归档删除以前的镜像,等等。一样能够将RDS备份也一样备份到异地OSS内,目前阿里已经有EBS很是方便的灾难状况下恢复RDS。利用此思路赞成的适用于其余场景下。python
在人生苦短,我用Python/连高中课本都有Python的IT大环境下,咱们也蹭着热度,利用这门简单实用简洁方便的语言,简单来实现咱们的功能。在此有不少附加的功能,咱们能够经过开放的公有云API来实现,例如另外一篇博文一样提供思路。git
你们能够参考:
Python自定义阿里云RDS备份策略github
readthedocsweb
若是多个实例可同时写入配置文件,用,进行分割。json
github地址api
首先须要咱们获取阿里云帐号的ak,在此强烈建议使用子用户建立,为此子用户受权能够镜像操做的权限,精细控制防止ak泄露致使的比必要损失。
其次简单利用Python实现建立镜像操做->将镜像复制到其余地域。安全
配置文件服务器
# 阿里云ak配置,建议采用子帐户只受权ecs镜像操做 [common] # 阿里云acccesskeyid accessKeyId = LTAIhfXxxxxxxxx # 阿里云accesssecret accessSecret = GwfAMvR4K2ELxxxxxxxxxxxxx # log目录名称 logdir_name = logdir # log文件名称 logfile_name = ecsoperlog.log # ecs源地域配置信息段 #支持在华北 一、华北 二、华北 三、华北 五、华东 一、华东 2 和华南 1 地域之间复制镜像。涉及其余国家和地区地域时,能够 提交工单 申请 [source] # 源地域实例regionid,能够参考:https://help.aliyun.com/document_detail/40654.html?spm=a2c1g.8271268.10000.5.5f98df25B98bhJ s_RegionId = cn-shanghai # 源实例id,可指定多个用,进行分隔 s_InstanceId = i-uf661wb708uvqc9jyhem,i-uf661wb708uvqc9jyhel # 源端制做镜像name s_ImageName = api-source-image # 源镜像描述信息 s_Description = api-source-image源镜像描述信息 # 镜像复制目的地域配置信息段 [destination] # 目的地域实例regionid, d_DestinationRegionId = cn-qingdao # 复制过来的镜像名称 d_DestinationImageName = api-destination-image # 复制过来的镜像描述信息 d_DestinationDescription = api-destination-image目的镜像描述信息
image操做(制做镜像->查看镜像制做状态->复制镜像)运维
# 建立实例生成器 def _get_Instance(self): for Instance in self.s_InstanceId_list.split(','): yield Instance def _create_image(self): """ 建立镜像 :return:返回镜像id """ s_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time())) request = CreateImageRequest.CreateImageRequest() request.set_accept_format('json') request.add_query_param('RegionId', self.s_RegionId) request.add_query_param('InstanceId', self.s_InstanceId) request.add_query_param('ImageName', self.s_ImageName + s_timer) request.add_query_param('Description', self.s_Description + s_timer) response = self.ecshelper.do_action_with_exception(request) self.logoper.info('建立镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"]) print('建立镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"]) return json.loads(response)["ImageId"] def _describe_image(self,imageid): """ 查询image状态 :param imageid: :return: """ request = DescribeImagesRequest.DescribeImagesRequest() request.set_accept_format('json') request.add_query_param('RegionId', self.s_RegionId) request.add_query_param('ImageId', imageid) response = self.ecshelper.do_action_with_exception(request) # 进度 json.loads(response)['Images']['Image'][0]['Progress'] self.logoper.info('镜像建立进度:%s' %json.loads(response)['Images']['Image'][0]['Progress']) # 镜像状态 return json.loads(response)['Images']['Image'][0]['Status'] #镜像复制 def _copy_image(self,imageid): """ 镜像复制 :param imageid:源镜像id :return: 复制成功后的镜像id """ flag = True while flag: try: if self._describe_image(imageid) == 'Available': flag = False else: time.sleep(300) except Exception as e: pass print('镜像已经建立完成') d_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time())) request = CopyImageRequest.CopyImageRequest() request.set_accept_format('json') request.add_query_param('RegionId', self.s_RegionId) request.add_query_param('DestinationRegionId', self.d_DestinationRegionId) request.add_query_param('DestinationImageName', self.d_DestinationImageName + d_timer) request.add_query_param('DestinationDescription', self.d_DestinationDescription + d_timer) request.add_query_param('ImageId', imageid) response = self.ecshelper.do_action_with_exception(request) self.logoper.info('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId']) print('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId']) return json.loads(response)['ImageId']
源镜像
添加了时间戳,方便查看
目的地域镜像