Para admitir la recuperación de objetos que se borran o reemplazan, Cloud Storage ofrece la función de control de versiones de objetos. En esta página, se describe la función y las opciones disponibles cuando se usa.
El control de versiones de los objetos conserva una versión de objeto no actual cuando se reemplaza o borra la versión del objeto activo. Habilitar el control de versiones de objetos aumenta el costo de almacenamiento; esto puede mitigarse de forma parcial si configuras la administración del ciclo de vida de los objetos para borrar versiones de objetos anteriores.
Introducción
Habilita el control de versiones de objetos para un depósito. Una vez que se habilita, sucede lo siguiente:
Cloud Storage retiene una versión de objeto no actual cada vez que realizas un reemplazo o borras una versión publicada de un objeto, siempre que no especifiques el número de generación de la versión publicada.
Las versiones no actuales conservan el nombre del objeto, pero se identifican de forma exclusiva por su número de generación.
Las versiones no actuales solo aparecen en las solicitudes que piden de forma explícita que se incluyan versiones de objetos.
Puedes borrar versiones de objetos de forma permanente si incluyes el número de generación en la solicitud de eliminación o usas la Administración del ciclo de vida de los objetos.
Las versiones no actuales de objetos no dependen de las versiones publicadas.
Puedes activar o desactivar el control de versiones de un bucket en cualquier momento. Si lo desactivas, las versiones de objetos existentes se quedan en su lugar, y el bucket deja de acumular nuevas versiones no actuales de objetos.
Detalles del control de versiones de objetos
En Cloud Storage se usan dos propiedades que juntas identifican la versión de un objeto. Una propiedad identifica la versión de los datos del objeto y la otra identifica la versión de sus metadatos. Estas propiedades siempre están presentes en todas las versiones del objeto, incluso si el control de versiones de objetos no está habilitado. Estas propiedades se pueden usar como condiciones previas de actualizaciones condicionales para aplicar el pedido de actualizaciones.
En Cloud Storage se marcan todos los objetos con las siguientes propiedades:
Propiedad | Descripción |
---|---|
generation |
Identifica la generación del contenido (datos) y se actualiza cuando se reemplaza el contenido de un objeto. No existe una relación entre los números de generación de objetos no relacionados, incluso si los objetos están en el mismo bucket. |
metageneration |
Identifica la generación de metadatos y aumenta cada vez que se actualizan los metadatos para una determinada generación de contenido. metageneration se restablece a 1 para cada generation nuevo de un objeto. La propiedad metageneration no tiene sentido sin la propiedad generation y debe usarse solo junto con ella. En otras palabras, no tiene sentido comparar las generaciones de metadatos de dos versiones que tienen diferentes generaciones de datos. |
El control de versiones de los objetos no se puede habilitar en un depósito que actualmente tenga una política de retención.
Metadatos de objetos no actuales
Las versiones no actuales de objetos tienen sus propios metadatos, que pueden diferir de los metadatos de la versión publicada. Lo más importante es que una versión no actual conserva sus LCA y no siempre tiene los mismos permisos que la versión publicada.
Cada versión, ya sea publicada o no actual, tiene un conjunto de metadatos. Solo el último número de metageneración se refiere a los metadatos. Los números de metageneración anteriores no se pueden usar para acceder a los metadatos que se cambiaron desde entonces.
Puedes actualizar los metadatos para una versión no actual de un objeto si especificas su generation
en tu solicitud. Para garantizar una semántica de lectura, modificación y escritura segura, puedes usar una condición previa de coincidencia de metageneración. El uso de esta condición previa hace que la actualización falle si los metadatos que quieres actualizar se cambiaron entre el momento en que los leíste y que enviaste la actualización.
Ejemplo de control de versiones de los objetos
En este ejemplo, se muestra lo que sucede con el archivo cat.jpg
en un depósito con el control de versiones de objetos habilitado a medida que reemplazas, actualizas y borras el archivo.
- Sube una imagen nueva
La primera vez que subes
cat.jpg
a Cloud Storage, recibe un númerogeneration
y un númerometageneration
. En este ejemplo, el número de generación es1360887697105000
. Como el objeto es nuevo, el númerometageneration
es1
.cat.jpg
recibe los númerosgeneration
ymetageneration
aunque el control de versiones de objetos no esté habilitado. Puedes ver estos números con el comandostat
en gsutil. Para obtener instrucciones, consulta Visualiza los metadatos de objetos.- Habilitas el control de versiones de objetos
En este punto, decides habilitar el control de versiones de objetos para tu depósito. Esto no afecta los números de
generation
ometageneration
decat.jpg
.- Cambia los metadatos de la imagen
Actualizas los metadatos para
cat.jpg
mediante el agregado de metadatos personalizados:color:black
. La actualización de metadatos hace que aumente el valormetageneration
decat.jpg
, en este caso de1
a2
. Sin embargo, el objeto en sí permanece sin cambios, por lo que Cloud Storage continúa almacenando solo una versión decat.jpg
, y la versión sigue teniendo un número degeneration
de1360887697105000
.- Sube una versión nueva de la imagen
Subes una versión nueva de
cat.jpg
a tu depósito de Cloud Storage. Cuando lo haces, el control de versiones del objeto pasa el objetocat.jpg
existente a un estado no actual. La versión no actual conserva la misma clase de almacenamiento y metadatos que tenía antes. La versión no actual aparece solo si realizas una lista con versión: no aparece en los comandos de lista normales. Ahora se hace referencia a la versión no actual como:cat.jpg#1360887697105000
.Mientras tanto, el
cat.jpg
que se acaba de subir se convierte en la versión publicada del objeto. Estecat.jpg
nuevo obtiene su propio númerogeneration
, en este ejemplo:1360887759327000
. También obtiene sus propios metadatos y un númerometageneration
de1
, lo que significa que no contiene los metadatoscolor:black
, a menos que lo especifiques. Cuando accedes acat.jpg,
o lo modificas, esta es la versión que se usa. Como alternativa, puedes consultar esta versión decat.jpg
con su númerogeneration
. Por ejemplo, cuando usas la herramienta de gsutil, deberías referirte a ella comocat.jpg#1360887759327000
.- Borra la versión publicada de la imagen
Borra
cat.jpg
. Cuando lo haces, la versión que tenía el número de generación1360887759327000
se convierte en no actual. Tu depósito contiene dos versiones no actuales decat.jpg
y ninguna versión publicada. Aún puedes hacer referencia a cualquiera de las versiones no actuales con su númerogeneration
, pero falla si intentas acceder acat.jpg
sin un númerogeneration
.Del mismo modo, una lista de objetos normal del depósito no mostrará
cat.jpg
como uno de los objetos en el depósito. Para obtener información sobre cómo enumerar las versiones no actuales de objetos, consulta Enumera las versiones no actuales de objetos.- Inhabilita el control de versiones
Inhabilitas el control de versiones de objetos, que evita que los objetos se conviertan en no actuales. Las versiones no actuales de objetos existentes permanecen en Cloud Storage. Aunque el control de versiones de objetos está inhabilitado,
cat.jpg#1360887697105000
ycat.jpg#1360887759327000
permanecen almacenados en el depósito hasta que los borres, ya sea de forma manual o mediante la Administración del ciclo de vida de los objetos.- Restablece una de las versiones no actuales
Incluso con el control de versiones de objetos inhabilitado, puedes restablecer una de las versiones no actuales existentes si haces una copia de esta. Para hacerlo, asigna a la copia el nombre
cat.jpg
. Una vez que haces esto, el depósito tiene tres versiones decat.jpg
: las dos versiones no actuales y la versión publicada que se generó cuando se hizo la copia.
Referencia del control de versiones de objetos
En esta tabla de referencia, se muestra lo que sucede cuando realizas ciertas acciones con el control de versiones de objetos.
Estado del control de versiones de objetos | Acción | Resultado |
---|---|---|
Inhabilitado | ||
Reemplaza dog.png por una versión nueva. |
La versión nueva reemplaza a la publicada y recibe un número de generación nuevo. La versión publicada antigua se borra de forma permanente. | |
Copiar una versión no actual de dog.png que reemplace a la versión publicada.1 |
Una copia de la versión no actual reemplaza a la publicada y recibe un número de generación nuevo. La versión publicada antigua se borra de forma permanente. | |
Borrar dog.png . |
dog.png se borra de forma permanente. |
|
Borrar una versión no actual de dog.png mediante la especificación de su número de generación.1 |
La versión no actual se borra de forma permanente. | |
Habilitado | ||
Reemplaza dog.png por una versión nueva. |
La versión nueva reemplaza a la publicada y recibe un número de generación nuevo. La versión publicada antigua se convierte en una no actual y conserva el mismo número de generación. | |
Copiar una versión no actual de dog.png que reemplace a la publicada. |
Una copia de la versión no actual reemplaza a la publicada y recibe un número de generación nuevo. La versión publicada antigua se convierte en una no actual y conserva el mismo número de generación. | |
Borrar la versión publicada de dog.png sin especificar su número de generación. |
La versión publicada se convierte en una no actual y conserva el mismo número de generación. | |
Borrar la versión publicada de dog.png mediante la especificación de su número de generación. |
La versión publicada se borra de forma permanente. | |
Borrar una versión no actual de dog.png mediante la especificación de su número de generación. |
La versión no actual se borra de forma permanente. |
1 Es posible que exista una versión no actual si el depósito tenía habilitado el control de versiones de objetos.
Sugerencias
En esta sección, se analizan sugerencias para ayudarte a trabajar con el control de versiones de objetos de manera más efectiva.
Usa gsutil
- La herramienta gsutil tiene asistencia integral para trabajar con objetos con versión, lo que facilita muchas tareas que involucran al control de versiones de objetos. Por ejemplo, puedes trabajar con versiones no actuales de objetos si agregas
#
y el número degeneration
al nombre del objeto. Para obtener más información sobre el uso de gsutil con el control de versiones de objetos, consulta Control de versiones de objetos y control de simultaneidad.
Evita usar ETags
- Considera usar los números de
generation
ymetageneration
para las actualizaciones condicionales en lugar de ETags. Los números degeneration
ymetageneration
realizan un seguimiento de todas las actualizaciones de objetos, incluidos los cambios de metadatos, lo que proporciona una garantía más sólida que las ETags.
Comprende cómo se restablecen los archivos
Puedes copiar una versión no actual de objeto en la versión publicada actual. Consulta Copia las versiones de objetos no actuales a fin de obtener una guía paso a paso para copiar versiones no actuales de objetos.
Cuando haces esto con el control de versiones de objetos habilitado, si ya existe una versión publicada del objeto en el bucket, Cloud Storage reemplaza la versión publicada existente, pero también la conserva como una nueva versión no actual. En ese caso, el bucket contendrá el objeto reemplazado (ahora no actual) y dos copias del objeto que antes era no actual (una copia publicada y otra aún no actual) y todos incurren en cargos de almacenamiento. Con el fin de evitar cargos innecesarios, borra la versión no actual que usaste para hacer la copia publicada actual.
Usa las condiciones previas de coincidencia de generación cuando hagas mutaciones de versiones publicadas de objetos
Cuando usas números de generación, las solicitudes se realizan de forma correcta, siempre y cuando haya un objeto con ese nombre y número de generación, sin importar si está publicado o no es actual. Si no existe tal objeto, se muestra
404 Not Found
en Cloud Storage.Cuando uses condiciones previas de coincidencia de generación, solo se realiza una solicitud correctamente si la versión publicada del objeto tiene especificado el número de generación. Si no existe ese objeto o no es actual, Cloud Storage muestra
412 Precondition Failed
.Debes evitar usar una condición previa de coincidencia de generación al mismo tiempo que un número de generación en el nombre del objeto. Si usas ambos y los números coinciden, es redundante usar la condición previa. Si los números no coinciden, la solicitud siempre falla.
Si realizas varias solicitudes de mutación simultáneas con una condición previa de coincidencia de generación, la coherencia sólida de Cloud Storage permite que solo una de esas solicitudes sea correcta. Esta característica resulta útil si los objetos se actualizan desde varias fuentes y necesitas asegurarte de que los usuarios no los reemplacen por accidente.
Si estableces una condición previa de coincidencia de generación en
0
cuando subes un objeto, se realiza la solicitud especificada en Cloud Storage solo si no hay una versión publicada del objeto. Por ejemplo, si realizas una solicitudPUT
con la API de XML para crear un objeto nuevo con el encabezadox-goog-if-generation-match:0
, la solicitud se realiza de forma correcta si el objeto no existe o si solo hay versiones no actuales del objeto. Si hay una versión publicada del objeto, se anula la actualización en Cloud Storage con un código de estado de412 Precondition Failed
.
¿Qué sigue?
- Obtén más información sobre cómo usar el control de versiones de objetos.
- Obtén información sobre la Administración del ciclo de vida de los objetos, que te permite administrar automáticamente las versiones de los objetos.