start-two-nodes-in-host.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ## This starts two nodes on the same host (not in docker).
  4. ## The listener ports are shifted with an offset to avoid clashing.
  5. ## The data and log directories are configured to use ./tmp/
  6. ## By default, the boot script is ./_build/emqx/rel/emqx
  7. ## it can be overriden with arg1 and arg2 for the two nodes respectfully
  8. # ensure dir
  9. cd -P -- "$(dirname -- "$0")/../../"
  10. help() {
  11. echo
  12. echo "-h|--help: To display this usage info"
  13. echo "-b|--boots: boot scripts, comma separate if more than one"
  14. echo " default is ./_build/emqx/rel/emqx/bin/emqx"
  15. echo "-r|--roles: node (db) roles, comma separate"
  16. }
  17. BOOT='./_build/emqx/rel/emqx/bin/emqx'
  18. ROLES='core,core'
  19. while [ "$#" -gt 0 ]; do
  20. case $1 in
  21. -h|--help)
  22. help
  23. exit 0
  24. ;;
  25. -b|--boots)
  26. BOOT="$2"
  27. shift 2
  28. ;;
  29. -r|--roles)
  30. ROLES="$2"
  31. shift 2
  32. ;;
  33. *)
  34. echo "unknown option $1"
  35. exit 1
  36. ;;
  37. esac
  38. done
  39. BOOT1="$(echo "$BOOT" | cut -d ',' -f1)"
  40. BOOT2="$(echo "$BOOT" | cut -d ',' -f2)"
  41. [ -z "$BOOT2" ] && BOOT2="$BOOT1"
  42. export IP1='127.0.0.1'
  43. export IP2='127.0.0.2'
  44. # cannot use the same node name even IPs are different because Erlang distribution listens on 0.0.0.0
  45. NODE1="emqx1@$IP1"
  46. NODE2="emqx2@$IP2"
  47. ROLE1="$(echo "$ROLES" | cut -d ',' -f1)"
  48. ROLE2="$(echo "$ROLES" | cut -d ',' -f2)"
  49. export ROLE1 ROLE2
  50. if [ "$ROLE1" = 'core' ] && [ "$ROLE2" = 'core' ]; then
  51. SEEDS="$NODE1,$NODE2"
  52. elif [ "$ROLE1" = 'core' ]; then
  53. SEEDS="$NODE1"
  54. elif [ "$ROLE2" = 'core' ]; then
  55. SEEDS="$NODE2"
  56. else
  57. echo "missing 'core' role in -r|--roles option"
  58. exit 1
  59. fi
  60. export SEEDS
  61. start_cmd() {
  62. local index="$1"
  63. local nodehome
  64. nodehome="$(pwd)/tmp/emqx${index}"
  65. [ "$index" -eq 1 ] && BOOT_SCRIPT="$BOOT1"
  66. [ "$index" -eq 2 ] && BOOT_SCRIPT="$BOOT2"
  67. mkdir -p "${nodehome}/data" "${nodehome}/log"
  68. cat <<-EOF
  69. env DEBUG="${DEBUG:-0}" \
  70. EMQX_NODE_NAME="emqx${index}@\$IP${index}" \
  71. EMQX_CLUSTER__STATIC__SEEDS="$SEEDS" \
  72. EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
  73. EMQX_NODE__ROLE="\$ROLE${index}" \
  74. EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL="${EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL:-debug}" \
  75. EMQX_LOG__FILE_HANDLERS__DEFAULT__FILE="${nodehome}/log/emqx.log" \
  76. EMQX_NODE__COOKIE="${EMQX_NODE__COOKIE:-cookie1}" \
  77. EMQX_LOG_DIR="${nodehome}/log" \
  78. EMQX_NODE__DATA_DIR="${nodehome}/data" \
  79. EMQX_LISTENERS__TCP__DEFAULT__BIND="\$IP${index}:1883" \
  80. EMQX_LISTENERS__SSL__DEFAULT__BIND="\$IP${index}:8883" \
  81. EMQX_LISTENERS__WS__DEFAULT__BIND="\$IP${index}:8083" \
  82. EMQX_LISTENERS__WSS__DEFAULT__BIND="\$IP${index}:8084" \
  83. EMQX_DASHBOARD__LISTENERS__HTTP__BIND="\$IP${index}:18083" \
  84. "$BOOT_SCRIPT" start
  85. EOF
  86. }
  87. echo "Stopping $NODE1"
  88. env EMQX_NODE_NAME="$NODE1" "$BOOT1" stop || true
  89. echo "Stopping $NODE2"
  90. env EMQX_NODE_NAME="$NODE2" "$BOOT2" stop || true
  91. start_one_node() {
  92. local index="$1"
  93. local cmd
  94. cmd="$(start_cmd "$index" | envsubst)"
  95. echo "$cmd"
  96. eval "$cmd"
  97. }
  98. ## Fork-start node1, otherwise it'll keep waiting for node2 because we are using static cluster
  99. start_one_node 1 &
  100. start_one_node 2