Как сделать резервную копию базы данных Firebase Realtime чаще, чем раз в 24 часа? - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь найти решение для этой проблемы уже пару дней. Я хочу делать резервные копии своих данных из базы данных в реальном времени чаще, чем то, что предоставляет Firebase, т.е. раз в 24 часа. Я сделал то же самое с моим FireStore, развернул приложение и задание cron для резервного копирования каждые 8 ​​часов и сохранения этого в моем хранилище GS. Но я не смог найти ничего похожего для базы данных в реальном времени.

Вот что я попробовал -

Я использую функции Firebase здесь (я добавлю работу cron позже) , Что я делаю, так это выбираю каждого дочернего узла моего root базы данных и заархивирую его с помощью zlib. Вот как выглядит мой код -

const functions = require('firebase-functions');
const admin = require("firebase-admin");
const cors = require('cors')({origin: true});
const zlib = require('zlib');

exports.backup = functions.https.onRequest((request, response) => {

cors(request, response, async () => {
    const db = admin.database();
    const ref_deb = db.ref("/");
    ref_deb.once('value').then(function (snapshot) {
        console.log("Database value " + snapshot.val());
        let jsonFileContent = snapshot.val();
        if (jsonFileContent != null) {
            //console.log(io);
            console.log("getCompressedJSONFile function started", jsonFileContent);
            let bufferObject = new Buffer.from(JSON.stringify(jsonFileContent));
            zlib.gzip(bufferObject, function (err, zippedData) {
                if (err) {
                    console.log("error in gzip compression using zlib module", err);
                    response.send("Error").status(500);
                } else {
                    console.log("zippedData", zippedData);
                    response.send(zippedData).status(200);
                }
            })
        } else {
            response.send("Error").status(500)
        }
    }, function (error) {
        console.error(error);
    });
});
});

Я получаю ответ (явно закодированный и не читаемый) enter image description here

Теперь я хочу загрузить его в мое ведро GS . Как я могу это сделать? Можно ли сделать это, передав zippedContents из zlib без создания файла? Будем благодарны за любую помощь.

В моей базе данных меньше 0,5 МБ несжатого файла, поэтому резервное копирование всего сразу не должно быть проблемой.

1 Ответ

0 голосов
/ 30 марта 2020

В вашем вопросе много вопросов.

Во-первых, вы не можете вручную запустить резервное копирование, как вы можете сделать это в Firestore (Firebase).

Затем вы можете осуществлять потоковую передачу напрямую ваш файл из вашей функции в хранилище, но я не рекомендую его. Действительно, при потоковой передаче данных нет CR C, и, если проблема возникает в вашем ZIP-файле, весь файл поврежден, и вы не можете восстановить данные

Если ваш файл небольшой, Я рекомендую вам сохранить его в каталоге /tmp, записываемой файловой системе в памяти (tmpfs), а затем скопировать файл в корзину.

...