[关闭]
@Mr-13 2020-10-07T08:14:13.000000Z 字数 8830 阅读 150

工作手机:emq部署

工作手机



一、MQTT简介

  MQTT 是轻量的(Lightweight)、发布订阅模式(PubSub) 的物联网消息协议。而EMQ(Erlang Enterprise Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。
  
  具体可以查看官方文档:https://developer.emqx.io/docs/broker/v3/cn/


二、安装epel

1、什么是epel,为什么要在CentOS安装?

  RHEL以及他的衍生发行版如CentOS、Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpm repository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了;如果既想获得 RHEL 的高质量、高性能、高可靠性,又需要方便易用(关键是免费)的软件包更新功能;那么epel恰恰可以解决这两方面的问题。

什么是EPEL?

  EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。

  如果你知道rpmfusion.org的话,拿 rpmfusion 做比较还是很恰当的,rpmfusion 主要为桌面发行版提供大量rpm包,而EPEL则为服务器版本提供大量的rpm包,而且大多数rpm包在官方 repository 中是找不到的。

  另外一个特点是绝大多数rpm包要比官方repository 的rpm包版本要来得新,比如我前些日子在CentOS上安装的php,RHEL为了稳定性还在延用5.1.6版,我记得这是去年上半年的版本,而php 的最新版本已经到5.3.2,如果在php5.1.6的基础上安装phpmyadmin,则会提示php版本过低,这时候,EPEL中提供的较新php rpm就能很方便的派上用场了。
  

2、下载并安装阿里云的epl源

  1. # root用户下执行
  2. # 创建软件包存放目录并进入
  3. [root@mr13 ~]# mkdir -p /server/tools
  4. [root@mr13 ~]# cd /server/tools/
  5. # 安装wegt
  6. [root@mr13 tools]# yum install -y wget
  7. # 下载epel安装包
  8. # wget https://mirrors.aliyun.com/centos/7.6.1810/extras/x86_64/Packages/epel-release-7-11.noarch.rpm
  9. # 这个下载地址已经失效,使用本地之前已经下载好的包上传安装,上传过程不赘述
  10. # 安装epel
  11. [root@mr13 tools]# rpm -ivh epel-release-7-11.noarch.rpm
  12. # 清除掉之前所有的内容
  13. [root@mr13 tools]# yum clean all
  14. # 安装依赖库:lksctp-tools
  15. # sctp 工具包,以及sctp(流控制传输协议)在arm下的交叉编译后的库文件
  16. [root@mr13 tools]# yum install -y lksctp-tools

.

3、下载并安装emqtt

  1. # root用户下操作
  2. # 下载emqtt安装包
  3. [root@mr13 tools]# wget https://www.emqx.io/downloads/broker/v2.3.11/emqttd-centos7-v2.3.11.el7.centos.x86_64.rpm
  4. # 安装emqtt
  5. [root@mr13 tools]# rpm -ivh emqttd-centos7-v2.3.11.el7.centos.x86_64.rpm


.
  

4、emqtt优化配置

1)、优化全局最大文件句柄数(内核参数)

  1. #
  2. # file-max : 系统级别所有进程可打开的文件数,是内核可分配的最大文件数
  3. # 这个参数直接决定了能连接多少个客户端
  4. #
  5. # The value in file-max denotes the maximum number of file-handles
  6. # that the Linux kernel will allocate. When you get lots of error
  7. # messages about running out of file handles, you might want to
  8. # increase this limit
  9. #
  10. # ---------------------------------------------------------------------------
  11. #
  12. # nr_open : 是单个进程可分配的最大文件数;nr_open 不能大于 file-max
  13. #
  14. # This denotes the maximum number of file-handles a process can
  15. # allocate. Default value is 1024*1024 (1048576) which should be
  16. # enough for most machines. Actual limit depends on RLIMIT_NOFILE
  17. # resource limit.
  18. #
  19. # ---------------------------------------------------------------------------
  20. #
  21. # 可通过如下命令直接修改系统当前的参数,并立即生效;但重启后设置丢失,需要重新配置
  22. #
  23. # sysctl -w fs.file-max=2097152
  24. # sysctl -w fs.nr_open=2097152
  25. # echo 2097152 > /proc/sys/fs/nr_open
  26. #
  27. # ---------------------------------------------------------------------------
  28. #
  29. # 如要持久化,不需要开机重启可使用下列命令进行配置
  30. #
  31. [root@mr13 ~]# echo "fs.file-max = 2097152" >> /etc/sysctl.d/99-sysctl.conf
  32. [root@mr13 ~]# echo "fs.nr_open = 2097152" >> /etc/sysctl.d/99-sysctl.conf
  33. # 重新载入sysctl变量,对系统立即生效
  34. [root@mr13 ~]# sysctl -p
  35. # 执行完成,打印一下当前内核参数,如下图,说明配置已生效

  

  • sysctl 扩展

      sysctl命令用于运行时配置内核参数,这些参数位于 /proc/sys 目录下。sysctl配置与显示在 /proc/sys 目录中的内核参数。可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑 /etc/sysctl.conf 文件,即可手工或自动执行由sysctl控制的功能。

  • 命令格式:

      sysctl [-n] [-e] -w variable=value
      sysctl [-n] [-e] -p (default /etc/sysctl.conf)
      sysctl [-n] [-e] -a

  • 常用参数的意义:
      -w :临时改变某个指定参数的值(系统重启失效),如
         sysctl -w net.ipv4.ip_forward=1
      -a :显示所有的系统参数
      -p :从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载


  • CentOS 7的变化
      在CentOS7下,打开sysctl.conf,如下:

      

      如上图,sysctl相关配置在/etc/sysctl.d目录下的*.conf文件中配置即可,可以直接修改 99-sysctl.conf 也可以创建一个新的conf配置文件。执行sysctl -p 的时候,系统会重新加载这些配置内容。

      

.


2)、优化服务最大文件句柄数

  这个参数优化项,可以理解为某个server可以打开的最大文件数量。

  1. # root用户下操作
  2. # 修改 /etc/systemd/system.conf 如下
  3. DefaultLimitCORE=infinity
  4. DefaultLimitNOFILE=1048576
  5. DefaultLimitNPROC=1048576
  6. # 将重新执行systemd 使修改的配置生效
  7. [roor@mr13 ~]# systemctl daemon-reexec
  8. # daemon-reload将重新加载所有单元文件,不是systemd本身的配置。
  9. # systemctl daemon-reexec将重新执行systemd并导致其消化新配置的过程。

  
.


3)、优化(用户)打开文件句柄数

  limits.conf 和sysctl.conf区别在于:
  /etc/security/limits.conf 是针对用户;
  /etc/sysctl.conf 是针对整个系统(内核)参数配置。

  
  关于上述两个系统配置文件详细参数、以及下面操作的详细解释可参见:《limits.conf和sysctl.conf那些事儿》
  
  ulimit其实就是对单一程序的限制,进程级别的。
  /proc/sys/fs/file-max,该参数指定系统范围内所有进程可以打开的文件句柄的数量限制。

  1. # root用户下操作
  2. # 将每个进程可以打开的文件数目加大到1048576
  3. # 这里的调整方式,只是临时改变了当前系统运行生效的值,重启设置丢失
  4. [root@mr13 ~]# ulimit -n 1048576
  5. # 修改配置文件,使设置永久生效
  6. [root@mr13 ~]# vim /etc/security/limits.conf
  7. # 修改/etc/security/limits.conf配置如下
  8. * soft nofile 1048576
  9. * hard nofile 1048576

  
.


4)、优化TCP协议栈网格参数

  相关优化参数详解参见:《limits.conf和sysctl.conf那些事儿》

  1. # root用户下操作

(1)、

  1. $ echo "net.core.somaxconn = 32768" >> /etc/sysctl.d/99-sysctl.conf
  2. # 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
  3. #
  4. # web 应用中 listen 函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128
  5. # 而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

(2)、

  1. $ echo "net.ipv4.tcp_max_syn_backlog = 16384" >> /etc/sysctl.d/99-sysctl.conf
  2. # 对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。
  3. # 加大该值,可以容纳更多的等待连接的网络连接数。
  4. #
  5. # 同时该参数设置时,应不能比net.core.somaxconn数值大
  6. #
  7. # 默认值:128。推荐修改该,如8192、16384、262144。

(3)、

  1. $ echo "net.ipv4.ip_local_port_range = 1000 65535" >> /etc/sysctl.d/99-sysctl.conf
  2. # 本地发起连接时使用的端口范围,tcp初始化时会修改此值
  3. #
  4. # 默认为:32768 60999。建议至少为1000 65535

(4)、

  1. $ echo "net.core.netdev_max_backlog=16384" >> /etc/sysctl.d/99-sysctl.conf
  2. # 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
  3. #
  4. # 默认值为:1000

(5)、

  1. $ echo "net.core.rmem_default = 262144" >> /etc/sysctl.d/99-sysctl.conf
  2. # 设置 接收 TCP socket的缺省(默认)缓存大小(字节)。
  3. #
  4. # 根据硬件自动生成值为212992

(6)、

  1. $ echo "net.core.wmem_default = 262144" >> /etc/sysctl.d/99-sysctl.conf
  2. # 设置 发送 TCP socket的缺省(默认)缓存大小(字节)。
  3. #
  4. # 根据硬件自动生成值为212992

(7)、

  1. $ echo "net.core.rmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
  2. # 设置 接收 socket的 最大 缓存大小(字节)
  3. #
  4. # 根据硬件自动生成值为212992

(8)、

  1. $ echo "net.core.wmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
  2. # 设置 发送 socket的 最大 缓存大小(字节)
  3. #
  4. # 根据硬件自动生成值为212992

(9)、

  1. $ echo "net.core.optmem_max = 16777216" >> /etc/sysctl.d/99-sysctl.conf
  2. # 表示每个套接字所允许的最大缓冲区的大小。
  3. #
  4. # 默认值为20480,4G内存服务器推荐优化值为81920

(10)、

  1. $ echo "net.ipv4.tcp_rmem = 1024 4096 16777216" >> /etc/sysctl.d/99-sysctl.conf
  2. # 为TCP socket预留用于接收缓冲的内存的设置。
  3. # 此文件中保存有三个值,分别是:
  4. #
  5. # Min:
  6. # 为TCP socket预留用于接收缓冲的内存最小值。
  7. # 每个tcp socket都可以在建立后使用它。
  8. # 即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲
  9. #
  10. # --------------------------------------------------------------------------------------------
  11. #
  12. # Default:
  13. # 为TCP socket预留用于接收缓冲的内存数量,
  14. # 默认情况下该值会影响其它协议使用的net.core.rmem_default 值,一般要低于net.core.rmem_default的值。
  15. # 该值决定了在:
  16. # net.ipv4.tcp_adv_win_scale、
  17. # net.ipv4.tcp_app_win、
  18. # tcp_app_win=0
  19. # 默认值情况下,TCP窗口大小为65535。
  20. #
  21. # --------------------------------------------------------------------------------------------
  22. #
  23. # Max:
  24. # 用于TCP socket接收缓冲的内存最大值。
  25. # 该值不会影响net.core.rmem_max,静态"选择参数SO_SNDBUF则不受该值影响。
  26. #
  27. #
  28. # 根据硬件自动生成值为:4096  87380  6291456。按需修改。

(11)、

  1. $ echo "net.ipv4.tcp_wmem = 1024 4096 16777216" >> /etc/sysctl.d/99-sysctl.conf
  2. # 为TCP socket预留用于发送缓冲的内存的设置。
  3. # 此文件中保存有三个值,分别是:
  4. #
  5. # Min:
  6. # 为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建立后使用它。
  7. #
  8. # --------------------------------------------------------------------------------------------
  9. # Default:
  10. # 为TCP socket预留用于发送缓冲的内存数量,
  11. # 默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。
  12. #
  13. # --------------------------------------------------------------------------------------------
  14. #
  15. # Max:
  16. # 用于TCP socket发送缓冲的内存最大值。
  17. # 该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。
  18. #
  19. # 根据硬件自动生成值为:4096  16384  4194304。按需修改。

(12)、

  1. $ echo "net.ipv4.tcp_fin_timeout = 15" >> /etc/sysctl.d/99-sysctl.conf
  2. # 本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。
  3. #
  4. # 默认值:60。建议修改为30或更低。

(13)、

  1. $ echo "net.ipv4.tcp_max_tw_buckets = 1048576" >> /etc/sysctl.d/99-sysctl.conf
  2. # 系统在同时所处理的最大timewait sockets 数目。
  3. # 如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
  4. #
  5. # 默认值为8192。该参数可以适当调大,同时该不应该比net.ipv4.ip_local_port_range端口范围数值大很多。
  6. #
  7. # 重新载入sysctl变量,对系统立即生效

(14)、

  1. # 重新载入sysctl变量,对系统立即生效
  2. $ sysctl -p

.


5)、优化erlang虚拟机参数

  emqttd消息服务器通过 etc/ 目录下配置文件进行设置,主要配置文件包括:

配置文件 说明
etc/emq.conf 消息服务器配置文件
etc/acl.conf 默认ACL规则配置文件
etc/plugins/*.conf 各类插件配置文件

  可通过 etc/emq.conf 配置文件的node段落设置虚拟机配置

  1. # root用户下操作
  2. # 使用sed命令修改配置文件:/etc/emqttd/emq.conf
  3. sed -ri 's#node.process_limit = 256000#node.process_limit = 2097152#g' /etc/emqttd/emq.conf
  4. sed -ri 's#node.max_ports = 65536#node.max_ports = 1048576#g' /etc/emqttd/emq.conf
  5. sed -ri 's#listener.tcp.external.acceptors = 16#listener.tcp.external.acceptors = 64#g' /etc/emqttd/emq.conf
  6. sed -ri 's#listener.tcp.external.max_clients = 102400#listener.tcp.external.max_clients = 1000000#g' /etc/emqttd/emq.conf
  7. # 说明:
  8. # -r : 使用正则
  9. # -i :在当前行执行操作
  10. # sed 's#AAA#BBB#g' : 文档全局查找AAA并替换为BBB;# 在这里是分隔符(界定符)
  11. # node.process_limit = 2097152 # 为此设置同时存在的进程的最大数量
  12. # node.max_ports = 1048576 # 设置此系统的最大同时存在端口数
  13. # listener.tcp.external.acceptors = 64 # 外部MQTT/TCP侦听器的接受器池
  14. # listener.tcp.external.max_clients = 1000000 # 最大并发MQTT/TCP连接数。

.


6)、emq参数优化

  1. sed -ri 's#listener.tcp.external = 127.0.0.1:1883#listener.tcp.external = 0.0.0.0:1883#g' /etc/emqttd/emq.conf
  2. # listener.tcp.external = 0.0.0.0:1883 # 设置MQTT/TCP的IP地址和端口,允许公网访问

.


5、启动EMQ

  1. [root@mr13 ~]# chmod 1777 /tmp
  2. # 启动emqtt
  3. [root@mr13 ~]# systemctl start emqttd.service
  4. # 查看emqtt运行状态
  5. [root@mr13 ~]# systemctl status emqttd.service

.


6、配置链接用户

  1. # root用户下操作
  2. [root@mr13 ~]# vim /etc/emqttd/plugins/emq_auth_username.conf

  默认配置下,是没有有效可用的账号密码的,如下图:

  
  
  修改配置文件如下,根据需要设置好账号密码:

  

  1. # root用户下操作
  2. # 加载用户插件,使所设置的用户生效
  3. [root@mr13 ~]# emqttd_ctl plugins load emq_auth_username

  
  


7、web管理

  emqttd消息服务器启动后,会默认加载Dashboard插件,启动Web管理控制台。用户可通过Web控制台, 查看服务器运行状态、统计数据、客户端(Client)、会话(Session)、主题(Topic)、订阅(Subscription)。

  控制台地址: http://127.0.0.1:18083
  默认用户: admin,密码:public (127.0.0.1需要修改为自己本机部署的服务器地址)


引用

  CSDN一篇非常不错的EMQTT学习手册:
  emqttd学习教程(一):emqttd安装与部署
  emqttd学习教程(二):emqttd配置说明
  emqttd学习教程(三):emqttd插件详解

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注