| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #!/usr/bin/env bash
- set -euo pipefail
- ## This starts configurable number of core and replicant nodes on the same host (not in docker).
- ## The nodes are named as core1, core2, replicant3, replicant4, ... where the number monotically increases.
- ## The number in node name is used as an offset for ekka to avoid clashing (see ekka_dist:offset/1).
- ## Nodes are started on loopback addresses starting from 127.0.0.1.
- ## The script uses sudo to add loopback aliases.
- ## The boot script is ./_build/emqx/rel/emqx/bin/emqx.
- ## The data and log directories are configured to use ./tmp/
- # ensure dir
- cd -P -- "$(dirname -- "$0")/../"
- help() {
- echo
- echo "start | stop"
- echo "-h|--help: To display this usage info"
- echo "-n|--nodes: total number of nodes to start (default: 2)"
- echo "-c|--core_nodes: number of core nodes to start (default: 1)"
- echo "-b|--boot: boot script (default: ./_build/emqx/rel/emqx/bin/emqx)"
- }
- CMD="$1"
- shift || true
- export EMQX_NODE__COOKIE=test
- BOOT_SCRIPT='./_build/emqx/rel/emqx/bin/emqx'
- NODES=2
- CORE_NODES=1
- while [ "$#" -gt 0 ]; do
- case $1 in
- -h|--help)
- help
- exit 0
- ;;
- -n|--nodes)
- NODES="$2"
- shift 2
- ;;
- -c|--core-nodes)
- CORE_NODES="$2"
- shift 2
- ;;
- -b|--boot)
- BOOT_SCRIPT="$2"
- shift 2
- ;;
- *)
- echo "unknown option $1"
- exit 1
- ;;
- esac
- done
- REPLICANT_NODES=$((NODES - CORE_NODES))
- # cannot use the same node name even IPs are different because Erlang distribution listens on 0.0.0.0
- CORE_IDS=()
- REPLICANT_IDS=()
- SEEDS_ARRAY=()
- for i in $(seq 1 "$CORE_NODES"); do
- SEEDS_ARRAY+=("core${i}@127.0.0.$i")
- CORE_IDS+=("$i")
- done
- for i in $(seq "$((CORE_NODES+1))" "$((CORE_NODES+REPLICANT_NODES))"); do
- REPLICANT_IDS+=("$i")
- done
- SEEDS="$(IFS=,; echo "${SEEDS_ARRAY[*]}")"
- if [ "$CMD" = "stop" ]; then
- for id in "${REPLICANT_IDS[@]}"; do
- env EMQX_NODE_NAME="replicant${id}@127.0.0.$id" "$BOOT_SCRIPT" stop || true
- done
- for id in "${CORE_IDS[@]}"; do
- env EMQX_NODE_NAME="core${id}@127.0.0.$id" "$BOOT_SCRIPT" stop || true
- done
- exit 0
- fi
- start_cmd() {
- local role="$1"
- local id="$2"
- local ip="127.0.0.$id"
- local nodename="$role$id"
- local nodehome
- nodehome="$(pwd)/tmp/$nodename"
- mkdir -p "${nodehome}/data" "${nodehome}/log"
- cat <<-EOF
- env DEBUG="${DEBUG:-0}" \
- EMQX_NODE_NAME="$nodename@$ip" \
- EMQX_CLUSTER__STATIC__SEEDS="$SEEDS" \
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
- EMQX_NODE__ROLE="$role" \
- EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL="${EMQX_LOG__FILE_HANDLERS__DEFAULT__LEVEL:-debug}" \
- EMQX_LOG__FILE_HANDLERS__DEFAULT__FILE="${nodehome}/log/emqx.log" \
- EMQX_LOG_DIR="${nodehome}/log" \
- EMQX_NODE__DATA_DIR="${nodehome}/data" \
- EMQX_LISTENERS__TCP__DEFAULT__BIND="$ip:1883" \
- EMQX_LISTENERS__SSL__DEFAULT__BIND="$ip:8883" \
- EMQX_LISTENERS__WS__DEFAULT__BIND="$ip:8083" \
- EMQX_LISTENERS__WSS__DEFAULT__BIND="$ip:8084" \
- EMQX_DASHBOARD__LISTENERS__HTTP__BIND="$ip:18083" \
- "$BOOT_SCRIPT" start
- EOF
- }
- start_node() {
- local cmd
- cmd="$(start_cmd "$1" "$2" | envsubst)"
- echo "$cmd"
- eval "$cmd"
- }
- for id in "${CORE_IDS[@]}"; do
- sudo ifconfig lo0 alias "127.0.0.$id" up
- start_node core "$id" &
- done
- for id in "${REPLICANT_IDS[@]}"; do
- sudo ifconfig lo0 alias "127.0.0.$id" up
- start_node replicant "$id" &
- done
|