EMQX集群搭建记录

整体架构

依托域Azure LB的高可用搭建集群

画板

环境准备

创建节点机器

配置:4c16g

1
2
3
4
5
6
7
8
9
10
11
12
13
# 确认磁盘名称
sudo su
lsblk
export DISK_NAME=sda # 手动确认

# 执行脚本
mkdir -p /mnt/data
sudo mkdir -p /mnt/data
sudo fdisk -l /dev/${DISK_NAME}
sudo mkfs.ext4 /dev/${DISK_NAME}
sudo mount /dev/${DISK_NAME} /mnt/data
echo "/dev/${DISK_NAME} /mnt/data ext4 defaults 0 0" >> /etc/fstab
df -h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo docker run hello-world
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

创建负载均衡

集群部署

每个节点中启动

1
vim docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'
services:
emqx:
image: emqx/emqx:5.8.5
environment:
- "EMQX_NODE__NAME=emqx@10.0.0.16"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@10.0.0.16, emqx@10.0.0.17]"
- "EMQX_AUTHENTICATION__1__ENABLE=true"
- "EMQX_AUTHENTICATION__1__ALGORITHM=hmac-based"
- "EMQX_AUTHENTICATION__1__SECRET=xxxxxx"
- "EMQX_AUTHENTICATION__1__MECHANISM=jwt"
- "EMQX_AUTHENTICATION__1__USE_JWKS=false"
volumes:
- /mnt/data/emqx/data:/opt/emqx/data
- /mnt/data/emqx/log:/opt/emqx/log
network_mode: host # 主机模式才能自动连接上
# ports:
# - "1883:1883"
# - "8083:8083"
# - "8084:8084"
# - "8883:8883"
# - "18083:18083"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'
services:
emqx:
image: emqx/emqx:5.8.5
environment:
- "EMQX_NODE__NAME=emqx@10.0.0.17"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@10.0.0.16, emqx@10.0.0.17]"
- "EMQX_AUTHENTICATION__1__ENABLE=true"
- "EMQX_AUTHENTICATION__1__ALGORITHM=hmac-based"
- "EMQX_AUTHENTICATION__1__SECRET=xxxxxx"
- "EMQX_AUTHENTICATION__1__MECHANISM=jwt"
- "EMQX_AUTHENTICATION__1__USE_JWKS=false"
volumes:
- /mnt/data/emqx/data:/opt/emqx/data
- /mnt/data/emqx/log:/opt/emqx/log
network_mode: host
# ports:
# - "1883:1883"
# - "8083:8083"
# - "8084:8084"
# - "8883:8883"
# - "18083:18083"

查看集群

1
docker exec -it my_emqx_emqx1_1 sh -c "emqx ctl cluster status"

通过浏览器访问 http://[nodeip]:18083 ,使用默认的用户名和密码 **admin/public **登录EMQX 控制台

压力测试

压测工具

相关压测工具:https://docs.emqx.com/zh/emqx/latest/performance/benchmark-emqtt-bench.html

1
2
3
4
# centos 7
sudo yum install libatomic
# ubuntu 20.04
sudo apt install libatomic1
1
2
3
4
5
6
7
mkdir emqtt-bench && cd emqtt-bench
wget https://github.com/emqx/emqtt-bench/releases/download/0.4.34/emqtt-bench-0.4.34-debian11-amd64.tar.gz
tar xfz emqtt-bench-0.4.34-debian11-amd64.tar.gz
rm emqtt-bench-0.4.34-debian11-amd64.tar.gz
# 测试
./bin/emqtt_bench
Usage: emqtt_bench pub | sub | conn [--help]

内核调优

https://emqtt.io/docs/v2/tune.html

https://docs.emqx.com/zh/emqx/latest/performance/tune.html

连接数压测

1
./bin/emqtt_bench conn -c 60000 -h 48.215.131.42 

压测机出现错误

解除系统fd和端口限制

1
2
3
4
5
6
7
#允许当前会话 / 进程打开文件句柄数:
ulimit -n 1048576

# 可用端口范围:
sudo sysctl -w net.ipv4.ip_local_port_range="1025 65534"

ulimit -n 1048576 && sudo sysctl -w net.ipv4.ip_local_port_range="1025 65534"

单节点

10w 连接数

1
./bin/emqtt_bench conn -c 60000 -h 48.215.131.42 

10万连接内存使用上升1GB左右,系统整体负载还是比较低的。

20w 连接数

受限于压测机网卡+端口数量原因,公司内部机器的网络原因,没能把连接量压上去,得需要开新机器来压才行。

双节点

10w 连接数

节点负载

20w 连接数

机器负载

吞吐测试

单节点

500订阅+200发布消息/秒

首先启动服 EMQX,然后在 bench1 启动 500 个订阅客户端:

1
./bin/emqtt_bench sub -t t -h 48.215.131.42 -c 500

然后再 bench2 上启动 20 个发布端,并且每个每秒发布 10 条消息,总200消息/秒:

1
./bin/emqtt_bench pub -t t -h 48.215.131.42 -c 20 -I 100

然后,回到 bench1上的订阅客户端,可看到当前接收消息的速率,类似于:

1
recv total=4731728 rate=81652.00/sec

吞吐量

机器负载

5000订阅+4000发布消息/秒

机器负载

在并发量大的时候会占用cpu比较高,会对写入有一定的性能影响,可以提高cpu核心数增加其处理能力。

双节点

500订阅+200发布消息/秒

5000订阅+4000发布消息/秒

相关资料

  1. EMQX 文档:https://docs.emqx.com/zh/emqx/latest/
  2. 性能参考:https://docs.emqx.com/zh/emqx/latest/performance/performance-reference.html

EMQX集群搭建记录
https://mikeygithub.github.io/2025/03/02/yuque/EMQX集群搭建记录/
作者
Mikey
发布于
2025年3月2日
许可协议