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(),