Created
January 27, 2020 03:08
-
-
Save cagerton/9856091d236fd886989025b964a609c8 to your computer and use it in GitHub Desktop.
Redis cluster demo example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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