diff --git a/.ci/docker-compose-file/docker-compose-emqx-cluster-mnesia.override.yaml b/.ci/docker-compose-file/docker-compose-emqx-cluster-mnesia.override.yaml new file mode 100644 index 000000000..1a255b2e1 --- /dev/null +++ b/.ci/docker-compose-file/docker-compose-emqx-cluster-mnesia.override.yaml @@ -0,0 +1,29 @@ +x-default-emqx: &default-emqx + env_file: + - conf.cluster.env + healthcheck: + test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"] + interval: 5s + timeout: 25s + retries: 5 + +services: + emqx1: + <<: *default-emqx + container_name: node1.emqx.io + restart: on-failure + environment: + - "EMQX_HOST=node1.emqx.io" + - "EMQX_DB__BACKEND=mnesia" + - "EMQX_DB__ROLE=core" + + emqx2: + <<: *default-emqx + container_name: node2.emqx.io + depends_on: + - emqx1 + restart: on-failure + environment: + - "EMQX_HOST=node2.emqx.io" + - "EMQX_DB__BACKEND=mnesia" + - "EMQX_DB__ROLE=core" diff --git a/.ci/docker-compose-file/scripts/run-emqx.sh b/.ci/docker-compose-file/scripts/run-emqx.sh index 60946badb..bf99cb61f 100755 --- a/.ci/docker-compose-file/scripts/run-emqx.sh +++ b/.ci/docker-compose-file/scripts/run-emqx.sh @@ -5,12 +5,18 @@ set -euxo pipefail export _EMQX_DOCKER_IMAGE_TAG="$1" _EMQX_TEST_DB_BACKEND="${2:-${_EMQX_TEST_DB_BACKEND:-mnesia}}" -if [ "$_EMQX_TEST_DB_BACKEND" = "rlog" ] -then - CLUSTER_OVERRIDES="-f .ci/docker-compose-file/docker-compose-emqx-cluster-rlog.override.yaml" -else - CLUSTER_OVERRIDES="" -fi +case "$_EMQX_TEST_DB_BACKEND" in + rlog) + CLUSTER_OVERRIDES=".ci/docker-compose-file/docker-compose-emqx-cluster-rlog.override.yaml" + ;; + mnesia) + CLUSTER_OVERRIDES=".ci/docker-compose-file/docker-compose-emqx-cluster-mnesia.override.yaml" + ;; + *) + echo "ERROR: Unknown DB backend: ${_EMQX_TEST_DB_BACKEND}" + exit 1 + ;; +esac { echo "HOCON_ENV_OVERRIDE_PREFIX=EMQX_" @@ -39,10 +45,9 @@ is_cluster_up() { is_node_listening node2.emqx.io } -# shellcheck disable=SC2086 docker-compose \ -f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \ - $CLUSTER_OVERRIDES \ + -f "$CLUSTER_OVERRIDES" \ -f .ci/docker-compose-file/docker-compose-python.yaml \ up -d diff --git a/apps/emqx_conf/src/emqx_conf_schema.erl b/apps/emqx_conf/src/emqx_conf_schema.erl index 4603c255e..cc97830fd 100644 --- a/apps/emqx_conf/src/emqx_conf_schema.erl +++ b/apps/emqx_conf/src/emqx_conf_schema.erl @@ -315,22 +315,22 @@ a crash dump" sc(emqx_schema:duration(), #{ mapping => "vm_args.-kernel net_ticktime" , default => "2m" - , desc => "This is the approximate time an EMQX node may" - " be unresponsive until it is considered down and thereby disconnected." + , desc => "This is the approximate time an EMQX node may be unresponsive " + "until it is considered down and thereby disconnected." })} , {"dist_listen_min", sc(range(1024, 65535), #{ mapping => "kernel.inet_dist_listen_min" , default => 6369 - , desc => "Lower bound for the port range where" - " EMQX broker listens for peer connections." + , desc => "Lower bound for the port range where EMQX broker " + "listens for peer connections." })} , {"dist_listen_max", sc(range(1024, 65535), #{ mapping => "kernel.inet_dist_listen_max" , default => 6369 - , desc => "Upper bound for the port range " - "where EMQX broker listens for peer connections." + , desc => "Upper bound for the port range where EMQX broker " + "listens for peer connections." })} , {"backtrace_depth", sc(integer(), @@ -362,11 +362,12 @@ fields("db") -> [ {"backend", sc(hoconsc:enum([mnesia, rlog]), #{ mapping => "mria.db_backend" - , default => mnesia + , default => rlog , desc => """ Select the backend for the embedded database.
-mnesia is the default backend, that offers decent performance in small clusters.
-rlog is a new experimental backend that is suitable for very large clusters. +rlog is the default backend, a new experimental backend +that is suitable for very large clusters.
+mnesia is a backend that offers decent performance in small clusters. """ })} , {"role", @@ -391,7 +392,10 @@ to rlog. , desc => """ List of core nodes that the replicant will connect to.
Note: this parameter only takes effect when the backend is set -to rlog and the role is set to replicant. +to rlog and the role is set to replicant.
+This values needs to be defined for manual or static cluster discovery mechanisms.
+If an automatic cluster discovery mechanism is being used (such as etcd), +there is no need to set this value. """ })} , {"rpc_module", @@ -458,8 +462,8 @@ fields("rpc") -> #{ mapping => "gen_rpc.port_discovery" , default => stateless , desc => "manual: discover ports by tcp_server_port.
" - "stateless: discover ports in a stateless manner," - " using the following algorithm. " + "stateless: discover ports in a stateless manner, " + "using the following algorithm. " "If node name is emqxN@127.0.0.1, where the N is an integer, " "then the listening port will be 5370 + N." })} @@ -468,8 +472,8 @@ fields("rpc") -> #{ mapping => "gen_rpc.tcp_server_port" , default => 5369 , desc => "Listening port used by RPC local service.
" - "Note that this config only takes effect " - "when rpc.port_discovery is set to manual." + "Note that this config only takes effect when rpc.port_discovery " + "is set to manual." })} , {"ssl_server_port", sc(integer(), @@ -502,8 +506,8 @@ fields("rpc") -> sc(file(), #{ mapping => "gen_rpc.keyfile" , desc => "Path to the private key file for the rpc.certfile.
" - "Note: contents of this file are secret, so it's necessary to " - "set permissions to 600." + "Note: contents of this file are secret, so " + "it's necessary to set permissions to 600." })} , {"cacertfile", sc(file(), @@ -534,8 +538,8 @@ fields("rpc") -> sc(emqx_schema:duration_s(), #{ mapping => "gen_rpc.socket_keepalive_idle" , default => "7200s" - , desc => "How long the connections between the brokers should remain open " - "after the last message is sent." + , desc => "How long the connections between the brokers " + "should remain open after the last message is sent." })} , {"socket_keepalive_interval", sc(emqx_schema:duration_s(),