Мне нужно создать систему с несколькими базами данных. Одной из них является база данных master. Эта база данных должна реплицировать только структурные изменения в другие базы данных, например:
Когда я регистрирую нового пользователя в системе, система автоматически создает структурную реплику базы данных master, но эта база данных не отправляет вставленные регистры или обновления в базу данных master, только база данных master при обновлении отправляет все структурные изменения в ведомые базы данных. Поэтому мне нужно создать сценарий или реализовать инструмент для сбора обновлений базы данных, чтобы выполнять обновления на всех ведомых в режиме реального времени.
Я отправил вопрос в службу поддержки AWS, и они рекомендовали мне реализовать скрипт phyton или интегрировать другую библиотеку, которая позволяет выполнять потоковую передачу бинлога для репликации этих изменений в базы данных ведомого устройства.
Ответ поддержки AWS:
[1] https://aws.amazon.com/blogs/database/streaming-changes-in-a-database-with-amazon-kinesis/Вы можете следовать этому руководству здесь [1], вы можете пропустить часть Kinesis (сервис AWS) и сделать так, чтобы ваш код записывался непосредственно, а не помещался в поток Kinesis. Вам нужно будет включить binlog на вашем кластере БД и прослушать журнал. В зависимости от событий вы можете добавить в логику для выполнения обновлений БД на дочерних базах. Чтобы реплицировать вашу основную схему базы данных, я бы рекомендовал использовать инструмент CLI mysqldump для экспорта схемы вашей основной базы данных, прежде чем какие-либо дочерние базы данных должны будут подготовить и импортировать эту схему. Затем используйте сценарий binlog для внесения изменений в ваши дочерние базы данных в зависимости от написанной вами логики.
Я решил свою проблему интеграции Zongji в пакет npm, Zongji обнаружил изменения в binlog и перехватил выполненный запрос, я сделал скрипт, используя этот пакет, чтобы прослушать события binlog и применить эти изменения к ведомой базе данных, здесь я добавлю пример моего сценария.
Zongji хранилище: https://github.com/nevill/zongji.
var ZongJi = require('zongji');
var mysql = require('mysql');
var query;
var connection = mysql.createConnection({
host: '192.168.1.18',
port: '3310',
user: 'root',
password: 'admin'
});
var zongji = new ZongJi({
host: '192.168.1.18',
port: '3310',
user: 'root',
password: 'admin'
});
zongji.on('binlog', function(evt) {
if (evt.query != 'BEGIN') {
query = evt.query
query = query.replace(/`tuadmin`/g, '`demo`');
connection.query(query, function(error, results, fields) {
});
console.log(query);
}
});
zongji.start({
includeEvents: ['query']
});
process.on('SIGINT', function() {
console.log('Got SIGINT.');
zongji.stop();
process.exit();
});
Других решений пока нет …