Я создал Google Cloud Compute Engine и каждую ночь выполнял резервное копирование (снимок). У меня есть вторая виртуальная машина в том же проекте, которая является клоном первой. Можно ли каждый раз обновлять второй экземпляр ВМ с помощью только что созданного снимка первого? Итак, у меня есть резервный сервер, которому в худшем случае 24 часа?
Скорее всего вам придется создать новый экземпляр из снимка, проверить работоспособность нового экземпляра и удалить второй экземпляр виртуальной машины. В gcloud sdk есть флаг для этого -
gcloud compute instances create
с участием --source-snapshot=SNAPSHOT
флаг.
Я не уверен насчет вашего случая, но кажется, что новый выпуск Образы машин GCP может быть хорошей альтернативой для рассмотрения. Он предоставляет функции, недоступные в моментальных снимках дисков, такие как резервное копирование нескольких дисков, клонирование и репликация экземпляров. Ты можешь создать экземпляр из машины изображение со всеми свойствами экземпляра, конфигурацией и данными без изменений.
Если кто-то сталкивается с той же проблемой, я написал облачную функцию и запланировал ее каждый день. Шаги следующие:
Это код для этого:
const Compute = require("@google-cloud/compute");
const axios = require("axios");
const compute = new Compute({
projectId: "myProjectID",
keyFilename: "./gcloud_key.json"
});
exports.updateFailOverVM = async (pubSubEvent, context) => {
try {
const snapshots = await compute.getSnapshots({
orderBy: "creationTimestamp desc"
});
const snapshot = snapshots[0][0];
console.log(`Going to use Snapshot: ${snapshot.name}`);
const sourceSnapshot = `https://www.googleapis.com/compute/v1/projects/myProjectID/global/snapshots/${snapshot.name}`;
const zone = compute.zone("MySelectedZone");
const vm = zone.vm("MyVMName");
// Delete old FailOver
console.log("start deleting old VM");
const [deleteOperation] = await vm.delete();
deleteOperation.on("complete", async function(metadata) {
console.log("finished deleting old VM");
// Create new VM
console.log("start creating new VM");
const [newVM, createOperation] = await vm.create({
http: false,
https: true,
machineType: "n1-standard-1",
disks: [
{
initializeParams: {
sourceSnapshot
},
sizeGb: 50,
type:
"projects/MyProjectID/zones/mySelectedZone/diskTypes/pd-standard",
boot: true
}
]
});
createOperation.on("complete", async function(metadata) {
const [newVMMeta] = await vm.getMetadata();
const newIP = newVMMeta.networkInterfaces[0].accessConfigs[0].natIP;
console.log("finished creating new VM");
// Route Cloudflare to new IP
console.log("Put new IP to Cloudflare");
await axios({
method: "patch",
url:
"https://api.cloudflare.com/client/v4/user/load_balancers/pools/MyPoolID",
data: {
origins: [
{
name: "MyPoolName",
address: newIP,
enabled: true,
weight: 1
}
]
},
headers: {
"X-Auth-Email": "MyCloudflareEmail",
"X-Auth-Key": "MyCloudflareAuthKey"
}
});
console.log("Finished putting IP to Cloudflare");
});
});
} catch (err) {
console.error(err);
}
};