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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ## Starts tow nodes named emqx1@127.0.1 and emqx2@127.0.0.2 on the same host.
  4. ## The data and log directories are configured to use $DATADIR/emqx{1,2},
  5. ## where DATADIR is by default ./tmp.
  6. logerr() {
  7. if [ "${TERM:-dumb}" = dumb ]; then
  8. echo -e "ERROR: $*" 1>&2
  9. else
  10. echo -e "$(tput setaf 1)ERROR: $*$(tput sgr0)" 1>&2
  11. fi
  12. }
  13. help() {
  14. echo ""
  15. echo "Start a 2-node cluster in one host, node names are emqx1@127.0.1 and emqx2@127.0.0.2"
  16. echo ""
  17. echo "-h|--help: To display this usage info."
  18. echo "-b|--boots: Optional, default is ./_build/emqx/rel/emqx/bin/emqx"
  19. echo " If it is not found in _build dir, the 'which emqx' command output is used"
  20. echo " Supports multiple commands, one for each node, separate with a comma."
  21. echo "-r|--roles: Optional, node (db) roles, comma separate."
  22. echo " Default is 'core' for both."
  23. echo "-d|--data: Optional, base dirs for node data and log directories."
  24. echo " Nodes will save data to ./tmp/emqx1 and ./tmp/emqx2"
  25. echo " Default is './tmp'"
  26. }
  27. BUILT_BOOT='./_build/emqx/rel/emqx/bin/emqx'
  28. if [ -f "$BUILT_BOOT" ]; then
  29. DEFAULT_BOOT="$BUILT_BOOT"
  30. else
  31. DEFAULT_BOOT="$(which emqx || true)"
  32. fi
  33. DATADIR="$(pwd)/tmp"
  34. ROLES='core,core'
  35. while [ "$#" -gt 0 ]; do
  36. case $1 in
  37. -h|--help)
  38. help
  39. exit 0
  40. ;;
  41. -b|--boots)
  42. BOOT="$2"
  43. shift 2
  44. ;;
  45. -r|--roles)
  46. ROLES="$2"
  47. shift 2
  48. ;;
  49. -d|--data)
  50. DATADIR="$2"
  51. shift 2
  52. ;;
  53. *)
  54. echo "unknown option $1"
  55. exit 1
  56. ;;
  57. esac
  58. done
  59. if [ -z "${BOOT:-}" ]; then
  60. if [ -z "${DEFAULT_BOOT}" ]; then
  61. help
  62. logerr "Missing -b|--boots option."
  63. exit 1
  64. fi
  65. BOOT="${DEFAULT_BOOT}"
  66. fi
  67. BOOT1="$(echo "$BOOT" | cut -d ',' -f1)"
  68. BOOT2="$(echo "$BOOT" | cut -d ',' -f2)"
  69. [ -z "$BOOT2" ] && BOOT2="$BOOT1"
  70. export IP1='127.0.0.1'
  71. export IP2='127.0.0.2'
  72. # cannot use the same node name even IPs are different because Erlang distribution listens on 0.0.0.0
  73. NODE1="emqx1@$IP1"
  74. NODE2="emqx2@$IP2"
  75. ROLE1="$(echo "$ROLES" | cut -d ',' -f1)"
  76. ROLE2="$(echo "$ROLES" | cut -d ',' -f2)"
  77. export ROLE1 ROLE2
  78. if [ "$ROLE1" = 'core' ] && [ "$ROLE2" = 'core' ]; then
  79. SEEDS="$NODE1,$NODE2"
  80. elif [ "$ROLE1" = 'core' ]; then
  81. SEEDS="$NODE1"
  82. elif [ "$ROLE2" = 'core' ]; then
  83. SEEDS="$NODE2"
  84. else
  85. echo "missing 'core' role in -r|--roles option"
  86. exit 1
  87. fi
  88. export SEEDS
  89. export DATADIR
  90. start_cmd() {
  91. local index="$1"
  92. local nodehome
  93. nodehome="${DATADIR}/emqx${index}"
  94. [ "$index" -eq 1 ] && BOOT_SCRIPT="$BOOT1"
  95. [ "$index" -eq 2 ] && BOOT_SCRIPT="$BOOT2"
  96. mkdir -p "${nodehome}/data" "${nodehome}/log"
  97. cat <<-EOF
  98. env DEBUG="${DEBUG:-0}" \
  99. EMQX_NODE_NAME="emqx${index}@\$IP${index}" \
  100. EMQX_CLUSTER__STATIC__SEEDS="$SEEDS" \
  101. EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
  102. EMQX_NODE__ROLE="\$ROLE${index}" \
  103. EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL="${EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL:-debug}" \
  104. EMQX_LOG__FILE_HANDLERS__DEFAULT__FILE="${nodehome}/log/emqx.log" \
  105. EMQX_NODE__COOKIE="${EMQX_NODE__COOKIE:-cookie1}" \
  106. EMQX_LOG_DIR="${nodehome}/log" \
  107. EMQX_NODE__DATA_DIR="${nodehome}/data" \
  108. EMQX_LISTENERS__TCP__DEFAULT__BIND="\$IP${index}:1883" \
  109. EMQX_LISTENERS__SSL__DEFAULT__BIND="\$IP${index}:8883" \
  110. EMQX_LISTENERS__WS__DEFAULT__BIND="\$IP${index}:8083" \
  111. EMQX_LISTENERS__WSS__DEFAULT__BIND="\$IP${index}:8084" \
  112. EMQX_DASHBOARD__LISTENERS__HTTP__BIND="\$IP${index}:18083" \
  113. "$BOOT_SCRIPT" start
  114. EOF
  115. }
  116. echo "Stopping $NODE1"
  117. env EMQX_NODE_NAME="$NODE1" "$BOOT1" stop || true
  118. echo "Stopping $NODE2"
  119. env EMQX_NODE_NAME="$NODE2" "$BOOT2" stop || true
  120. start_one_node() {
  121. local index="$1"
  122. local cmd
  123. cmd="$(start_cmd "$index" | envsubst)"
  124. echo "$cmd"
  125. eval "$cmd"
  126. }
  127. ## Fork-start node1, otherwise it'll keep waiting for node2 because we are using static cluster
  128. start_one_node 1 &
  129. start_one_node 2