Amazon Database Migration Service(DMS)是一项云服务,可轻松实现对关系数据库、数据仓库、NoSQL数据库以及其余类型数据存储的迁徙工作。Amazon DMS专门用于从多个本地实例,或者云与本地实例的组合将数据迁徙至亚马逊云。
- Database Migration Service
http://aws.amazon.com/dms
在应用Amazon DMS进行数据迁徙的过程中,最重要的是对以后正在进行的复制工作的状态执行监控。您能够通过工作的管制表以及Amazon CloudWatch服务进行这项操作。您能够通过Amazon治理控制台、Amazon命令行界面(Amazon CLI)或者Amazon DMS API监控工作进度、理论应用的资源与网络连接。
您通常应用多个工作执行迁徙。这些工作之间彼此独立,可能同时运行,而复制工作的数量则依据理论场景而有所区别。当面对大量同时进行的复制工作时,靠人工去监控每项工作的进度无疑是一项既干燥、又容易出错的工作。
想要理解更多亚马逊云科技最新技术公布和实际翻新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~
在本文中,咱们为您提供一套应用Amazon CloudFormation模板的自动化解决方案。此解决方案蕴含以下步骤:
- 为复制工作创立一个CloudWatch告警。
- 创立Amazon DMS事件订阅。
- 配置Amazon Simple Notification Service (Amazon SNS),将工作的CloudWatch日志中发现的谬误告诉给您。
- 创立一个Amazon Lambda函数,发送SNS告诉以重现CloudWatch告警。
- Amazon Simple Notification Service
http://aws.amazon.com/sns
前提条件
在开始之前,您必须领有以下资源:
- Amazon DMS源与指标端点
- 一个 Amazon DMS复制实例
- 启用日志记录的Amazon DMS复制工作(对于具体阐明,请参阅应用Amzon DMS创立继续复制工作)
- 一个 SNS主题
- 应用Amzon DMS创立继续复制工作
https://docs.aws.amazon.com/d...
在具备以上先决条件之后,大家即可开始主动执行复制工作监控。
用于Amazon DMS复制工作的CloudWatch告警
对工作状态进行监控的首选办法,就是为复制工作创立CloudWatch告警。因为只有复制工作的指标产生扭转,告警就会被立刻触发。
咱们建议您为以下DMS指标设置告警:
- CDCLatencySource
- CDCLatencyTarget
- CDCChangesDiskSource
- CDCChangesDiskTarget
对于Amazon DMS指标的更多详细信息,请参阅Amazon Database Migration Service 指标。
- Amazon Database Migration Service 指标
https://docs.aws.amazon.com/d...
CDCLatencySource
CDCLatencySource是指从源终端节点中捕捉的最初一个事件与 Amazon DMS实例的以后零碎工夫戳之间的距离 (秒)。如果因为工作范畴限度起因而没有从源终端节点处捕捉到任何变更,则Amazon DMS将此值设置为零。
在复制期间,Amazon DMS会从源数据库事务日志中读取变更。
依据源数据库的理论引擎,源事务日志可能蕴含未提交的数据。在复制进行期间,Amazon DMS会从事务日志中读取传入的变更,但仅将曾经提交的变更转发至指标,这最终将引发源数据库发送提早。
CDCLatencyTarget
CDCLatencyTarget是指在指标上期待提交的第一个事件工夫戳与Amazon DMS 实例的以后零碎工夫戳之间的距离(秒)。如果存在指标没有解决的事务,则会产生此值。如果所有事务都失去及时处理,则指标提早将与源提早雷同。指标提早不应低于源提早。
指标提早之所以高于源提早,是因为前者代表的是从源数据库中的插入工夫、直到对应行产生提交为止的以后记录的总提早时长。
CDCChangesDiskSource
CDCChangesDiskSource是指在磁盘上累积并期待从源处进行理论提交的总行数。
CDCChangesDiskSource当中的所有行都已经处于内存内,只是因为达到了容许驻留在内存内的最长工夫阈值而被逐出保留在磁盘上了。咱们的指标是理解引擎的内部结构,并应用工作设置将CDCChangesDiskSource的值最小化。例如咱们能够尝试设置MemoryLimitTotal与MemoryKeepTime的值来达到目标。如果须要理解更多详细信息,请参阅调试Amazon DMS迁徙:呈现问题时应采取的各项措施(第二局部)。
- 调试Amazon DMS迁徙:呈现问题时应采取的各项措施(第二局部)
https://aws.amazon.com/blogs/...
CDCChangesDiskTarget
CDCChangesDiskTarget是指在磁盘上累积并期待被提交至指标的总行数。
咱们应尽量确保在内存内解决这些行。如果CDCChangesDiskTarget的值一直减少,则可能代表呈现了两个问题:复制实例上的内存可能被适度应用;或者指标数据库实例曾经无奈同步接管Amazon DMS发送来的变更。
创立CloudWatch告警
以下CloudFormation堆栈将为您的Amazon DMS工作创立CloudWatch警报:
https://console.aws.amazon.co...
向CloudFormation堆栈提供以下信息:
- 栈名称
- Amazon DMS工作标识符
- Amazon DMS复制实例名称
- SNS主题ARN
其余所有设置皆可保留为默认值。
创立Amazon DMS事件订阅
当复制工作或复制实例产生特定事件时(例如创立或删除实例时),您能够通过创立的Amazon DMS事件订阅接管到相应告诉。
对于复制工作,请为以下事件创立订阅:
- 配置变更
- 创立
- 删除
- 失败
- 状态变更
对于复制实例,请为以下事件创立订阅:
- 配置变更
- 创立
- 删除
- 故障转移
- 失败
- 低存储容量
- 保护
创立事件订阅后,Amazon DMS会将事件告诉发送至您所提供的指标地址处。您可能心愿创立多个不同的订阅,例如由一个订阅接管所有事件告诉,再由另一订阅解决仅波及生产环境Amazon DMS资源的要害事件。
您能够通过在Amazon DMS控制台将Enabled选项设置为No,或者应用Amazon DMS API将Enabled参数设置为false来轻松敞开告诉但又持续保留订阅。对于更多详细信息,请参阅在Amazon数据库迁徙服务中应用事件与告诉。
- 在Amazon数据库迁徙服务中应用事件与告诉
https://docs.aws.amazon.com/d...
以下CloudFormation堆栈,将为您的Amazon DMS工作创立事件订阅:
https://console.aws.amazon.co...
须要为堆栈提供以下信息:
- 堆栈名称
- Amazon DMS工作名称
- SNS主题ARN
其余所有设置皆可保留为默认值。
为CloudWatch日志中的谬误音讯创立SNS告诉
Amazon DMS能够将具体工作信息公布至CloudWatch 日志。您能够利用这一点来在工作运行的时候监控其运行状况并且诊断产生的任何问题
在默认状况下,日志将被存储在日志组dms-tasks-的dms-task-日志流当中。对于更多详细信息,请参阅对工作设置进行日志记录。
- 对工作设置进行日志记录
https://docs.aws.amazon.com/d...
要获取对于CloudWatch日志中呈现谬误音讯的告诉,请在日志组上创立订阅过滤器,具体参阅以下Python脚本:
from __future__ import print_functionimport jsonimport base64, zlibimport boto3import osdef logstream_handler(event, context): bstream_data = event.get("awslogs").get("data") decoded_data = json.loads(zlib.decompress(base64.b64decode(bstream_data),16 + zlib.MAX_WBITS)) client = boto3.client('sns') subscriptionFilters = decoded_data.get("subscriptionFilters") subject = "" if subscriptionFilters: subject = "Log Filter Alert : {0}".format(subscriptionFilters[0]) decoded_msg = decoded_data.get("logEvents") msg = "logGroup : {0}\nlogStream : {1}".format( decoded_data.get("logGroup"), decoded_data.get("logStream")) msg = "{0}\n\nMessages: \n".format(msg) for m in decoded_msg: msg = "{0}\n{1}".format(msg,m.get("message")) topicARN=os.environ.get("topicARN") args = {} args["TargetArn"]=topicARN args["Message"]=msg if subject: args["Subject"]=subject response = client.publish(**args) return { "statusCode": 200, "body": json.dumps('Sent Message.') }
以下CloudFormation堆栈可创立用于发送SNS谬误日志告诉的环境:
https://console.aws.amazon.co...
为堆栈提供以下信息:
- 堆栈名称
- 日志组名称
- SNS主题ARN
- 过滤模式
其余所有设置皆可保留为默认值。
创立Lambda函数,为反复呈现的CloudWatch告警发送SNS告诉
您能够创立多个CloudWatch告警,借此理解告警状态何时产生变更。在某些状况下,告警可能长时间处于沉闷状态,导致您可能错过此前已发送的告警。要获取反复告警,咱们为您提供一个Lambda函数,用于查看告警的状态以及以后状态的持续时间,并据此发送告诉。
以下能够发送SNS告诉的Python脚本将由CloudWatch Events规定调用:
import jsonimport boto3import oscloudwatch = boto3.client('cloudwatch')sns = boto3.client('sns')subject_str = '{}: "{}" in {}'message_str = """You are receiving this email because your Amazon CloudWatch Alarm "{}" in the {} region has entered the {} state, because "{}".Alarm Details : - Name: {} - Description: {} - Reason for State Change: {}Monitored Metric: - MetricNamespace: {} - MetricName: {} - Dimensions: {} - Period: {} - Statistic: {} - Unit: {} - TreatMissingData: {}"""def send_alarm(topic, subject, message): """ Sends SNS Notification to given topic """ response = sns.publish( TopicArn=topic, Message=message, Subject=subject ) print("Alarm Sent Subject : {}".format(subject)) returndef main_handler(event, context): """ Describes existing alarms in current region and check it's state If state matches to alarmState that sent as input send alarm. Parameters ---------- alarmNames - ['string'] alarmState - string (Alarm/OK/INSUFFICIENT_DATA) """ alarm_names = event['alarmNames'] alarm_state = event.get('alarmState', 'Alarm').lower() region = os.environ["AWS_REGION"] response = cloudwatch.describe_alarms( AlarmNames=alarm_names ) metric_alarms = response["MetricAlarms"] if len(metric_alarms) == 0: return { 'statusCode': 200, 'body': json.dumps('No Alarms Configured') } for alarm in metric_alarms: if alarm["StateValue"].lower() != alarm_state: continue topics = alarm["AlarmActions"] if alarm_state == 'alarm' else alarm["OKActions"] if alarm_state == 'ok' else alarm['InsufficientDataActions'] if alarm_state == 'insufficient_data' else [] if len(topics) == 0: print('No Topics Configured for state %s to %s' %(alarm_state, alarm['AlarmName'])) continue subject = subject_str.format(alarm["StateValue"], alarm['AlarmName'], region) message = message_str.format(alarm['AlarmName'], region, alarm['StateValue'], alarm['StateReason'], alarm['AlarmName'], alarm['AlarmDescription'], alarm['StateReason'], alarm['Namespace'], alarm['MetricName'], str(["{}={}".format(d['Name'], d['Value']) for d in alarm["Dimensions"]]), alarm['Period'], alarm['Statistic'], alarm.get('Unit', 'not specified'), alarm['TreatMissingData']) for topic in topics: send_alarm(topic, subject, message) return { 'statusCode': 200, 'body': json.dumps('Success') }Python
以下CloudFormation堆栈可创立用于发送SNS谬误日志音讯告诉的环境:
https://console.aws.amazon.co...
向堆栈提供以下信息:
- 堆栈名称
- Amazon DMS工作名称
- SNS主题ARN
其余所有设置皆可保留为默认值。
总结
在本文中,咱们向您介绍了如何应用CloudWatch、Amazon DMS事件订阅、Amazon SNS以及Amazon Lambda以自动化形式对Amazon DMS复制工作进行监控与告警。
应用这套解决方案,您无需应用控制台即可轻松跟踪复制工作的状态。零碎会向您通报每个变更事件;如果产生谬误,您还会收到相应的告警。
心愿本文可能帮忙大家理解如何监控Amazon DMS数据库迁徙过程.
本篇作者
**Venkata Naveen Koppula
**
亚马逊云科技
业余服务助理参谋
他专一于Aamzon DMS、SCT以及Aurora PostgreSQL等我的项目,致力于为客户提供最佳体验。
Vijaya Diddi
亚马逊云科技
业余服务助理参谋
她专一于Amazon DMS、SCT、Amazon Config以及SSM Documents。她乐于应用Python语言开发自动化工具,借此大大降低迁徙工作的施行难度。