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:
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つの方法があります.
  • leave:本ノードはクラスタ
  • を終了する.
  • remove:クラスタから他のノード
  • を削除する
    [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
    

    クラスター脳裂の自動回復プロセス:
  • ノードMnesiaライブラリのinconsistent_を受信Databaseイベント3秒後にクラスタ脳裂の確認を行う.
  • ノードは、クラスタの脳クラックの発生を確認した後、Leaderノード(クラスタの中で最も早い起動ノード)に脳クラックメッセージを報告する.
  • Leaderノードがしばらく遅延した後、すべてのノードがオンライン状態で脳裂ビュー(SplitView)を作成する.
  • Leaderノードは、多数派(majority)パーティションでクラスタ自己治癒のCoordinatorノードを選択する.
  • Coordinatorノード少数派(minority)パーティションノードリカバリクラスタを再起動します.

  • クラスタノードの自動クリア
    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接続を終了する:
  • EMQクラスタノードを作成します.たとえば、
  • ノード
    IPアドレス
    emq1
    192.168.0.2
    emq2
    192.168.0.3
  • 構成/etc/haproxy/haproxy.cfg、例:
    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
    
  • 公式ドキュメント: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、例:
    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;
        }
    }
  • 公式ドキュメント:https://cs.nginx.com/repo_setup
    ノードブリッジ
    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/#