
整体架构
依托域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 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
|
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
|
查看集群
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
| sudo yum install libatomic
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发布消息/秒


相关资料
- EMQX 文档:https://docs.emqx.com/zh/emqx/latest/
- 性能参考:https://docs.emqx.com/zh/emqx/latest/performance/performance-reference.html