中间件系列——EMQX 的集群搭建

公众号:技术小厨师

关注小厨师,烹饪美味的技术餐

上文回顾

https://mp.weixin.qq.com/s/EChqGD01bkjbxjkOCrrEPg

在上文,我们介绍了 EMQX 的快速上手体验,本文将会延续上文的基础继续介绍 EMQX 的集群搭建。

EMQX 集群配置

按照之前的基础,我们已经为 192.168.100.100 搭建了一个 EMQX,现在我们可以利用 Linux 集群分发机制实现在 192.168.100.101 和 192.168.100.102 上快速部署 EMQX。

如果不清楚如何使用集群分发机制,可以参考下面的文章,

https://mp.weixin.qq.com/s/IWE9rZ1JzF6tr_uqQKWzCg

下面我们只需要使用之前的集群分发脚本,将 emqx 的环境配置与安装目录同步到集群 centos 中,

syncall /etc/profile.d/my_emqx.sh
syncall /opt/module/emqx/

这样对于其他的主机来说,emqx 就已经安装好了,接下来我们就进入集群设置环境。

可能需要让环境变量生效,

source /etc/profile

static 集群

static 集群是通过预先存储在各节点的 EMQX 节点的节点列表来实现集群的发现,配置方法较为简单,我们到 192.168.100.100 的节点配置文件,

# 配置文件在安装目录下的 etc/emqx.conf
vim /opt/module/emqx/etc/emqx.conf

修改文件内容如下,

# 修改集群模式为 static
cluster.discovery = static
# 设置节点发现列表
cluster.static.seeds = emqx@192.168.100.100,emqx@192.168.100.101,emqx@192.168.100.102
# 设置节点名称,请注意,节点标识必须和上面节点发现列表中的一致,否则将无法实现集群节点发现
node.name = emqx@192.168.100.100

保存后,我们就已经成功修改了 192.168.100.100 的节点集群配置,利用集群分发将配置拷贝到其他节点后,我们只需要修改 192.168.100.101 和 192.168.100.102 配置文件中的节点名称即可,

# 101
node.name = emqx@192.168.100.101
# 102
node.name = emqx@192.168.100.102

现在让我们启动集群中的每个节点,

emqx restart

进入控制台,看看效果如何,

image-20220405185135385

可以看到在不同的节点上,监控界面显示的节点数如图所示,说明集群已经启动。

验证集群发布与订阅

我们如果要进一步验证集群功能是否正常,其实也非常简单,我们来测试跨节点的发布订阅功能,

现在让我们使用 MQTTX 工具对 192.168.100.100 节点进行订阅,订阅的主题是 testtopic,

image-20220405190541047

现在我们使用另外一个连接,连接到 192.168.100.101 节点,并向 testtopic 发送消息。

image-20220405191115474

可以看到另外一个连接收到了消息,

image-20220405191145030

配置 Nginx 网关

集群搭建完后,我们的工作并没有结束,我们需要一个提供一个外部的统一的入口。集群通常是部署在内网的,不具备外网 IP,即使外网 IP 可知,让客户端一次性保存所有节点的 IP 也是不现实的,因为节点可能动态横向扩展并。除此之外,我们需要平衡客户端的访问流量,也就是需要做负载均衡。

本节我们选择用 Nginx 来作为 EMQX 集群的网关,最终搭建的效果如下所示,

安装 Nginx

方便起见我们直接这样安装,

yum install -y nginx

读者如果出现 No package nginx available,说明需要配置 epel 源,

yum -y install epel-release 

启动 nginx,

systemctl enable nginx
systemctl start nginx

验证 nginx 是否启动成功,访问 http://192.168.100.100,如果显示以下页面,或者 nginx 首页,则说明 nginx 正常运行,

image-20220405212714044

配置 nginx 负载均衡

如果你是通过 yum 安装 nginx,则配置文件位置为 /etc/nginx/nginx.conf,因为对 emqx 进行反向代理本质上是对 websocket 进行反向代理,我们还需要安装一个插件,

yum install nginx-mod-stream -y
SSL 证书的 nginx 负载均衡配置(推荐)

准备 SSL 证书,如果你只是想要进行尝试,可以申请阿里云免费 SSL 证书,

image-20220406141533852

作者将证书上传到了 /etc/nginx/cert 目录内。

于是在 nginx 配置文件中,我们添加以下配置,

stream {
  # 轮询负载均衡配置
  upstream emqx_cluster {
  	  # nginx 的三个实例
      server 192.168.100.101:1883 max_fails=2 fail_timeout=30s;
      server 192.168.100.102:1883 max_fails=2 fail_timeout=30s;
      server 192.168.100.103:1883 max_fails=2 fail_timeout=30s;
  }

  server {
      # 监听 8883 端口 SSL
      listen 8883 ssl;
      # 反向代理到 emqx_cluster
      proxy_pass emqx_cluster;
      proxy_buffer_size 4k;
      ssl_handshake_timeout 15s;
      # 证书配置
      ssl_certificate     /etc/nginx/cert/nginx.pem;
      ssl_certificate_key /etc/nginx/cert/nginx.key;
  }
}
不带 SSL 的 nginx 负载均衡配置(不推荐)
stream {
  # 轮询负载均衡配置
  upstream emqx_cluster {
  	  # nginx 的三个实例
      server 192.168.100.101:1883 max_fails=2 fail_timeout=30s;
      server 192.168.100.102:1883 max_fails=2 fail_timeout=30s;
      server 192.168.100.103:1883 max_fails=2 fail_timeout=30s;
  }

  server {
      # 监听 8883 端口 SSL
      listen 8883;
      # 反向代理到 emqx_cluster
      proxy_pass emqx_cluster;
      proxy_buffer_size 4k;
  }
}

Nginx 重载配置并验证负载均衡

nginx -s reload

随便打开其中一个节点的 Dashboard,看看集群是否正常运作,

image-20220406142355321

使用 MQTTX 创建 4 个相同的连接,指向 mqtts://192.168.100.100:8883,即 nginx 网关所在的服务节点,

image-20220406142625110

连上四个连接后再次查看 Dashboard,验证负载均衡是否生效,

image-20220406142909550

可以看到 4 个连接通过轮询的负载均衡策略被分配到了 3 个节点,至此我们就建立了如下所示的生产集群。

其他负载均衡策略

在实际生产中,我们除了简单的轮询负载均衡策略之外,我们还有许多选择,我们只需要修改上面的 upstream 配置即可,

随机轮询策略

随机轮询就是从待选列表中随机分配连接,

upstream emqx_cluster {
	  random;
  	  # nginx 的三个实例
      server 192.168.100.101:1883;
      server 192.168.100.102:1883;
      server 192.168.100.103:1883;
}

带权轮询策略

如果部署的服务器存在性能差异,我们可以通过配置权重 weight 来修改轮询的几率,

upstream emqx_cluster {
  	  # nginx 的三个实例
      server 192.168.100.101:1883 weight=1;
      server 192.168.100.102:1883 weight=2;
      server 192.168.100.103:1883 weight=3;
}

least_conn 策略

最小连接数策略,优先分配给获得连接数较少的服务器,

upstream emqx_cluster {
	  least_conn;
  	  # nginx 的三个实例
      server 192.168.100.101:1883;
      server 192.168.100.102:1883;
      server 192.168.100.103:1883;
}

IP Hash 策略

如果有特殊需求,希望同一个客户端连接至同一个服务器,则可以使用 IP Hash 策略。

upstream emqx_cluster {
	  # 指定策略为 ip hash
	  ip_hash;
  	  # nginx 的三个实例
      server 192.168.100.101:1883;
      server 192.168.100.102:1883;
      server 192.168.100.103:1883;
}

其他策略

上面介绍的都是 Nginx 内置的负载均衡策略,其实还有许多通过第三方插件引入的负载均衡策略,比如 fair 等,本文不做过多介绍。

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值