create-cluster.sh 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/bin/bash
  2. # USAGE: $0 [NUMBER_OF_NODES, default: 9] [DATA_DIR, default: a new temp dir]
  3. #
  4. # ports are assigned from 7000 on
  5. #
  6. # NOTE: the cluster setup requires redis 5+
  7. set -ex
  8. COUNT=${1:-9}
  9. DATA=$2
  10. if [[ -z "$DATA" ]]; then
  11. IS_TEMP=1
  12. TEMP=`mktemp -d`
  13. DATA="$TEMP"
  14. fi
  15. HAS_DATA=
  16. if [[ -e "$DATA/7000/node.conf" ]]; then
  17. HAS_DATA=1
  18. fi
  19. PIDs=""
  20. cleanup() {
  21. # ensure that we delete the temp dir, no matter how the kill cmd exists
  22. set +e
  23. # invoke kill with at least one PID
  24. echo "$PIDs" | xargs -r kill
  25. if [[ ! -z "$IS_TEMP" ]]; then
  26. rm -rf "$TEMP"
  27. fi
  28. }
  29. trap cleanup exit
  30. for NUM in `seq "$COUNT"`; do
  31. PORT=`expr 6999 + "$NUM"`
  32. CWD="$DATA/$PORT"
  33. mkdir -p "$CWD"
  34. pushd "$CWD"
  35. redis-server \
  36. --appendonly no \
  37. --cluster-enabled yes \
  38. --cluster-config-file node.conf \
  39. --port "$PORT" \
  40. --save "" \
  41. > /dev/null \
  42. &
  43. PIDs="$PIDs $!"
  44. popd
  45. done
  46. # initial nodes
  47. if [[ -z "$HAS_DATA" ]]; then
  48. # confirm the setup
  49. echo yes \
  50. | redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
  51. fi
  52. # scale up as requested
  53. for NUM in `seq 4 "$COUNT"`; do
  54. PORT=`expr 6999 + "$NUM"`
  55. GUARD="$DATA/$PORT/.joined"
  56. if [[ ! -e "$GUARD" ]]; then
  57. redis-cli --cluster add-node "127.0.0.1:$PORT" 127.0.0.1:7000 --cluster-slave
  58. touch "$GUARD"
  59. fi
  60. done
  61. echo "CLUSTER IS READY" >&2
  62. wait