管理命令 (Commands)

EMQ 消息服务器提供了 ‘./bin/emqttd_ctl’ 的管理命令行。

status 命令

查询 EMQ 消息服务器运行状态:

$ ./bin/emqttd_ctl status

Node 'emqttd@127.0.0.1' is started
emqttd 2.0 is running

broker 命令

broker 命令查询服务器基本信息,启动时间,统计数据与性能数据。

broker 查询 EMQ 消息服务器描述、版本、启动时间
broker pubsub 查询核心的 Erlang PubSub 进程状态(调试)
broker stats 查询连接(Client)、会话(Session)、主题(Topic)、 订阅(Subscription)、路由(Route)统计信息
broker metrics 查询 MQTT 报文(Packet)、消息(Message)收发统计

查询 EMQ 消息服务器基本信息包括版本、启动时间等:

$ ./bin/emqttd_ctl broker

sysdescr  : Erlang MQTT Broker
version   : 2.0
uptime    : 25 seconds
datetime  : 2016-10-18 10:42:10

broker stats

查询服务器客户端连接(Client)、会话(Session)、主题(Topic)、订阅(Subscription)、路由(Route)统计:

$ ./bin/emqttd_ctl broker stats

clients/count       : 1
clients/max         : 1
queues/count        : 0
queues/max          : 0
retained/count      : 2
retained/max        : 2
routes/count        : 2
routes/reverse      : 2
sessions/count      : 0
sessions/max        : 0
subscriptions/count : 1
subscriptions/max   : 1
topics/count        : 54
topics/max          : 54

broker metrics

查询服务器流量(Bytes)、MQTT报文(Packets)、消息(Messages)收发统计:

$ ./bin/emqttd_ctl broker metrics

bytes/received          : 297
bytes/sent              : 40
messages/dropped        : 348
messages/qos0/received  : 0
messages/qos0/sent      : 0
messages/qos1/received  : 0
messages/qos1/sent      : 0
messages/qos2/received  : 0
messages/qos2/sent      : 0
messages/received       : 0
messages/retained       : 2
messages/sent           : 0
packets/connack         : 5
packets/connect         : 5
packets/disconnect      : 0
packets/pingreq         : 0
packets/pingresp        : 0
packets/puback/received : 0
packets/puback/sent     : 0
packets/pubcomp/received: 0
packets/pubcomp/sent    : 0
packets/publish/received: 0
packets/publish/sent    : 0
packets/pubrec/received : 0
packets/pubrec/sent     : 0
packets/pubrel/received : 0
packets/pubrel/sent     : 0
packets/received        : 9
packets/sent            : 9
packets/suback          : 4
packets/subscribe       : 4
packets/unsuback        : 0
packets/unsubscribe     : 0

cluster 命令

cluster 命令集群多个 EMQ 消息服务器节点(进程):

cluster join <Node> 加入集群
cluster leave 离开集群
cluster remove <Node> 从集群删除节点
cluster status 查询集群状态

cluster 命令集群本机两个 EMQ 节点示例:

目录 节点名 MQTT 端口
emqttd1 emqttd1@127.0.0.1 1883
emqttd2 emqttd2@127.0.0.1 2883

启动 emqttd1

cd emqttd1 && ./bin/emqttd start

启动 emqttd2

cd emqttd2 && ./bin/emqttd start

emqttd2 节点与 emqttd1 集群,emqttd2 目录下:

$ ./bin/emqttd_ctl cluster join emqttd1@127.0.0.1

Join the cluster successfully.
Cluster status: [{running_nodes,['emqttd1@127.0.0.1','emqttd2@127.0.0.1']}]

任意节点目录下查询集群状态:

$ ./bin/emqttd_ctl cluster status

Cluster status: [{running_nodes,['emqttd2@127.0.0.1','emqttd1@127.0.0.1']}]

集群消息路由测试:

# emqttd1节点上订阅x
mosquitto_sub -t x -q 1 -p 1883

# emqttd2节点上向x发布消息
mosquitto_pub -t x -q 1 -p 2883 -m hello

emqttd2 节点离开集群:

cd emqttd2 && ./bin/emqttd_ctl cluster leave

emqttd1 节点下删除 emqttd2:

cd emqttd1 && ./bin/emqttd_ctl cluster remove emqttd2@127.0.0.1

clients 命令

clients 命令查询连接的 MQTT 客户端。

clients list 查询全部客户端连接
clients show <ClientId> 根据 ClientId 查询客户端
clients kick <ClientId> 根据 ClientId 踢出客户端

clients list

查询全部客户端连接:

$ ./bin/emqttd_ctl clients list

Client(mosqsub/43832-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64896, connected_at=1452929113)
Client(mosqsub/44011-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64961, connected_at=1452929275)
...

返回 Client 对象的属性:

clean_sess 清除会话标记
username 用户名
peername 对端 TCP 地址
connected_at 客户端连接时间

clients show <ClientId>

根据 ClientId 查询客户端:

./bin/emqttd_ctl clients show "mosqsub/43832-airlee.lo"

Client(mosqsub/43832-airlee.lo, clean_sess=true, username=test, peername=127.0.0.1:64896, connected_at=1452929113)

clients kick <ClientId>

根据 ClientId 踢出客户端:

./bin/emqttd_ctl clients kick "clientid"

sessions 命令

sessions 命令查询 MQTT 连接会话。EMQ 消息服务器会为每个连接创建会话,clean_session 标记 true,创建临时(transient)会话;clean_session 标记为 false,创建持久会话(persistent)。

sessions list 查询全部会话
sessions list persistent 查询全部持久会话
sessions list transient 查询全部临时会话
sessions show <ClientId> 根据 ClientID 查询会话

sessions list

查询全部会话:

$ ./bin/emqttd_ctl sessions list

Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508)
Session(mosqsub/44101-airlee.lo, clean_sess=true, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935401)

返回 Session 对象属性:

clean_sess false: 持久会话,true: 临时会话
max_inflight 飞行窗口(最大允许同时下发消息数)
inflight_queue 当前正在下发的消息数
message_queue 当前缓存消息数
message_dropped 会话丢掉的消息数
awaiting_rel 等待客户端发送 PUBREL 的 QoS2 消息数
awaiting_ack 等待客户端响应 PUBACK 的 QoS1/2 消息数
awaiting_comp 等待客户端响应 PUBCOMP 的 QoS2 消息数
created_at 会话创建时间戳

sessions list persistent

查询全部持久会话:

$ ./bin/emqttd_ctl sessions list persistent

Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508)

sessions list transient

查询全部临时会话:

$ ./bin/emqttd_ctl sessions list transient

Session(mosqsub/44101-airlee.lo, clean_sess=true, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935401)

sessions show <ClientId>

根据 ClientId 查询会话:

$ ./bin/emqttd_ctl sessions show clientid

Session(clientid, clean_sess=false, max_inflight=100, inflight_queue=0, message_queue=0, message_dropped=0, awaiting_rel=0, awaiting_ack=0, awaiting_comp=0, created_at=1452935508)

routes 命令

routes 命令查询路由表。

routes list

查询全部路由:

$ ./bin/emqttd_ctl routes list

t2/# -> emqttd2@127.0.0.1
t/+/x -> emqttd2@127.0.0.1,emqttd@127.0.0.1

routes show <Topic>

根据 Topic 查询一条路由:

$ ./bin/emqttd_ctl routes show t/+/x

t/+/x -> emqttd2@127.0.0.1,emqttd@127.0.0.1

topics 命令

topics 命令查询当前的主题(Topic)表。

topics list

查询全部主题(Topic):

$ ./bin/emqttd_ctl topics list

$SYS/brokers/emqttd@127.0.0.1/metrics/packets/subscribe: static
$SYS/brokers/emqttd@127.0.0.1/stats/subscriptions/max: static
$SYS/brokers/emqttd2@127.0.0.1/stats/subscriptions/count: static
...

topics show <Topic>

查询某个主题(Topic):

$ ./bin/emqttd_ctl topics show '$SYS/brokers'

$SYS/brokers: static

subscriptions 命令

subscriptions 命令查询消息服务器的订阅(Subscription)表。

subscriptions list 查询全部订阅
subscriptions show <ClientId> 查询某个 ClientId 的订阅

subscriptions list

查询全部订阅:

$ ./bin/emqttd_ctl subscriptions list

mosqsub/91042-airlee.lo -> t/y:1
mosqsub/90475-airlee.lo -> t/+/x:2

subscriptions show <ClientId>

查询某个 Client 的订阅:

$ ./bin/emqttd_ctl subscriptions show 'mosqsub/90475-airlee.lo'

mosqsub/90475-airlee.lo -> t/+/x:2

plugins 命令

plugins 命令用于加载、卸载、查询插件应用。EMQ 消息服务器通过插件扩展认证、定制功能,插件置于 plugins/ 目录下。

plugins list 列出全部插件(Plugin)
plugins load <Plugin> 加载插件(Plugin)
plugins unload <Plugin> 卸载插件(Plugin)

plugins list

列出全部插件:

$ ./bin/emqttd_ctl plugins list

Plugin(emqttd_dashboard, version=0.16.0, description=emqttd web dashboard, active=true)
Plugin(emqttd_plugin_mysql, version=0.16.0, description=emqttd Authentication/ACL with MySQL, active=false)
Plugin(emqttd_plugin_pgsql, version=0.16.0, description=emqttd PostgreSQL Plugin, active=false)
Plugin(emqttd_plugin_redis, version=0.16.0, description=emqttd Redis Plugin, active=false)
Plugin(emqttd_plugin_template, version=0.16.0, description=emqttd plugin template, active=false)
Plugin(emqttd_recon, version=0.16.0, description=emqttd recon plugin, active=false)
Plugin(emqttd_stomp, version=0.16.0, description=Stomp Protocol Plugin for emqttd broker, active=false)

插件属性:

version 插件版本
description 插件描述
active 是否已加载

load <Plugin>

加载插件:

$ ./bin/emqttd_ctl plugins load emq_recon

Start apps: [recon,emq_recon]
Plugin emqttd_recon loaded successfully.

unload <Plugin>

卸载插件:

$ ./bin/emqttd_ctl plugins unload emq_recon

Plugin emq_recon unloaded successfully.

bridges 命令

bridges 命令用于在多台 EMQ 服务器节点间创建桥接:

              ---------                     ---------
Publisher --> | node1 | --Bridge Forward--> | node2 | --> Subscriber
              ---------                     ---------
bridges list 查询全部桥接
bridges options 查询创建桥接选项
bridges start <Node> <Topic> 创建桥接
bridges start <Node> <Topic> <Options> 创建桥接并带选项设置
bridges stop <Node> <Topic> 删除桥接

创建一条 emqttd1 -> emqttd2 节点的桥接,转发传感器主题(Topic)消息到 emqttd2:

$ ./bin/emqttd_ctl bridges start emqttd2@127.0.0.1 sensor/#

bridge is started.

$ ./bin/emqttd_ctl bridges list

bridge: emqttd1@127.0.0.1--sensor/#-->emqttd2@127.0.0.1

测试 emqttd1–sensor/#–>emqttd2 的桥接:

#emqttd2节点上

mosquitto_sub -t sensor/# -p 2883 -d

#emqttd1节点上

mosquitto_pub -t sensor/1/temperature -m "37.5" -d

bridge options

查询 bridge 创建选项设置:

$ ./bin/emqttd_ctl bridges options

Options:
  qos     = 0 | 1 | 2
  prefix  = string
  suffix  = string
  queue   = integer
Example:
  qos=2,prefix=abc/,suffix=/yxz,queue=1000

bridges stop <Node> <Topic>

删除 emqttd1–sensor/#–>emqttd2 的桥接:

$ ./bin/emqttd_ctl bridges stop emqttd2@127.0.0.1 sensor/#

bridge is stopped.

vm 命令

vm 命令用于查询 Erlang 虚拟机负载、内存、进程、IO 信息。

vm all 查询 VM 全部信息
vm load 查询 VM 负载
vm memory 查询 VM 内存
vm process 查询 VM Erlang 进程数量
vm io 查询 VM io 最大文件句柄

vm load

查询 VM 负载:

$ ./bin/emqttd_ctl vm load

cpu/load1               : 2.21
cpu/load5               : 2.60
cpu/load15              : 2.36

vm memory

查询 VM 内存:

$ ./bin/emqttd_ctl vm memory

memory/total            : 23967736
memory/processes        : 3594216
memory/processes_used   : 3593112
memory/system           : 20373520
memory/atom             : 512601
memory/atom_used        : 491955
memory/binary           : 51432
memory/code             : 13401565
memory/ets              : 1082848

vm process

查询 Erlang 进程数量:

$ ./bin/emqttd_ctl vm process

process/limit           : 8192
process/count           : 221

vm io

查询 IO 最大句柄数:

$ ./bin/emqttd_ctl vm io

io/max_fds              : 2560
io/active_fds           : 1

trace 命令

trace 命令用于追踪某个客户端或 Topic,打印日志信息到文件。

trace list 查询全部开启的追踪
trace client <ClientId> <LogFile> 开启 Client 追踪,日志到文件
trace client <ClientId> off 关闭 Client 追踪
trace topic <Topic> <LogFile> 开启 Topic 追踪,日志到文件
trace topic <Topic> off 关闭 Topic 追踪

trace client <ClientId> <LogFile>

开启 Client 追踪:

$ ./bin/emqttd_ctl trace client clientid log/clientid_trace.log

trace client clientid successfully.

trace client <ClientId> off

关闭 Client 追踪:

$ ./bin/emqttd_ctl trace client clientid off

stop to trace client clientid successfully.

trace topic <Topic> <LogFile>

开启 Topic 追踪:

$ ./bin/emqttd_ctl trace topic topic log/topic_trace.log

trace topic topic successfully.

trace topic <Topic> off

关闭 Topic 追踪:

$ ./bin/emqttd_ctl trace topic topic off

stop to trace topic topic successfully.

trace list

查询全部开启的追踪:

$ ./bin/emqttd_ctl trace list

trace client clientid -> log/clientid_trace.log
trace topic topic -> log/topic_trace.log

listeners

listeners 命令用于查询开启的 TCP 服务监听器:

$ ./bin/emqttd_ctl listeners

listener on mqtt:api:127.0.0.1:8080
  acceptors       : 4
  max_clients     : 64
  current_clients : 0
  shutdown_count  : []
listener on mqtt:wss:8084
  acceptors       : 4
  max_clients     : 64
  current_clients : 0
  shutdown_count  : []
listener on mqtt:ssl:8883
  acceptors       : 16
  max_clients     : 1024
  current_clients : 0
  shutdown_count  : []
listener on mqtt:ws:8083
  acceptors       : 4
  max_clients     : 64
  current_clients : 0
  shutdown_count  : []
listener on mqtt:tcp:0.0.0.0:1883
  acceptors       : 16
  max_clients     : 102400
  current_clients : 0
  shutdown_count  : []
listener on mqtt:tcp:127.0.0.1:11883
  acceptors       : 16
  max_clients     : 102400
  current_clients : 0
  shutdown_count  : []
listener on dashboard:http:18083
  acceptors       : 2
  max_clients     : 512
  current_clients : 0
  shutdown_count  : []

listener 参数说明:

acceptors TCP Acceptor 池
max_clients 最大允许连接数
current_clients 当前连接数
shutdown_count Socket 关闭原因统计

重启监听端口:

$ ./bin/emqttd_ctl listeners restart mqtt:tcp 0.0.0.0:1883
Restart mqtt:tcp listener on 0.0.0.0:1883 successfully.

停止监听端口:

$ ./bin/emqttd_ctl listeners stop mqtt:tcp 0.0.0.0:1883
Stop mqtt:tcp listener on 0.0.0.0:1883 successfully.

mnesia 命令

查询 mnesia 数据库系统状态。

admins 命令

Dashboard 插件会自动注册 admins 命令,用于创建、删除管理员账号,重置管理员密码。

admins add <Username> <Password> 创建 admin 账号
admins passwd <Username> <Password> 重置 admin 密码
admins del <Username> 删除 admin 账号

admins add

创建 admin 账户:

$ ./bin/emqttd_ctl admins add root public
ok

admins passwd

重置 admin 账户密码:

$ ./bin/emqttd_ctl admins passwd root private
ok

admins del

删除 admin 账户:

$ ./bin/emqttd_ctl admins del root
ok