Created
June 3, 2020 11:16
-
-
Save baiwfg2/fac0a35686acdda12ce540d7313c7352 to your computer and use it in GitHub Desktop.
A script that launches a mongo cluster quickly
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
#!/bin/bash | |
set -e | |
# Script used to automate mongo cluster setup locally | |
# | |
# sirchen 2019.11.10 | |
if [ $# -lt 2 ]; then | |
echo "$0 <cmd> <bin root absolute dir>" | |
echo "You'd better choose a clean dir to execute the script, because there gonna many files generated within current working dir" | |
echo "Command execution order: start, config, addshard, stat" | |
exit 1 | |
fi | |
interval=1000 | |
cmd=$1 | |
BIN=$2 | |
engine="wiredTiger" | |
if [ x$3 != x"" ]; then | |
interval=$3 | |
fi | |
if [ x$3 = x"rocksdb" ]; then | |
engine=$3 | |
fi | |
echo_with_color() { | |
echo -e "\033[34m$1\033[0m" | |
} | |
# simple 3 mongod RS without config,mongos | |
start_debug() { | |
printf -v nodes '%s ' node{1..8} | |
rm -f 5k* | |
dbpath=db-wt | |
if [ $engine = "rocksdb" ]; then dbpath="db-rocks"; fi | |
rm -rf $dbpath | |
mkdir -p $dbpath | |
cd $dbpath | |
mkdir -p $nodes | |
cd .. | |
# how to set one log component to 5, set others to 1 | |
echo_with_color "start 8 mongod" | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node1 --port 50001 -vv --logpath 5k1.log & | |
#./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node1 --port 50000 --keyFile keyfile --logpath 50000.log | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node2 --port 50002 -vv --logpath 5k2.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node3 --port 50003 -v --logpath 5k3.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node4 --port 50004 --logpath 5k4.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node5 --port 50005 --logpath 5k5.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node6 --port 50006 --logpath 5k6.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node7 --port 50007 --logpath 5k7.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node8 --port 50008 --logpath 5k8.log & | |
sleep 5 | |
echo_with_color "rs.initiate " | |
./mongo --port 50001 --eval "rs.initiate()" | |
sleep 5 | |
echo_with_color "add 2nd node..." | |
./mongo --port 50001 --eval "rs.add(\"localhost:50002\")" | |
echo_with_color "add 3th arbiter node ..." | |
./mongo --port 50001 --eval "rs.add(\"localhost:50003\", {arbiterOnly: true})" | |
echo_with_color "add 4th node with priority=0 (votes default 1) ..." | |
./mongo --port 50001 --eval "rs.add({host: \"localhost:50004\", priority: 0})" | |
echo_with_color "add 5th node with votes=0 (non-voting member must have priority=0)..." | |
./mongo --port 50001 --eval "rs.add({host: \"localhost:50005\", votes: 0, priority: 0})" | |
echo_with_color "add 6th node with hidden(priority must be 0) and votes=1..." | |
./mongo --port 50001 --eval "rs.add({host: \"localhost:50006\", hidden: true, priority: 0})" | |
# when votes=0, cannot ack write majority | |
echo_with_color "add 7th node with hidden and votes=0..." | |
./mongo --port 50001 --eval "rs.add({host: \"localhost:50007\", hidden: true, votes: 0, priority: 0})" | |
echo_with_color "add 8th node with Delayed RS member..." | |
./mongo --port 50001 --eval "rs.add({host: \"localhost:50008\", hidden: true, slaveDelay: 10, priority: 0})" | |
echo_with_color "rs.status()" | |
./mongo --port 50001 --eval "rs.status()" | |
# to prevent from failover | |
./mongo --port 50001 --eval "cfg=rs.conf(); cfg.settings.heartbeatTimeoutSecs=3600; cfg.settings.electionTimeoutMillis=3600000; rs.reconfig(cfg)" | |
echo_with_color "enabling secondary read ..." | |
./mongo --port 50002 --eval "rs.slaveOk()" | |
} | |
# start a 3 nodes cluster locally | |
start_simple() { | |
printf -v nodes '%s ' node{1..3} | |
rm -f 5k* | |
dbpath=db-wt | |
if [ $engine = "rocksdb" ]; then dbpath="db-rocks"; fi | |
rm -rf $dbpath | |
mkdir -p $dbpath | |
cd $dbpath | |
mkdir -p $nodes | |
cd .. | |
# how to set one log component to 5, set others to 1 | |
echo_with_color "start 3 mongod" | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node1 --port 50001 --logpath 5k1.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node2 --port 50002 --logpath 5k2.log & | |
./mongod --replSet rs1 --storageEngine $engine --dbpath ./$dbpath/node3 --port 50003 --logpath 5k3.log & | |
sleep 5 | |
echo_with_color "rs.initiate " | |
./mongo --port 50001 << eof | |
rs.initiate({ _id: "rs1", version: 1, members: [ | |
{ _id:0, host: "localhost:50001" }, | |
{ _id:1, host: "localhost:50002" }, | |
{ _id:2, host: "localhost:50003" } | |
], | |
settings: { chainingAllowed: false} | |
}) | |
eof | |
sleep 5 | |
} | |
write_data() { | |
./mongo --port 50001 << eof | |
use db1 | |
for (var i=1; i<10000; i++) { | |
db.t.insert({id: i, v1: i+1, ar:[i+2,i+3]}) | |
sleep($interval) | |
db.t.remove({id:i}, { writeConcern: { w: "majority"} }) | |
} | |
eof | |
} | |
config_shard() { | |
config="{_id:"configrs",members: [ { _id:0, host:"127.0.0.1:20000" } ]}" | |
$BIN/mongo --port 20000 << eof | |
config={_id:"configrs",members: [ { _id:0, host:"127.0.0.1:20000" } ]} | |
use admin | |
rs.initiate(config) | |
eof | |
$BIN/mongo --port 30001 << eof | |
config={_id:"shard1",members: [ { _id:0, host:"127.0.0.1:30001" }, { _id:1, host:"127.0.0.1:30002" },{ _id:2, host:"127.0.0.1:30003" } ]} | |
use admin | |
rs.initiate(config) | |
eof | |
$BIN/mongo --port 40001 << eof | |
config={_id:"shard2",members: [ { _id:0, host:"127.0.0.1:40001" }, { _id:1, host:"127.0.0.1:40002" },{ _id:2, host:"127.0.0.1:40003" } ]} | |
use admin | |
rs.initiate(config) | |
eof | |
} | |
add_shard_to_mongos() { | |
$BIN/mongo --port 30000 << eof | |
use admin | |
db.runCommand({addshard: "shard1/127.0.0.1:30001,127.0.0.1:30002,127.0.0.1:30003"}) | |
db.runCommand({addshard: "shard2/127.0.0.1:40001,127.0.0.1:40002,127.0.0.1:40003"}) | |
eof | |
} | |
shard_stat_from_mongos() { | |
$BIN/mongo --port 30000 << eof | |
use admin | |
db.runCommand({listshards:1}) | |
sh.status() | |
eof | |
} | |
shard_db() { | |
if [ $# -ne 1 ]; then | |
echo "no db name" | |
exit 1 | |
fi | |
db=$1 | |
$BIN/mongo --port 30000 << eof | |
use admin | |
db.runCommand({enablesharding: "$db"}) | |
db.runCommand({shardcollection: "$db.t", key: {k: 'hashed'}}) | |
eof | |
} | |
common_commands() { | |
echo_with_color "buildinfo ..." | |
$BIN/mongo --port 30000 << eof | |
db.runCommand({buildinfo:1}) | |
eof | |
echo_with_color "listdatabases ..." | |
$BIN/mongo --port 30000 << eof | |
use admin | |
db.runCommand({listdatabases:1}) | |
eof | |
#db.runCommand({serverStatus:1}) # very long | |
#db.runCommand({ping:1}) | |
} | |
# https://www.jianshu.com/p/f41e35e20e2b | |
# https://codereview.stackexchange.com/questions/172294/bash-script-to-deploy-a-mongodb-cluster-on-local-machine | |
start_shard() { | |
rm -rf shard1/data-* shard2/data-* configrs/data/* | |
rm -rf *.log | |
mkdir -p shard1/data-30001 shard1/data-30002 shard1/data-30003 | |
mkdir -p shard2/data-40001 shard2/data-40002 shard2/data-40003 | |
mkdir -p configrs/data | |
echo_with_color "starting shard1 ..." | |
$BIN/mongod -f mongo-conf/30001.conf | |
$BIN/mongod -f mongo-conf/30002.conf | |
$BIN/mongod -f mongo-conf/30003.conf | |
echo_with_color "starting shard2 ..." | |
$BIN/mongod -f mongo-conf/40001.conf | |
$BIN/mongod -f mongo-conf/40002.conf | |
$BIN/mongod -f mongo-conf/40003.conf | |
echo_with_color "starting config server ..." | |
$BIN/mongod -f mongo-conf/config.conf | |
echo_with_color "starting mongos server ..." | |
$BIN/mongos -f mongo-conf/mongos.conf | |
} | |
regular_commands() { | |
echo | |
} | |
stop() { | |
killall $BIN/mongod | |
killall $BIN/mongos | |
} | |
case $cmd in | |
run) | |
$0 start $BIN | |
$0 config $BIN | |
$0 addshard $BIN | |
$0 stat $BIN | |
;; | |
start) | |
start_shard | |
;; | |
debug) | |
start_debug | |
;; | |
simple) | |
start_simple | |
;; | |
stop) | |
stop | |
;; | |
rc) | |
regular_commands | |
;; | |
config) | |
config_shard | |
;; | |
addshard) | |
add_shard_to_mongos | |
;; | |
stat) | |
shard_stat_from_mongos | |
;; | |
sharddb) | |
shard_db db1 | |
;; | |
common-commands|cc) | |
common_commands | |
;; | |
write) | |
write_data | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment