Skip to content

Instantly share code, notes, and snippets.

@cagerton
Created January 27, 2020 03:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cagerton/9856091d236fd886989025b964a609c8 to your computer and use it in GitHub Desktop.
Save cagerton/9856091d236fd886989025b964a609c8 to your computer and use it in GitHub Desktop.
Redis cluster demo example
import {spawn} from 'child_process';
import fs from 'fs';
import os from 'os';
function mkConfigs(port: number) {
return `
bind 127.0.0.1
port ${port}
cluster-enabled yes
cluster-config-file nodes-${port}.conf
cluster-node-timeout 5000
`;
}
async function runCluster(ports: [number, number, number]) {
const baseDir = fs.mkdtempSync(`${os.tmpdir()}/redis-cluster-`);
const procs = ports.map(port => {
const configFile = `${baseDir}/config-${port}`;
fs.writeFileSync(configFile, mkConfigs(port));
return spawn('redis-server', [configFile], {cwd: baseDir});
});
const createArgs = ['--cluster', 'create', ...ports.map(port => `127.0.0.1:${port}`)];
const cli = spawn('redis-cli', createArgs, {stdio: 'pipe'});
cli.stdin.write('yes\n');
const res = await new Promise(r => cli.once('exit', r));
if (res !== 0)
throw new Error(`Unable to start a new cluster. Exit code: ${res}`);
console.log(`Started cluster on ${ports.join(', ')}`);
return procs;
}
async function script() {
const yargs = await import('yargs');
const {argv} = yargs
.demandOption('yolo')
.option('port', {
alias: ['p', 'ports'],
default: [6380, 6381, 6382],
number: true,
array: true,
})
.help();
const procs = await runCluster(argv.ports);
const serverDidExit = Promise.race(procs.map(p => new Promise(r => p.once('exit', r))));
return Promise.race([
serverDidExit.then(code => console.log('At least one redis server exited with code', code)),
new Promise(r => process.once('SIGINT', r))
]);
}
if (require.main === module)
script().then(() => {
console.log('Done. Exiting.');
process.exit(0);
}, err => {
console.error('Encountered Error:', err);
process.exit(1);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment