在目前大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']
源鏡像
添加了時間戳,方便查看
目的地域鏡像