Emqtt分布クラスタ及びノードブリッジ構築
9065 ワード
目次
ぶんぷクラスタ
[email protected]ノードの設定
[email protected]ノードの設定
ノードのクラスタへの参加
ノードがクラスタを終了する
ノード検出と自動クラスタ
manual手動でクラスタを作成する
staticノードリストに基づく自動クラスタ
mcastマルチキャストに基づく自動クラスタ
DNS Aベースの自動クラスタの記録
etcdベースの自動クラスタ
Kubernetesベースの自動クラスタ
クラスタ脳裂と自動癒合
クラスタノードの自動クリア
ノード間セッション(Session)
ファイアウォールの設定
整合性HashとDHT
ふかへいこう
HAProxy->EMQクラスタ
NGINX Plus->EMQクラスタ
ノードブリッジ
EMQノードブリッジ構成
ぶんぷクラスタ
2台のサーバs 1を配備すると仮定する.emqtt.io, s2.emqtt.ioにクラスタを配備するには:
ノード名
ホスト名(FQDN)
IPアドレス
[email protected]または[email protected]
s1.emqtt.io
192.168.0.10
[email protected]または[email protected]
s2.emqtt.io
192.168.0.20
警告
ノード名のフォーマット:Name@Host,HostはIPアドレスまたはFQDN(ホスト名.ドメイン名)でなければならない.
[email protected]ノードの設定
emqttd/etc/emq.conf:
環境変数を使用することもできます.
警告
ノードがクラスタへの参加を開始すると、ノード名は変更できません.
[email protected]ノードの設定
emqttd/etc/emq.conf:
ノードのクラスタへの参加
2台のノードを起動すると、
[email protected]で指定します.
または、[email protected]で指定します.
任意のノードでクラスタの状態を問合せます.
ノードがクラスタを終了する
ノードがクラスタを終了するには、次の2つの方法があります. leave:本ノードはクラスタ を終了する. remove:クラスタから他のノード を削除する
[email protected]クラスタをアクティブに終了するには、次の手順に従います.
または[email protected]ノードでクラスタから削除[email protected]ノード:
ノード検出と自動クラスタ
EMQ R2.3リリースでは、Ekkaライブラリベースのクラスタ自動検出(Autocluster)がサポートされています.Ekkaは、Erlang/OTPアプリケーション用に開発されたクラスタ管理ライブラリで、Erlangノードの自動検出(Discovery)、自動クラスタ(Autocluster)、脳裂自動癒合(Network Partition Autoheal)、自動ダウンタイムノードの削除(Autoclean)をサポートしています.
EMQ R2.3複数のポリシー自動検出ノードによるクラスタの作成をサポートする.
ポリシー
説明
manual
手動コマンドによるクラスタの作成
static
静的ノードリスト自動クラスタ
mcast
UDPマルチキャスト方式自動クラスタ
dns
DNS Aレコード自動クラスタ
etcd
etcdによる自動クラスタ
k8s
Kubernetesサービス自動クラスタ
manual手動でクラスタを作成する
デフォルトでは、クラスタを手動で作成し、ノードは./bin/emqttd_ctl joinコマンドの追加:
staticノードリストに基づく自動クラスタ
固定ノードのリストを構成し、クラスタを自動的に検出して作成します.
mcastマルチキャストに基づく自動クラスタ
UDPマルチキャストに基づいて、クラスタを自動的に検出して作成します.
DNS Aベースの自動クラスタの記録
DNS Aレコードに基づいてクラスタを自動的に検出し、作成します.
etcdベースの自動クラスタ
etcdに基づいてクラスタを自動的に検出し、作成します.
Kubernetesベースの自動クラスタ
Kubernetesでは、クラスタを自動的に検出して作成します.
クラスタ脳裂と自動癒合
EMQ R2.3リリースでは、クラスタのクラックの自動回復(Network Partition Autoheal)が正式にサポートされています.
クラスター脳裂の自動回復プロセス:ノードMnesiaライブラリのinconsistent_を受信Databaseイベント3秒後にクラスタ脳裂の確認を行う. ノードは、クラスタの脳クラックの発生を確認した後、Leaderノード(クラスタの中で最も早い起動ノード)に脳クラックメッセージを報告する. Leaderノードがしばらく遅延した後、すべてのノードがオンライン状態で脳裂ビュー(SplitView)を作成する. Leaderノードは、多数派(majority)パーティションでクラスタ自己治癒のCoordinatorノードを選択する. Coordinatorノード少数派(minority)パーティションノードリカバリクラスタを再起動します.
クラスタノードの自動クリア
EMQ R2.3リリースでは、クラスタからダウンタイムノードを自動的に削除できます.
ノード間セッション(Session)
EMQメッセージサーバクラスタモードでは、MQTT接続の永続セッション(Session)はノード間で接続される.
たとえば、ロード・バランシングの2台のクラスタ・ノード:node 1とnode 2、同じMQTTクライアントがnode 1に接続され、node 1ノードが永続セッションを作成します.クライアント断線がnode 2に再接続されると、MQTTはnode 2ノードに接続され、永続セッションはnode 1ノードに残ります.
ファイアウォールの設定
クラスタノード間にファイアウォールが存在する場合、ファイアウォールは4369ポートとTCPポートセグメントを開く必要があります.4369はepmdポートマッピングサービスによって使用され、TCPポートセグメントはノード間の接続と通信を確立するために使用される.
ファイアウォールの設置後、EMQは同じポートセグメント、emqttd/etc/emqを配置する必要がある.confファイル:
整合性HashとDHT
NoSQLデータベース領域の分散設計では,一貫性HashやDHTを採用することが多い.EMQメッセージ・サーバ・クラスタ・アーキテクチャは、1000万のルーティングをサポートし、より大きなレベルのクラスタは、一貫性Hash、DHT、またはShard方式でルーティング・テーブルを分割することができる.
ふかへいこう
HAProxy->EMQクラスタ
HAProxyはLBとしてEMQクラスタを配備し、SSL接続を終了する: EMQクラスタノードを作成します.たとえば、 ノード
IPアドレス
emq1
192.168.0.2
emq2
192.168.0.3構成/etc/haproxy/haproxy.cfg、例: 公式ドキュメント:http://cbonte.github.io/haproxy-dconv/1.8/intro.html
NGINX Plus->EMQクラスタ
NGINX Plus製品はEMQクラスタLBとして、SSL接続を終了する: NGINX Plus試用版を登録し、Ubuntuの下でインストールする.https://cs.nginx.com/repo_setup EMQノードクラスタを作成します.たとえば、 ノード
IPアドレス
emq1
192.168.0.2
emq2
192.168.0.3配置/etc/nginx/nginx.conf、例: 公式ドキュメント:https://cs.nginx.com/repo_setup
ノードブリッジ
EMQメッセージサーバはマルチノードブリッジモードの相互接続をサポートする:
ノード間ブリッジはクラスタとは異なり,トピックツリーやルーティングテーブルをコピーせず,ブリッジ規則に従ってMQTTメッセージのみを転送する.
EMQノードブリッジ構成
本機で2つのEMQノードを作成し、ブリッジ転送すべてのセンサ(sensor)トピックメッセージを作成するとします.
目次
ノード
MQTTポート
emqttd1
[email protected]
1883
emqttd2
[email protected]
2883
emqttd 1、emqttd 2ノードを起動します.
Emqttd 1ノードでemqttd 2ブリッジを作成するには、次の手順に従います.
emqttd 1–sensor/#->emqttd 2のブリッジをテストします.
ブリッジを削除するには
ぶんぷクラスタ
[email protected]ノードの設定
[email protected]ノードの設定
ノードのクラスタへの参加
ノードがクラスタを終了する
ノード検出と自動クラスタ
manual手動でクラスタを作成する
staticノードリストに基づく自動クラスタ
mcastマルチキャストに基づく自動クラスタ
DNS Aベースの自動クラスタの記録
etcdベースの自動クラスタ
Kubernetesベースの自動クラスタ
クラスタ脳裂と自動癒合
クラスタノードの自動クリア
ノード間セッション(Session)
ファイアウォールの設定
整合性HashとDHT
ふかへいこう
HAProxy->EMQクラスタ
NGINX Plus->EMQクラスタ
ノードブリッジ
EMQノードブリッジ構成
ぶんぷクラスタ
2台のサーバs 1を配備すると仮定する.emqtt.io, s2.emqtt.ioにクラスタを配備するには:
ノード名
ホスト名(FQDN)
IPアドレス
[email protected]または[email protected]
s1.emqtt.io
192.168.0.10
[email protected]または[email protected]
s2.emqtt.io
192.168.0.20
警告
ノード名のフォーマット:Name@Host,HostはIPアドレスまたはFQDN(ホスト名.ドメイン名)でなければならない.
[email protected]ノードの設定
emqttd/etc/emq.conf:
node.name = [email protected]
node.name = [email protected]
環境変数を使用することもできます.
export [email protected] && ./bin/emqttd start
警告
ノードがクラスタへの参加を開始すると、ノード名は変更できません.
[email protected]ノードの設定
emqttd/etc/emq.conf:
node.name = [email protected]
node.name = [email protected]
ノードのクラスタへの参加
2台のノードを起動すると、
[email protected]で指定します.
$ ./bin/emqttd_ctl cluster join [email protected]
Join the cluster successfully.
Cluster status: [{running_nodes,['[email protected]','[email protected]']}]
または、[email protected]で指定します.
$ ./bin/emqttd_ctl cluster join [email protected]
Join the cluster successfully.
Cluster status: [{running_nodes,['[email protected]','[email protected]']}]
任意のノードでクラスタの状態を問合せます.
$ ./bin/emqttd_ctl cluster status
Cluster status: [{running_nodes,['[email protected]','[email protected]']}]
ノードがクラスタを終了する
ノードがクラスタを終了するには、次の2つの方法があります.
[email protected]クラスタをアクティブに終了するには、次の手順に従います.
$ ./bin/emqttd_ctl cluster leave
または[email protected]ノードでクラスタから削除[email protected]ノード:
$ ./bin/emqttd_ctl cluster remove [email protected]
ノード検出と自動クラスタ
EMQ R2.3リリースでは、Ekkaライブラリベースのクラスタ自動検出(Autocluster)がサポートされています.Ekkaは、Erlang/OTPアプリケーション用に開発されたクラスタ管理ライブラリで、Erlangノードの自動検出(Discovery)、自動クラスタ(Autocluster)、脳裂自動癒合(Network Partition Autoheal)、自動ダウンタイムノードの削除(Autoclean)をサポートしています.
EMQ R2.3複数のポリシー自動検出ノードによるクラスタの作成をサポートする.
ポリシー
説明
manual
手動コマンドによるクラスタの作成
static
静的ノードリスト自動クラスタ
mcast
UDPマルチキャスト方式自動クラスタ
dns
DNS Aレコード自動クラスタ
etcd
etcdによる自動クラスタ
k8s
Kubernetesサービス自動クラスタ
manual手動でクラスタを作成する
デフォルトでは、クラスタを手動で作成し、ノードは./bin/emqttd_ctl joinコマンドの追加:
cluster.discovery = manual
staticノードリストに基づく自動クラスタ
固定ノードのリストを構成し、クラスタを自動的に検出して作成します.
cluster.discovery = static
##--------------------------------------------------------------------
## Cluster with static node list
cluster.static.seeds = [email protected],[email protected]
mcastマルチキャストに基づく自動クラスタ
UDPマルチキャストに基づいて、クラスタを自動的に検出して作成します.
cluster.discovery = mcast
##--------------------------------------------------------------------
## Cluster with multicast
cluster.mcast.addr = 239.192.0.1
cluster.mcast.ports = 4369,4370
cluster.mcast.iface = 0.0.0.0
cluster.mcast.ttl = 255
cluster.mcast.loop = on
DNS Aベースの自動クラスタの記録
DNS Aレコードに基づいてクラスタを自動的に検出し、作成します.
cluster.discovery = dns
##--------------------------------------------------------------------
## Cluster with DNS
cluster.dns.name = localhost
cluster.dns.app = ekka
etcdベースの自動クラスタ
etcdに基づいてクラスタを自動的に検出し、作成します.
cluster.discovery = etcd
##--------------------------------------------------------------------
## Cluster with Etcd
cluster.etcd.server = http://127.0.0.1:2379
cluster.etcd.prefix = emqcl
cluster.etcd.node_ttl = 1m
Kubernetesベースの自動クラスタ
Kubernetesでは、クラスタを自動的に検出して作成します.
cluster.discovery = k8s
##--------------------------------------------------------------------
## Cluster with k8s
cluster.k8s.apiserver = http://10.110.111.204:8080
cluster.k8s.service_name = ekka
## Address Type: ip | dns
cluster.k8s.address_type = ip
## The Erlang application name
cluster.k8s.app_name = ekka
クラスタ脳裂と自動癒合
EMQ R2.3リリースでは、クラスタのクラックの自動回復(Network Partition Autoheal)が正式にサポートされています.
cluster.autoheal = on
クラスター脳裂の自動回復プロセス:
クラスタノードの自動クリア
EMQ R2.3リリースでは、クラスタからダウンタイムノードを自動的に削除できます.
cluster.autoclean = 5m
ノード間セッション(Session)
EMQメッセージサーバクラスタモードでは、MQTT接続の永続セッション(Session)はノード間で接続される.
たとえば、ロード・バランシングの2台のクラスタ・ノード:node 1とnode 2、同じMQTTクライアントがnode 1に接続され、node 1ノードが永続セッションを作成します.クライアント断線がnode 2に再接続されると、MQTTはnode 2ノードに接続され、永続セッションはnode 1ノードに残ります.
node1
-----------
|-->| session |
| -----------
node2 |
-------------- |
client-->| connection |
ファイアウォールの設定
クラスタノード間にファイアウォールが存在する場合、ファイアウォールは4369ポートとTCPポートセグメントを開く必要があります.4369はepmdポートマッピングサービスによって使用され、TCPポートセグメントはノード間の接続と通信を確立するために使用される.
ファイアウォールの設置後、EMQは同じポートセグメント、emqttd/etc/emqを配置する必要がある.confファイル:
## Distributed node port range
node.dist_listen_min = 6369
node.dist_listen_max = 7369
整合性HashとDHT
NoSQLデータベース領域の分散設計では,一貫性HashやDHTを採用することが多い.EMQメッセージ・サーバ・クラスタ・アーキテクチャは、1000万のルーティングをサポートし、より大きなレベルのクラスタは、一貫性Hash、DHT、またはShard方式でルーティング・テーブルを分割することができる.
ふかへいこう
HAProxy->EMQクラスタ
HAProxyはLBとしてEMQクラスタを配備し、SSL接続を終了する:
IPアドレス
emq1
192.168.0.2
emq2
192.168.0.3
listen mqtt-ssl
bind *:8883 ssl crt /etc/ssl/emqttd/emq.pem no-sslv3
mode tcp
maxconn 50000
timeout client 600s
default_backend emq_cluster
backend emq_cluster
mode tcp
balance source
timeout server 50s
timeout check 5000
server emq1 192.168.0.2:1883 check inter 10000 fall 2 rise 5 weight 1
server emq2 192.168.0.3:1883 check inter 10000 fall 2 rise 5 weight 1
source 0.0.0.0 usesrc clientip
NGINX Plus->EMQクラスタ
NGINX Plus製品はEMQクラスタLBとして、SSL接続を終了する:
IPアドレス
emq1
192.168.0.2
emq2
192.168.0.3
stream {
# Example configuration for TCP load balancing
upstream stream_backend {
zone tcp_servers 64k;
hash $remote_addr;
server 192.168.0.2:1883 max_fails=2 fail_timeout=30s;
server 192.168.0.3:1883 max_fails=2 fail_timeout=30s;
}
server {
listen 8883 ssl;
status_zone tcp_server;
proxy_pass stream_backend;
proxy_buffer_size 4k;
ssl_handshake_timeout 15s;
ssl_certificate /etc/emqttd/certs/cert.pem;
ssl_certificate_key /etc/emqttd/certs/key.pem;
}
}
ノードブリッジ
EMQメッセージサーバはマルチノードブリッジモードの相互接続をサポートする:
--------- --------- ---------
Publisher --> | Node1 | --Bridge Forward--> | Node2 | --Bridge Forward--> | Node3 | --> Subscriber
--------- --------- ---------
ノード間ブリッジはクラスタとは異なり,トピックツリーやルーティングテーブルをコピーせず,ブリッジ規則に従ってMQTTメッセージのみを転送する.
EMQノードブリッジ構成
本機で2つのEMQノードを作成し、ブリッジ転送すべてのセンサ(sensor)トピックメッセージを作成するとします.
目次
ノード
MQTTポート
emqttd1
[email protected]
1883
emqttd2
[email protected]
2883
emqttd 1、emqttd 2ノードを起動します.
cd emqttd1/ && ./bin/emqttd start
cd emqttd2/ && ./bin/emqttd start
Emqttd 1ノードでemqttd 2ブリッジを作成するには、次の手順に従います.
$ ./bin/emqttd_ctl bridges start [email protected] sensor/#
bridge is started.
$ ./bin/emqttd_ctl bridges list
bridge: [email protected]/#-->[email protected]
emqttd 1–sensor/#->emqttd 2のブリッジをテストします.
#A emqttd2 , sensor/#
#B emqttd1 , sensor/test
#A sensor/test
ブリッジを削除するには
./bin/emqttd_ctl bridges stop [email protected] sensor/#