larvitamsync

    0.7.4 • Public • Published

    Build Status Dependencies

    larvitamsync

    Sync data between minions

    Usage

    Server (data master)

    Simple command

    const Intercom = require('larvitamintercom'),
        winston = require('winston'),
        options = {'exchange': 'test_dataDump'}, // RabbitMQ exchange, must be unique on the queue
        amsync = require('larvitamsync'),
        log = winston.createLogger({'transports': [new winston.transports.Console()]});
     
    options.intercom = new Intercom({'conStr': 'AMQP connection string', 'log': log});
     
    // Set the log instance for the amsync server
    // This is optional, but recommended
    options.log = log;
     
    // The stdout from this command will be piped to the data slave
    // This will be be the input for the
    // https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
    options.dataDumpCmd = {
        'command': 'cat',
        'args': ['/home/myself/dbdump.sql'],
        'options': {}
    };
    // or pipe directly from mysqldump:
    options.dataDumpCmd = {
        'command': 'mysqldump',
        'args': ['-u', 'root', '-psecret', '--single-transaction', 'dbname', 'table1', 'table2'],
        'options': {}
    };
     
    // You can set range of network ports to be used.
    // By not declaring port range a random free port will be used.
    options.minPort = 5000;
    options.maxPort = 5100;
     
    new amsync.SyncServer(options, function(err) {
        if (err) throw err;
        console.log('Server active');
    });

    Custom http request handler

    On each data dump request there is a http request and this can be handled manually

    const winston = require('winston'),
        Intercom = require('larvitamintercom'),
        options = {'exchange': 'test_dataDump'}, // RabbitMQ exchange, must be unique on the queue
        amsync = require('larvitamsync'),
        log = winston.createLogger({'transports': [new winston.transports.Console()]});
     
    let syncServer;
     
    options.intercom = new Intercom({'conStr': 'AMQP connection string', 'log': log});
    options.log = log;
     
    syncServer = new amsync.SyncServer(options, function(err) {
        if (err) throw err;
     
        console.log('Server active');
    });
     
    syncServer.handleHttpReq_original = syncServer.handleHttpReq;
     
    syncServer.handleHttpReq = function(req, res) {
     
        // Set custom content type
        res.setHeader('Content-Type', 'text/plain');
     
        // Run different commands depending on request url
        if (req.url === '/') {
            syncServer.options.dataDumpCmd = {'command': 'echo', 'args': ['blergh']};
        } else {
            syncServer.options.dataDumpCmd = {'command': 'echo', 'args': [req.url]};
        }
     
        // Run the original request handler
        syncServer.handleHttpReq_original(req, res);
    }

    Client (data slave)

    For this to work, larvitamintercom must be configured and up and running!

    const Intercom = require('larvitamintercom'),
        options = {},
        amsync = require('larvitamsync');
     
    options.intercom = new Intercom('AMQP connection string');
    options.exchange = 'test_dataDump'; // RabbitMQ exchange, must be unique on the queue
    options.requestOptions = {'path': '/foobar'}; // Optional extra options to
            // https://www.npmjs.com/package/request that
            // is used to request stuff from the server
     
    new amsync.SyncClient(options, function(err, res) {
        let syncData = Buffer.from('');
     
        if (err) throw err;
     
        // res is an instance of https://nodejs.org/api/http.html#http_class_http_incomingmessage
     
        res.on('data', function(chunk) {
            syncData = Buffer.concat([syncData, chunk], syncData.length + chunk.length);
        });
     
        res.on('end', function() {
            console.log('Got sync data:');
            console.log(syncData.toString());
        });
     
        res.on('error', function(err) {
            throw err;
        });
    });

    MariaDB/MySQL

    For this to work, both larvitamintercom and larvitdb must be configured and up and running!

    const winston = require('winston'),
        Intercom = require('larvitamintercom'),
        options = {'exchange': 'test_dataDump'}, // RabbitMQ exchange, must be unique on the queue
        amsync = require('larvitamsync'),
        log = winston.createLogger({'transports': [new winston.transports.Console()]}),
        db = require('larvitdb');
     
    // See how to configure larvitdb here: https://github.com/larvit/larvitdb#larvitdb
    db.setup(someConfig);
     
    options.intercom = new Intercom('AMQP connection string');
    options.log = log;
    options.db = db;
     
    amsync.mariadb(options, function(err) {
        if (err) throw err;
        console.log('Data synced!');
    });

    Keywords

    none

    Install

    npm i larvitamsync

    DownloadsWeekly Downloads

    97

    Version

    0.7.4

    License

    ISC

    Unpacked Size

    42.7 kB

    Total Files

    16

    Last publish

    Collaborators

    • gagge
    • klabbekluck
    • lilleman