amazon s3 - Backup AWS Dynamodb a S3
amazon-s3 amazon-dynamodb (8)
Se ha sugerido en los documentos de Amazon http://aws.amazon.com/dynamodb/ entre otros lugares, que puede hacer una copia de seguridad de sus tablas de dynamodb usando Elastic Map Reduce,
Tengo una comprensión general de cómo podría funcionar esto, pero no pude encontrar guías o tutoriales sobre esto,
Entonces mi pregunta es ¿cómo puedo automatizar las copias de seguridad de dynamodb (usando EMR)?
Hasta ahora, creo que necesito crear un trabajo de "transmisión" con una función de mapa que lea los datos de dynamodb y un reductor que lo escriba en S3 y creo que estos podrían estar escritos en Python (o Java o algunos otros idiomas) .
Cualquier comentario, aclaración, ejemplos de código, correcciones son apreciadas.
AWS Data Pipeline es costoso y la complejidad de administrar un proceso de plantilla no se puede comparar con la simplicidad de un comando de CLI que puede realizar y ejecutar en un cronograma (utilizando cron
, Teamcity o su herramienta de CI elegida)
Amazon promueve Data Pipeline a medida que obtienen ganancias. Diría que solo tiene sentido si tienes una base de datos muy grande (> 3 GB), ya que la mejora del rendimiento lo justificará.
Para bases de datos pequeñas y medianas (1GB o menos), le recomendaría que use una de las muchas herramientas disponibles, las tres siguientes pueden manejar procesos de copia de seguridad y restauración desde la línea de comando:
- dynamo-backup-to-s3 ==> Streaming restore a S3, utilizando NodeJS / npm
- SEEK-Jobs dynamotools ==> Streaming restore a S3, usando Golang
- dynamodump ==> Copia de seguridad / restauración local usando python, carga / descarga S3 usando
aws s3 cp
Tenga en cuenta que debido a problemas de ancho de banda / latencia, estos siempre tendrán un mejor rendimiento desde una instancia EC2 que su red local.
Aws Data Pipeline tiene regiones límite.
Me llevó 2 horas depurar la plantilla.
https://docs.aws.amazon.com/general/latest/gr/rande.html#datapipeline_region
Con la introducción de AWS Data Pipeline, con una plantilla ya preparada para la copia de seguridad de dynamodb a S3, la forma más fácil es programar una copia de seguridad en Data Pipeline [link] ,
En caso de que tenga necesidades especiales (transformación de datos, control de grano muy fino ...) considere la respuesta de @greg
Con la presentación de DynamoDB Streams y Lambda, debería poder realizar copias de seguridad y copias de seguridad incrementales de sus datos de DynamoDB.
Puede asociar su DynamoDB Stream con una función Lambda para activar automáticamente el código de cada actualización de datos (es decir, datos a otra tienda como S3)
Una función lambda que puede usar para vincularse con DynamoDb para copias de seguridad incrementales:
https://github.com/PageUpPeopleOrg/dynamodb-replicator
Le proporcioné una explicación detallada sobre cómo puede usar las divisiones DynamoDB Streams, Lambda y S3 para crear copias de seguridad incrementales para sus datos en DynamoDb en mi blog:
https://www.abhayachauhan.com/category/aws/dynamodb/dynamodb-backups
Editar:
A partir de diciembre de 2017, DynamoDB ha lanzado copias de seguridad / restauraciones bajo demanda. Esto le permite tomar copias de seguridad y almacenarlas de forma nativa en DynamoDB. Se pueden restaurar a una nueva tabla. Aquí se proporciona un recorrido detallado, que incluye un código para programarlos:
https://www.abhayachauhan.com/2017/12/dynamodb-scheduling-on-demand-backups
HTH
Encontré que la función lambda de dynamodb-backup es realmente útil. Me tomó 5 minutos configurarlo y puede configurarse fácilmente para usar un evento de Programa de vigilancia en la nube (sin npm install
no se olvide de ejecutar la npm install
al principio).
También es mucho más barato para mí, proveniente de Data Pipeline (~ $ 40 por mes), estimo que los costos sean de alrededor de 1.5 centavos por mes (ambos sin almacenamiento S3). Tenga en cuenta que realiza una copia de seguridad de todas las tablas de DynamoDB a la vez de forma predeterminada, lo que se puede ajustar fácilmente dentro del código.
La única parte faltante debe notificarse si la función falla, lo que Data Pipeline pudo hacer.
Hay algunas buenas guías para trabajar con MapReduce y DynamoDB. Seguí this el otro día y conseguí que la exportación de datos a S3 fuera razonablemente sencilla. Creo que su mejor opción sería crear un script de hive que realice la tarea de respaldo, guardarlo en un depósito de S3, luego usar la API de AWS para su lenguaje para generar un nuevo flujo de trabajo de EMR pragmáticamente y completar la copia de seguridad. Puede configurar esto como un trabajo cron.
Ejemplo de script de una colmena que exporta datos de Dynamo a S3:
CREATE EXTERNAL TABLE my_table_dynamodb (
company_id string
,id string
,name string
,city string
,state string
,postal_code string)
STORED BY ''org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler''
TBLPROPERTIES ("dynamodb.table.name"="my_table","dynamodb.column.mapping" = "id:id,name:name,city:city,state:state,postal_code:postal_code");
CREATE EXTERNAL TABLE my_table_s3 (
,id string
,name string
,city string
,state string
,postal_code string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '',''
LOCATION ''s3://yourBucket/backup_path/dynamo/my_table'';
INSERT OVERWRITE TABLE my_table_s3
SELECT * from my_table_dynamodb;
Aquí hay un ejemplo de un script PHP que generará un nuevo flujo de trabajo de EMR:
$emr = new AmazonEMR();
$response = $emr->run_job_flow(
''My Test Job'',
array(
"TerminationProtected" => "false",
"HadoopVersion" => "0.20.205",
"Ec2KeyName" => "my-key",
"KeepJobFlowAliveWhenNoSteps" => "false",
"InstanceGroups" => array(
array(
"Name" => "Master Instance Group",
"Market" => "ON_DEMAND",
"InstanceType" => "m1.small",
"InstanceCount" => 1,
"InstanceRole" => "MASTER",
),
array(
"Name" => "Core Instance Group",
"Market" => "ON_DEMAND",
"InstanceType" => "m1.small",
"InstanceCount" => 1,
"InstanceRole" => "CORE",
),
),
),
array(
"Name" => "My Test Job",
"AmiVersion" => "latest",
"Steps" => array(
array(
"HadoopJarStep" => array(
"Args" => array(
"s3://us-east-1.elasticmapreduce/libs/hive/hive-script",
"--base-path",
"s3://us-east-1.elasticmapreduce/libs/hive/",
"--install-hive",
"--hive-versions",
"0.7.1.3",
),
"Jar" => "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
),
"Name" => "Setup Hive",
"ActionOnFailure" => "TERMINATE_JOB_FLOW",
),
array(
"HadoopJarStep" => array(
"Args" => array(
"s3://us-east-1.elasticmapreduce/libs/hive/hive-script",
"--base-path",
"s3://us-east-1.elasticmapreduce/libs/hive/",
"--hive-versions",
"0.7.1.3",
"--run-hive-script",
"--args",
"-f",
"s3n://myBucket/hive_scripts/hive_script.hql",
"-d",
"INPUT=Var_Value1",
"-d",
"LIB=Var_Value2",
"-d",
"OUTPUT=Var_Value3",
),
"Jar" => "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
),
"Name" => "Run Hive Script",
"ActionOnFailure" => "CANCEL_AND_WAIT",
),
),
"LogUri" => "s3n://myBucket/logs",
)
);
}
Puede usar mi script simple node.js dynamo dynamo-archive.js , que escanea una tabla Dynamo completa y guarda el resultado en un archivo JSON. Luego, lo sube a S3 usando s3cmd
.
Puede utilizar esta práctica herramienta dynamodump que está basada en python (usa boto ) para volcar las tablas en archivos JSON. Y luego subir a S3 con s3cmd