我的物联网项目(三十六) 自己搭建MQTT服务器

2018-10-17 16:41:36

MQTT 是轻量的,发布订阅模式的物联网消息协议,做物联网平台基本离不开MQTT,可见它的重要性。公司前期为了快速前进,尽可能的利用现成的成熟的组件,当初服务器选择在阿里云,同样,MQTT也是用阿里云的,除了直接接入方便,它本身提供的可视化后台管理平台也是不错的。随着设备的往上增加,阿里云的MQTT垂直扩展费用越到后面就越高(一个账号下面只能购买一个MQTT),基于成本的控制,决定自己在服务器上搭建MQTT集群,利用廉价的服务器做水平扩展来满足设备的日益增多带来的服务器费用问题。下面这两张图是公司用阿里云MQTT服务器费用的一个走向图:

前期

后期

abc12.png

所以尽早的准备迁移也势在必行,网上大家都推荐EMQ这款百万级分布式开源MQTT消息服务器,它的官网是:www.emqtt.com,看下里面的资料和介绍

abc13.png决定尝试性使用,搭一个简单的集群先测试下。

1软件准备

NGINX:nginx-1.11.0.tar.gz

EMQ:emqx-centos6.8-v3.0-beta.4.x86_64.rpm

2服务器准备

192.168.1.1:NGINX负载均衡

192.168.1.2:EMQ服务器1

192.168.1.3:EMQ服务器2

3安装EMQ

(1) 安装EMQ:

在192.168.1.2和192.168.1.3两台服务器上分别安装EMQ:

rpm -ivh emqttd-centos7-v2.1.2-1.el7.centos.x86_64.rpm

并安装Erlang/OTP R19 依赖 lksctp-tools 库

yum install lksctp-tools

安装后的配置文件目录如下: 

EMQ 配置文件: /etc/emqx/emqx.conf 

插件配置文件: /etc/emqx/plugins/*.conf 

日志文件目录: /var/log/emqx

数据文件目录:/var/lib/emqx

(2) EMQ集群配置

分别修改192.168.1.2和192.168.1.3两台服务器上的emqx.conf配置文件,有四个地方需要修改如下:

第一个地方:节点名称

## Default: emqx@127.0.0.1
node.name = emqx1@192.168.1.2

第二个地方:集群方式采用基于 static 节点列表自动集群

## Default: manual
cluster.discovery = static

第三个地方:集群节点配置

## Value: String
cluster.static.seeds = emqx1@192.168.1.2,emqx2@192.168.1.3

注意:这个地方在哪台服务器配置需要把节点写前面,如在192.168.1.3上配置,cluster.static.seeds = emqx2@192.168.1.3,emqx1@192.168.1.2

第四个地方:用户名密码认证,EMQ配置默认是匿名认证,EMQ的提供MySQL,PostgreSQL,Redis,MongoDB,HTTP,LDAP多种认证插件,这里我们用最简单的账号密码认证方式。

## Value: true | false
allow_anonymous = false

然后再修改/etc/emqx/plugins/emqx_auth_username.conf

auth.user.1.username = admin
auth.user.1.password = admin123

分别在192.168.1.2和192.168.1.3启动EMQ

service emqx start

4安装NGINX

(1) 安装NGINX:

在192.168.1.1安装NGINX:

tar -zxvf nginx-1.11.0.tar.gz
./configure --prefix=/usr/nginx --with-http_ssl_module --with-http_stub_status_module --with-pcre --with-stream
make && make install

注意:安装NGINX,编译过程中开启 --with-stream,tcp转发必须模块

(2) 配置NGINX负载均衡:让所有EMQ节点共用一个入口.即使EMQ有节点无法工作,nginx反向代理的地址依然能正常工作

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream test.abc.com
    {
      server 192.168.1.2:18083;
      server 192.168.1.3:18083;
    }
    server {
        listen       80;
        server_name  test.abc.com;
        location / {
           proxy_pass http://test.abc.com;
        }
    }
}

stream{
	upstream emqt_cluster  
	{
              zone tcp_servers 64k;
		hash $remote_addr;
		server 192.168.1.2:1883 max_fails=2 fail_timeout=30s;
		server 192.168.1.3:1883 max_fails=2 fail_timeout=30s;
	}
	server
	{
		listen  1883;
		proxy_pass emqt_cluster;
	}
 }

5EMQ管理控制台

控制台地址: http://192.168.1.1:18083(或者用域名访问:test.abc.com:18083),默认用户: admin,密码:public

abc151.png

6EMQ部署架构图

abc19.png

(微信打赏)

(支付宝打赏)
原创不易,谢谢赞赏。你的支持就是我的动力,我会更加努力。

第一次做压力测试,发现192.168.1.2和192.168.1.3两台EMQ最大连接数一直都是255,后面才想起nginx装好后没有去配置优化

当今主流云服务器代金劵,优惠折扣最大力度推荐。

阿里云产品1888元服务器代金券大礼包免费领取。

阿里云服务器低门槛上云捷径,普惠上云,云服务器1核1G仅需293元/年。

企业级高性能实例,限时2-5折,限首次购买ECS用户参与,限购4台。

腾讯云代金券新用户满200减150 满500减375 满1000减750 满2000减1500。

腾讯云服务器,数据库热卖云产品3折起,爆品低至1折。

腾讯云业界领先的性价比,0.57元/天起,关注最新活动,免费体验产品。