简介
EMQ X 3.0 版本支持基于 Ekka 库的集群自动发现(Autocluster)。Ekka 是为 Erlang/OTP 应用开发的集群管理库,支持 Erlang 节点自动发现(Discovery)、自动集群(Autocluster)、脑裂自动愈合(Network Partition Autoheal)、自动删除宕机节点(Autoclean)。
EMQ X 3.0 支持多种策略自动发现节点创建集群:
策略 | 说明 |
---|---|
manual | 手工命令创建集群 |
static | 静态节点列表自动集群 |
mcast | UDP 组播方式自动集群 |
dns | DNS A 记录自动集群 |
etcd | 通过 etcd 自动集群 |
k8s | Kubernetes 服务自动集群 |
实验目的
实现emqx 3.0版本基于manual、static和etcd策略下的集群功能
实验环境
本实验使用Vagrant搭建实验环境。
Vagrant是构建在虚拟化技术之上的虚拟机运行环境管理工具。通过Vagrant可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。
关于Vagrant的更多信息,大家可以自行参阅官方文档进行学习和安装。
本实验已经提前准备好实验环境,当安装好Vagrant之后,大家可以git clone 该项目,在根目录下将 emqx-learning-cluster-Vagrantfile
重命名为 Vagrantfile
执行 vagrang up
即可启动环境。
PS:第一次启动的时候可能需要特别久的时间,因为要执行下载镜像、clone代码等环节,大家可以耐心等待,不要随意中断进程。
Vagrang可以搭建三台基于 ubuntu 16.04 的EMQ X 3.0 的节点。
节点名 | 主机名(FQDN) | IP 地址 |
---|---|---|
emqx@192.168.233.111 | node1 | 192.168.233.111 |
emqx@192.168.233.112 | node2 | 192.168.233.112 |
emqx@192.168.233.113 | node3 | 192.168.233.113 |
节点名格式: Name@Host, Host必须是IP地址或FQDN(主机名.域名)
使用vagrant status
查看节点的运行状态
$ vagrant status
Current machine states:
node1 running (virtualbox)
node2 running (virtualbox)
node3 running (virtualbox)
This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
可是使用 vagrant ssh node1
进入相应的节点
$ vagrant ssh node1
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-134-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
292 packages can be updated.
0 updates are security updates.
*** System restart required ***
Last login: Thu Sep 13 02:57:22 2018 from 10.0.2.2
vagrant@node1:~$ whoami
vagrant
使用 exit
命令退出Vagrant,返回宿主机。
$ exit
logout
Connection to 127.0.0.1 closed.
关于EMQ X 的项目路径在 ~/emqx
大家可以进入 ~/emqx
继续本次实验。本文后续路径如无特别说明都是基于 ~/emqx
展开的。
开始实验
首先查看 etc/emqx.conf
文件,EMQ X 消息服务器的主要配置文件即本文件。查看node.name
。node.name
的格式要求为 Name@Host, Host必须是IP地址或FQDN(主机名.域名)
,默认为emqx@127.0.0.1
,在环境初始化的时候已经帮大家改成了 emqx@本机ip
的格式
$ vim etc/emqx.conf
## Node name.
##
## See: http://erlang.org/doc/reference_manual/distributed.html
##
## Value: <name>@<host>
##
## Default: emqx@127.0.0.1
node.name = emqx@192.168.233.111
执行 ./bin/emqx console
命令使用控制台调试模式启动,检查 EMQ X 是否可正常启动:
starting emqx on node 'emqx@192.168.233.111'
emqx ctl is starting...[ok]
emqx hook is starting...[ok]
emqx router is starting...[ok]
emqx pubsub is starting...[ok]
emqx stats is starting...[ok]
emqx metrics is starting...[ok]
emqx pooler is starting...[ok]
emqx trace is starting...[ok]
emqx client manager is starting...[ok]
emqx session manager is starting...[ok]
emqx session supervisor is starting...[ok]
emqx wsclient supervisor is starting...[ok]
emqx broker is starting...[ok]
emqx alarm is starting...[ok]
emqx mod supervisor is starting...[ok]
emqx bridge supervisor is starting...[ok]
emqx access control is starting...[ok]
emqx system monitor is starting...[ok]
dashboard:http listen on 0.0.0.0:18083 with 2 acceptors.
mqtt:tcp listen on 0.0.0.0:1883 with 8 acceptors.
mqtt:ssl listen on 0.0.0.0:8883 with 4 acceptors.
mqtt:ws listen on 0.0.0.0:8083 with 4 acceptors.
Erlang MQTT Broker 3.0 is running now
CTRL+C 关闭控制台。守护进程模式启动:
./bin/emqx start
EMQ X 消息服务器进程状态查询:
$ ./bin/emqx_ctl status
Node 'emqx@127.0.0.1' is started
emqx 3.0 is running
停止服务器:
./bin/emqx stop
每次修改了 etc/emqx.conf
文件,都需要手动重启EMQ X
manual 手动创建集群
依次修改三个节点的 etc/emqx.conf
文件
cluster.discovery = manual
在三个节点上依次执行 ./bin/emqx start
启动 EMQ X 服务器
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqx start
emqx 3.0 is started successfully!
在任意一台节点上使用 ./bin/emqttd_ctl cluster join
命令来加入集群
vagrant@node2:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster join
emqx@192.168.233.111
Join the cluster successfully.
Cluster status: [{running_nodes,['emqx@192.168.233.111',
'emqx@192.168.233.112']}]
在另一台节点上也可以使用相同的命令加入集群
vagrant@node3:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster join
emqx@192.168.233.111
Join the cluster successfully.
Cluster status: [{running_nodes,['emqx@192.168.233.111',
'emqx@192.168.233.112',
'emqx@192.168.233.113']}]
查询集群状态
任意节点上可以使用 ./bin/emqttd_ctl cluster status
命令查询集群状态:
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster status
Cluster status: [{running_nodes,['emqx@192.168.233.111',
'emqx@192.168.233.112',
'emqx@192.168.233.113']}]
退出集群
节点退出集群有两种方式:
- 在本节点使用
./bin/emqttd_ctl cluster leave
命令主动退出集群
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster leave
ok
- 在任意节点使用
./bin/emqttd_ctl cluster cluster force-leave
命令删除节点
vagrant@node2:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster force-leave emqx@192.168.233.113
ok
基于 static 节点列表自动集群
依次修改三个节点的 etc/emqx.conf
文件
cluster.discovery = static
##--------------------------------------------------------------------
## Cluster with static node list
## 集群的节点名称
cluster.static.seeds = emqx@192.168.233.113,emqx@192.168.233.112,emqx@192.168.233.111
在三个节点上依次执行 ./bin/emqx start
启动 EMQ X 服务器
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqx start
emqx 3.0 is started successfully!
任意节点上使用 ./bin/emqttd_ctl cluster status
命令查询集群状态:
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster status
Cluster status: [{running_nodes,['emqx@192.168.233.111',
'emqx@192.168.233.112',
'emqx@192.168.233.113']}]
基于 etcd 自动集群
基于etcd的自动集群需要有提供的etcd服务,我们可以使用vagrant快速搭建一个最简单的etcd服务,从而达到自动集群的目的。
使用exit退出vagrant回到宿主机
vagrant@node1:~$ exit
logout
Connection to 127.0.0.1 closed.
新建一个目录用于创建新的虚拟机,进入目录后执行 vagrant init ubuntu/xenial6
命令初始化一个新的 Vagrantfile
$ vagrant init ubuntu/xenial64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
编辑 Vagrantfile
, 将 config.vm.network "private_network", ip: "192.168.33.10"
前面的注释取消掉,如果IP被占用了可以改为其他的IP,我在这里改成了 192.168.233.114
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.233.114"
使用 vagrant up
命令启动虚拟机,并使用 vagrangt ssh
进入虚拟机,因为这次只有一台虚拟机,所以 ssh
命令不需要跟虚拟机名称
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-134-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
0 packages can be updated.
0 updates are security updates.
使用 wget
命令下载压缩包,解压并进入 etcd
目录
vagrant@ubuntu-xenial:~$wget https://github.com/etcd-io/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz
vagrant@ubuntu-xenial:~$ tar -zxvf etcd-v3.3.9-linux-amd64.tar.gz
vagrant@ubuntu-xenial:~$ cd etcd-v3.3.9-linux-amd64/
启动 etcd
, 命令中的IP地址换成自己在 Vagrantfile
中设置的IP。
vagrant@ubuntu-xenial:~/etcd-v3.3.9-linux-amd64$ ./etcd --advertise-client-urls http://192.168.233.114:2379 --listen-client-urls http://192.168.233.114:2379 --listen-peer-urls http://192.168.233.114:2380
保持 etcd
服务不要关闭,新建一个命令行窗口,进入EMQ X 的三台节点,依次修改三个节点的 etc/emqx.conf
文件
cluster.discovery = etcd
##--------------------------------------------------------------------
## Cluster with Etcd
## 刚才设置的etcd服务的ip
cluster.etcd.server = http://192.168.233.114:2379
## 集群名称, 跟 cluster.name 的配置保持一致
cluster.etcd.prefix = emqcl
�
cluster.etcd.node_ttl = 1m
在三个节点上依次执行 ./bin/emqx start
启动 EMQ X 服务器
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqx start
emqx 3.0 is started successfully!
任意节点上使用 ./bin/emqttd_ctl cluster status
命令查询集群状态:
vagrant@node1:~/emqx-rel/_rel/emqx$ ./bin/emqttd_ctl cluster status
Cluster status: [{running_nodes,['emqx@192.168.233.111',
'emqx@192.168.233.112',
'emqx@192.168.233.113']}]
网友评论