dev-cluster-host.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ## This starts configurable number of core and replicant nodes on the same host (not in docker).
  4. ## The nodes are named as core1, core2, replicant3, replicant4, ... where the number monotically increases.
  5. ## The number in node name is used as an offset for ekka to avoid clashing (see ekka_dist:offset/1).
  6. ## Nodes are started on loopback addresses starting from 127.0.0.1.
  7. ## The script uses sudo to add loopback aliases.
  8. ## The boot script is ./_build/emqx/rel/emqx/bin/emqx.
  9. ## The data and log directories are configured to use ./tmp/
  10. # ensure dir
  11. cd -P -- "$(dirname -- "$0")/../"
  12. help() {
  13. echo
  14. echo "start | stop"
  15. echo "-h|--help: To display this usage info"
  16. echo "-n|--nodes: total number of nodes to start (default: 2)"
  17. echo "-c|--core_nodes: number of core nodes to start (default: 1)"
  18. echo "-b|--boot: boot script (default: ./_build/emqx/rel/emqx/bin/emqx)"
  19. }
  20. CMD="$1"
  21. shift || true
  22. export EMQX_NODE__COOKIE=test
  23. BOOT_SCRIPT='./_build/emqx/rel/emqx/bin/emqx'
  24. NODES=2
  25. CORE_NODES=1
  26. while [ "$#" -gt 0 ]; do
  27. case $1 in
  28. -h|--help)
  29. help
  30. exit 0
  31. ;;
  32. -n|--nodes)
  33. NODES="$2"
  34. shift 2
  35. ;;
  36. -c|--core-nodes)
  37. CORE_NODES="$2"
  38. shift 2
  39. ;;
  40. -b|--boot)
  41. BOOT_SCRIPT="$2"
  42. shift 2
  43. ;;
  44. *)
  45. echo "unknown option $1"
  46. exit 1
  47. ;;
  48. esac
  49. done
  50. REPLICANT_NODES=$((NODES - CORE_NODES))
  51. # cannot use the same node name even IPs are different because Erlang distribution listens on 0.0.0.0
  52. CORE_IDS=()
  53. REPLICANT_IDS=()
  54. SEEDS_ARRAY=()
  55. for i in $(seq 1 "$CORE_NODES"); do
  56. SEEDS_ARRAY+=("core${i}@127.0.0.$i")
  57. CORE_IDS+=("$i")
  58. done
  59. for i in $(seq "$((CORE_NODES+1))" "$((CORE_NODES+REPLICANT_NODES))"); do
  60. REPLICANT_IDS+=("$i")
  61. done
  62. SEEDS="$(IFS=,; echo "${SEEDS_ARRAY[*]}")"
  63. if [ "$CMD" = "stop" ]; then
  64. for id in "${REPLICANT_IDS[@]}"; do
  65. env EMQX_NODE_NAME="replicant${id}@127.0.0.$id" "$BOOT_SCRIPT" stop || true
  66. done
  67. for id in "${CORE_IDS[@]}"; do
  68. env EMQX_NODE_NAME="core${id}@127.0.0.$id" "$BOOT_SCRIPT" stop || true
  69. done
  70. exit 0
  71. fi
  72. start_cmd() {
  73. local role="$1"
  74. local id="$2"
  75. local ip="127.0.0.$id"
  76. local nodename="$role$id"
  77. local nodehome
  78. nodehome="$(pwd)/tmp/$nodename"
  79. mkdir -p "${nodehome}/data" "${nodehome}/log"
  80. cat <<-EOF
  81. env DEBUG="${DEBUG:-0}" \
  82. EMQX_NODE_NAME="$nodename@$ip" \
  83. EMQX_CLUSTER__STATIC__SEEDS="$SEEDS" \
  84. EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
  85. EMQX_NODE__ROLE="$role" \
  86. EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL="${EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL:-debug}" \
  87. EMQX_LOG__FILE_HANDLERS__DEFAULT__FILE="${nodehome}/log/emqx.log" \
  88. EMQX_LOG_DIR="${nodehome}/log" \
  89. EMQX_NODE__DATA_DIR="${nodehome}/data" \
  90. EMQX_LISTENERS__TCP__DEFAULT__BIND="$ip:1883" \
  91. EMQX_LISTENERS__SSL__DEFAULT__BIND="$ip:8883" \
  92. EMQX_LISTENERS__WS__DEFAULT__BIND="$ip:8083" \
  93. EMQX_LISTENERS__WSS__DEFAULT__BIND="$ip:8084" \
  94. EMQX_DASHBOARD__LISTENERS__HTTP__BIND="$ip:18083" \
  95. "$BOOT_SCRIPT" start
  96. EOF
  97. }
  98. start_node() {
  99. local cmd
  100. cmd="$(start_cmd "$1" "$2" | envsubst)"
  101. echo "$cmd"
  102. eval "$cmd"
  103. }
  104. for id in "${CORE_IDS[@]}"; do
  105. sudo ifconfig lo0 alias "127.0.0.$id" up
  106. start_node core "$id" &
  107. done
  108. for id in "${REPLICANT_IDS[@]}"; do
  109. sudo ifconfig lo0 alias "127.0.0.$id" up
  110. start_node replicant "$id" &
  111. done