クラスターの作成と管理
EMQXクラスターは手動または自動で作成できます。本ページでは、手動クラスタリングと自動クラスタリングの両方の方法について紹介し、これら2つの異なるアプローチを用いたEMQXクラスターの作成と管理方法を案内します。
TIP
クラスター機能は有効なライセンスキーがある場合にのみ利用可能です。
基本概念
EMQXクラスターの基本知識や動作については、Cluster と Architecture をご参照ください。クラスターを作成するには、以下の概念にも慣れておく必要があります。
ノード名
EMQXノードはノード名で識別されます。すべてのノードは name@host
形式の一意なノード名を持ち、host
にはIPアドレスまたは完全修飾ドメイン名(FQDN)を指定します。例:
- サーバー
s1.emqx.io
にデプロイされたEMQXノードの場合、ノード名はemqx@s1.emqx.io
となります。 - このサーバーに静的IP(
192.168.0.10
)がある場合、ノード名はemqx@192.168.0.10
となります。
TIP
EMQXノード名はデータベーススキーマやデータファイルに組み込まれているため変更できません。そのため、EMQXノード名には静的なFQDNの使用を推奨します。
ノード検出
ノード検出はクラスター作成に必要なプロセスであり、個々のEMQXノードが互いに発見し通信できるようにします。場所やIPアドレスに関係なく通信が可能です。
手動クラスタリングと自動クラスタリング
ノード検出の戦略に基づき、クラスター作成方法は手動クラスタリングと自動クラスタリングに分けられます。
手動クラスタリングは、どのノードをクラスターに参加させるかを手動で指定してクラスターを作成する方法です。自動クラスタリングは、複数のEMQXノードが手動設定なしに自動でクラスターを形成できる方法です。自動クラスタリングはクラスター構築の手間を軽減し、ノードの動的な追加や削除を容易にします。EMQXは静的ノードリスト、DNSレコード、etcd、Kubernetesなどに基づく自動クラスタリングをサポートしています。
以下の表は、EMQXがサポートするノード検出戦略とクラスター作成方法の一覧です。
戦略 | 説明 |
---|---|
manual | コマンドで手動でクラスターを作成 |
static | 静的ノードリストによる自動クラスタリング |
dns | DNSのAレコードおよびSRVレコードによる自動クラスタリング |
etcd | etcdによる自動クラスタリング |
k8s | Kubernetesによる自動クラスタリング |
singleton | クラスタリング無効。ノードは他ノードとの接続試行をすべて拒否 |
EMQXはErlang/OTPアプリケーション向けに開発されたEkkaライブラリに基づく自動クラスター作成をサポートしています。EkkaはErlangノードの自動検出(Service Discovery)や自動クラスタリング(Autocluster)に加え、ネットワークパーティションの自動修復(Network Partition Autoheal)やダウンしたノードの自動削除(Autoclean)などの機能も実装しています。
クラスタリング方法は emqx.conf
設定ファイルでノード検出戦略を設定することで指定できます。デフォルトは手動クラスタリングです。
cluster {
## Options: manual | static | dns | etcd | k8s | singleton
discovery_strategy = manual
}
はじめる前に
このセクションでは、クラスター作成前にノードやネットワーク環境をどのように設定するかを案内します。
ノード名の設定
クラスターに参加するノードの名前付け方法を理解しておく必要があります。例えば、s1.emqx.io
と s2.emqx.io
にそれぞれデプロイされた2ノードのクラスターを作成する場合、以下の手順に従います。
1つ目のノードの emqx.conf
にノード名を設定します。
node.name = emqx@s1.emqx.io
ノード名は環境変数で上書きすることも可能です。例えば、docker run
コマンドの -e
オプションや systemd の emqx.service
ファイルで以下のように定義します。
EMQX_NODE__NAME='emqx@s1.emqx.io'
クラスターに参加させる他のノードも同様に設定してください。
これで emqx@s1.emqx.io
と emqx@s2.emqx.io
の2ノードがクラスターに参加する準備ができました。手動または自動でクラスターを作成できます。
ノードクッキーの設定
セキュリティ上の理由から、クラスター参加ノードすべての emqx.conf
でデフォルトのクッキー設定を秘密のクッキーに変更してください。クラスターに参加するすべてのノードは同じ秘密のクッキーを使用する必要があります。マジッククッキーの詳細はDistributed Erlang - Securityをご参照ください。
node {
cookie = "<秘密のクッキー>"
}
ネットワーク環境の設定
ノード間のネットワーク接続が正常に機能していることを確認してください。ノード間にファイアウォールやセキュリティグループがある場合は、内部クラスター通信に必要な以下のポートを開放してください。
- 4370: Erlang分散トランスポートポート
- 5370: クラスターRPCポート(物理マシン環境向け)
- 5369: クラスターRPCポート(Docker環境向け)
1台のサーバーに複数のEMQXノードをデプロイする場合、各ノードは異なるクラスター通信ポートを使用します。ファイアウォール設定の詳細はクラスター内通信ポートをご参照ください。
クイックスタート
このセクションでは、Dockerネットワーク上で2つの異なるクラスタリング方法を使ってクラスターを素早く作成する手順を示します。
TIP
複数の物理マシンにまたがるDocker環境でEMQXを実行しクラスターを形成する場合、追加の設定が必要です。コンテナ内のクラスター通信ポートのマッピングとファイアウォールでのポート開放についてはネットワーク環境の設定を参照してください。
いずれかのノード上で emqx ctl cluster status
コマンドを実行し、クラスター状態を確認します。正常にクラスターが構築されていれば、以下のような情報が出力されます。
$ docker exec -it emqx1 emqx ctl cluster status
Cluster status: #{running_nodes =>
['emqx@node1.emqx.com','emqx@node2.emqx.com'],
stopped_nodes => []}
これで簡単なクラスター作成が完了しました。次に、以下のセクションの指示に従ってクラスター作成方法を選択し、設定やデプロイを行えます。
手動クラスタリング
このセクションでは手動でクラスターを作成する手順を説明します。手動クラスタリングでは、クラスター内の各ノードを手動で設定し、ノード間のネットワーク接続も構築する必要があります。自動クラスタリングに比べて、カスタムネットワークトポロジーの細かい調整が可能であり、自動クラスタリングが利用できないまたは適さない場合に適しています。
TIP
手動クラスタリングはコアノードのみで使用可能です。コア-レプリカノード構成の場合は自動クラスタリングを利用してください。
例えば、emqx@node1.emqx.com
と emqx@node2.emqx.com
の2ノードがある場合、以下の手順で手動クラスタリングを行います。
クラスター検出戦略を
manual
に設定します。bashcluster { ## Options: manual | static | dns | etcd | k8s | singleton discovery_strategy = manual }
2ノードを起動後、いずれかのノードでクラスター参加コマンドを実行します。
bash$ ./bin/emqx ctl cluster join emqx@node1.emqx.com Join the cluster successfully. Cluster status: [{running_nodes,['emqx@node1.emqx.com','emqx@node2.emqx.com']}]
TIP
- このコマンドはクラスターに参加するノード上で実行する必要があります。つまり、招待する側ではなく参加を要求する側で実行します。
emqx@s2.emqx.io
がemqx@s1.emqx.io
に参加すると、ローカルデータはクリアされ、emqx@s1.emqx.io
のデータに同期されます。emqx@s2.emqx.io
が別のクラスターに参加したい場合は、まず現在のクラスターから離脱する必要があります。離脱方法は クラスターからの離脱 を参照してください。
いずれかのノードでクラスター状態を確認します。
bash$ ./bin/emqx ctl cluster status Cluster status: [{running_nodes,['emqx@node1.emqx.com','emqx@node2.emqx.com']}]
これで2ノードのクラスター作成に成功しました。クラスター状態の監視やノード管理については、クラスター状態の照会、クラスターのノード管理、ネットワークプロトコルの設定をご参照ください。
EMQX v5.9.0以降は、EMQXダッシュボードからノードの招待や管理も可能です。詳細はClusterを参照してください。
自動クラスタリング
このセクションでは、各種自動クラスタリング方法によるクラスター作成方法を説明します。
静的ノードリストによる自動クラスタリング
EMQXの静的ノードリストによる自動クラスタリングは、各ノードにあらかじめ定義された静的ノードリストを設定し、起動後にノードリストに基づいて自動的にクラスターを形成する方式です。
静的クラスタリングは、他のネットワークコンポーネントやサービスに依存せず、最も簡単にEMQXクラスターを自動作成できる方法です。各ノードがTCPプロトコルで相互通信できればクラスターを形成可能です。
この機能を有効にするには、emqx.conf
にクラスター方式とノードリストを設定します。
例:
cluster {
discovery_strategy = static
static {
seeds = ["emqx@s1.emqx.io", "emqx@s2.emqx.io"]
}
}
discovery_strategy
はノード検出戦略でstatic
に設定seeds
は配列で、クラスターに参加するノード名を複数カンマ区切りで指定可能
すべてのノードを起動すると、自動的にクラスターが形成されます。
DNSレコードによる自動クラスタリング
DNS(Domain Name System)は、ドメイン名の問い合わせに対して対応するIPアドレス(Aレコード)を返す仕組みです。1つのドメイン名に複数のAレコード(複数IPアドレス)を設定でき、1つの名前に複数のIPを対応させることができます。EMQXのDNS自動クラスタリングはこの1対多のマッピングを利用し、クラスター内のすべてのノードを特定し、各ノードがクラスターに参加できるようにします。
DNSサービスの設定
多くのパブリッククラウドサービスはDNSサービスを提供しています。ドメイン名を割り当てた後、各EMQXノードのIPアドレスをこのドメインのAレコードに追加するだけで設定完了です。プライベートクラウドや内部ネットワークにEMQXをデプロイする場合は、BINDなどのソフトウェアで独自のDNSシステムを構築する必要があります。
DNSレコードによる自動クラスタリングの設定
DNSサービスが準備できたら、emqx.conf
の cluster.dns
設定項目でクラスターに参加するすべてのノードを指定します。
例:
cluster {
discovery_strategy = dns
dns {
name = "localhost"
## DNS AレコードおよびDNS SRVレコードをサポート
record_type = a
}
}
discovery_strategy
はノード検出戦略でdns
に設定cluster.dns.name
は文字列でドメイン名を指定cluster.dns.record_type
は列挙型でa
またはsrv
を指定可能
すべてのノードを起動すると、自動的にクラスターが形成されます。
etcdによる自動クラスタリング
etcd はCoreOSが開発したオープンソースプロジェクトで、分散システムにおけるサービス検出や接続確立に広く利用されています。EMQXの自動クラスタリングに適しています。
ネットワーク内にetcdサーバー(クラスター)を構築すれば、EMQXはetcd経由で自動的にクラスターを作成できます。etcdのインストールや設定方法はetcd Installを参照してください。
etcdによる自動クラスタリングを有効にするには、emqx.conf
の cluster.etcd
設定項目を使用します。
例:
cluster {
discovery_strategy = etcd
etcd {
server = "http://127.0.0.1:2379"
prefix = emqxcl
node_ttl = 1m
}
}
discovery_strategy
はノード検出戦略でetcd
に設定cluster.etcd.server
はetcdサーバーのアドレス。複数ノードはカンマ区切りで指定可能cluster.etcd.prefix
はEMQXサービス検出に使うetcdのキーのプレフィックスcluster.etcd.node_ttl
はetcdキーの有効期限(デフォルトは1m
)
設定完了後、EMQXノードを順次起動し、etcdctlツールでetcdサーバーの変化を確認できます。
$ etcdctl ls /emqxcl/emqxcl --recursive
/emqxcl/emqxcl/nodes
/emqxcl/emqxcl/nodes/emqx@s1.emqx.io
/emqxcl/emqxcl/nodes/emqx@s2.emqx.io
この結果は、すべてのノードが正常に起動し自動的にクラスターに参加したことを示しています。
Kubernetes上での自動クラスタリング
EMQX Kubernetes Operator を使えば、Kubernetes環境でEMQXクラスターを素早く作成・管理でき、デプロイや管理作業を低コストでラベル付け可能な繰り返し作業に変換できます。
自分でEMQXをKubernetes上にデプロイ・管理する場合でも、Kubernetes APIを使ったノード検出と自動クラスタリングが可能です。この機能を使うには、まずEMQX Pod用にRBACを作成し、Kubernetes APIサーバーのendpointsリソースからクラスターのノード情報を取得できるようにします。設定方法はUsing RBAC Authorizationを参照してください。
Kubernetes上のEMQX自動クラスタリングは、emqx.conf
の cluster.k8s
設定項目で設定します。
cluster {
discovery_strategy = k8s
K8s {
apiserver = "http://10.110.111.204:8080"
service_name = emqx
address_type = ip
namespace = default
}
}
discovery_strategy
はノード検出戦略でk8s
に設定cluster.K8s.apiserver
はKubernetes APIエンドポイントURL(デフォルトはhttp://10.110.111.204:8080
)cluster.K8s.service_name
はEMQXサービス名(デフォルトはemqx
)cluster.K8s.address_type
は検出したノードに接続するためのアドレスタイプ(デフォルトはip
、オプションはip
、dns
、hostname
)- [任意]
cluster.K8s.suffix
はノード名のサフィックス。cluster.K8s.address_type
がdns
の場合のみ必要(デフォルトはpod.local
) cluster.K8s.namespace
はKubernetesのネームスペース(文字列、デフォルトはdefault
)
設定後、ノードを順次起動すると自動的にクラスターが形成されます。
TIP
Kubernetes上のEMQX自動クラスタリングでは、FannelプラグインよりもCalicoの使用を推奨します。
クラスターの管理
クラスター作成後は、クラスター状態の監視やノード管理が可能です。
クラスター状態の照会
任意のクラスター内ノードで以下のコマンドを実行し、クラスター状態を照会します。
$ ./bin/emqx ctl cluster status
Cluster status: [{running_nodes,['emqx@s1.emqx.io','emqx@s2.emqx.io']}]
クラスターからの離脱
クラスターから離脱する方法は2通りあります。
cluster leave
コマンドを実行する方法:現在のノードがクラスターから離脱します。他のノードに通知し、クラスター操作への参加を停止します。離脱前に進行中のタスクを完了します。cluster force-leave <node@host>
コマンドを実行する方法:指定したノードをクラスターから強制的に削除します。通常、ノードが故障したり応答しなくなった場合に使用します。
例えば、先ほど作成したクラスターで emqx@s2.emqx.io
が離脱したい場合、emqx@s2.emqx.io
上で以下を実行します。
./bin/emqx ctl cluster leave
または、emqx@s1.emqx.io
上で以下を実行して emqx@s2.emqx.io
をクラスターから削除します。
./bin/emqx ctl cluster force-leave emqx@s2.emqx.io
ネットワークプロトコルの設定
クラスター作成後、ノード間の接続に使用するネットワークプロトコルを設定できます。EMQXはTCPまたはTLSによるノード接続をサポートしています。接続方法は emqx.conf
で設定可能です。
TCP IPv4およびTCP IPv6を使用する場合は、emqx.conf
の cluster.proto_dist
を設定します。
- TCP IPv4:
inet_tcp
(デフォルト) - TCP IPv6:
inet6_tcp
SSLを有効にするには、まず cluster.proto_dist
を inet_tls
に設定し、etc
フォルダ内の ssl_dist.conf
ファイルでTLS証明書を指定します。詳細はUsing TLS for Erlang Distributionを参照してください。