乐趣区

关于data:为Amazon-DMS数据库迁移任务建立自动化监控机制

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 模板的自动化解决方案。此解决方案蕴含以下步骤:

  1. 为复制工作创立一个 CloudWatch 告警。
  2. 创立 Amazon DMS 事件订阅。
  3. 配置Amazon Simple Notification Service (Amazon SNS),将工作的 CloudWatch 日志中发现的谬误告诉给您。
  4. 创立一个 Amazon Lambda 函数,发送 SNS 告诉以重现 CloudWatch 告警。
  • Amazon Simple Notification Service 
    http://aws.amazon.com/sns

前提条件

在开始之前,您必须领有以下资源:

  1. Amazon DMS 源与指标端点
  2. 一个 Amazon DMS 复制实例
  3. 启用日志记录的 Amazon DMS 复制工作(对于具体阐明,请参阅 应用 Amzon DMS 创立继续复制工作
  4. 一个 SNS 主题
  • 应用 Amzon DMS 创立继续复制工作
    https://docs.aws.amazon.com/d…

在具备以上先决条件之后,大家即可开始主动执行复制工作监控。

用于 Amazon DMS 复制工作的 CloudWatch 告警

对工作状态进行监控的首选办法,就是为复制工作创立 CloudWatch 告警。因为只有复制工作的指标产生扭转,告警就会被立刻触发。

咱们建议您为以下 DMS 指标设置告警:

  1. CDCLatencySource
  2. CDCLatencyTarget
  3. CDCChangesDiskSource
  4. 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 堆栈提供以下信息:

  1. 栈名称
  2. Amazon DMS 工作标识符
  3. Amazon DMS 复制实例名称
  4. SNS 主题 ARN

其余所有设置皆可保留为默认值。

创立 Amazon DMS 事件订阅

当复制工作或复制实例产生特定事件时(例如创立或删除实例时),您能够通过创立的 Amazon DMS 事件订阅接管到相应告诉。

对于复制工作,请为以下事件创立订阅:

  1. 配置变更
  2. 创立
  3. 删除
  4. 失败
  5. 状态变更

对于复制实例,请为以下事件创立订阅:

  1. 配置变更
  2. 创立
  3. 删除
  4. 故障转移
  5. 失败
  6. 低存储容量
  7. 保护

创立事件订阅后,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…

须要为堆栈提供以下信息:

  1. 堆栈名称
  2. Amazon DMS 工作名称
  3. SNS 主题 ARN

其余所有设置皆可保留为默认值。

为 CloudWatch 日志中的谬误音讯创立 SNS 告诉

Amazon DMS 能够将具体工作信息公布至 CloudWatch 日志。您能够利用这一点来在工作运行的时候监控其运行状况并且诊断产生的任何问题

在默认状况下,日志将被存储在日志组 dms-tasks- 的 dms-task- 日志流当中。对于更多详细信息,请参阅 对工作设置进行日志记录

  • 对工作设置进行日志记录
    https://docs.aws.amazon.com/d…

要获取对于 CloudWatch 日志中呈现谬误音讯的告诉,请在日志组上创立订阅过滤器,具体参阅以下 Python 脚本:

from __future__ import print_function
import json
import base64, zlib
import boto3
import os

def 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…

为堆栈提供以下信息:

  1. 堆栈名称
  2. 日志组名称
  3. SNS 主题 ARN
  4. 过滤模式

其余所有设置皆可保留为默认值。

创立 Lambda 函数,为反复呈现的 CloudWatch 告警发送 SNS 告诉

您能够创立多个 CloudWatch 告警,借此理解告警状态何时产生变更。在某些状况下,告警可能长时间处于沉闷状态,导致您可能错过此前已发送的告警。要获取反复告警,咱们为您提供一个 Lambda 函数,用于查看告警的状态以及以后状态的持续时间,并据此发送告诉。

以下能够发送 SNS 告诉的 Python 脚本将由 CloudWatch Events 规定调用:

import json
import boto3
import os

cloudwatch = 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))
    return

def 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…

向堆栈提供以下信息:

  1. 堆栈名称
  2. Amazon DMS 工作名称
  3. 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 语言开发自动化工具,借此大大降低迁徙工作的施行难度。

退出移动版