Core + Replicant クラスターの有効化
目的
coreTemplateフィールドを通じて EMQX クラスターの Core ノードを構成します。replicantTemplateフィールドを通じて EMQX クラスターの Replicant ノードを構成します。
Core ノードと Replicant ノード
EMQX クラスター内のノードは、Core ノードまたは Replicant ノードのいずれかの役割を持ちます。
Core ノードはクラスター内のデータ永続化を担当します。
ルーティングテーブル、MQTT クライアントチャネル、保持メッセージ、クラスター設定、アラーム、ダッシュボードのユーザー認証情報など、共有クラスター状態の権威あるソースとして機能します。
Replicant ノードはステートレスとして設計されており、データベース操作には参加しません。
Replicant ノードの追加や削除はクラスターのデータ冗長性に影響を与えません。
典型的な EMQX クラスターにおける Core ノードと Replicant ノード間の通信は、以下の図のように示されます。

EMQX の Core-Replicant アーキテクチャの詳細については、クラスターアーキテクチャ のドキュメントを参照してください。
TIP
- EMQX クラスターには少なくとも 1 つの Core ノードが必要です。
- Replicant ノードを有効にする場合、EMQX Operator 3.0 ではローリングアップデートのために少なくとも 2 つの Core ノードが必要です。
- 高可用性を確保するためには、少なくとも 3 つの Core ノードの稼働を推奨します。
EMQX クラスターの構成
EMQX CRD apps.emqx.io/v3beta1 は、.spec.coreTemplate フィールドを通じて EMQX クラスターの Core ノードを、.spec.replicantTemplate フィールドを通じて Replicant ノードを構成することをサポートしています。
以下の内容を YAML ファイルとして保存し、
kubectl applyでデプロイします。yamlapiVersion: apps.emqx.io/v3beta1 kind: EMQX metadata: name: emqx spec: image: emqx/emqx:6.3.2 config: roots: license: key: "..." coreTemplate: spec: replicas: 2 resources: requests: cpu: 250m memory: 512Mi replicantTemplate: spec: replicas: 3 resources: requests: cpu: 250m memory: 1Gi dashboardServiceTemplate: spec: type: LoadBalancer上記の例では、EMQX CR は 2 つの Core ノードと 3 つの Replicant ノードからなる EMQX クラスターを定義しています。
Core ノードは最低 512Mi のメモリを必要とし、Replicant ノードは最低 1Gi のメモリを必要とします。これらの制約は実際の業務負荷に応じて調整可能です。一般的に、Replicant ノードはすべてのクライアントリクエストを受け入れるため、多数の同時接続に対応するために Replicant ノードのリソースは高めに設定される場合があります。
EMQX Operator は Kubernetes の
scaleサブリソースを通じて Replicant レプリカ数を公開しており、これにより HorizontalPodAutoscaler は Core-Replicant モードの Replicant セットのスケーリングを管理できます。EMQX クラスターが準備完了になるまで待ちます。
kubectl getで EMQX クラスターの状態を確認し、STATUSがReadyになることを確認してください。準備完了までに時間がかかる場合があります。bash$ kubectl get emqx emqx NAME STATUS AGE emqx Ready 10m
EMQX クラスターの確認
EMQX CR の .status フィールドを確認することで、クラスター内のすべてのノード情報を閲覧できます。
$ kubectl get emqx emqx -o json | jq .status.clusterNodes
[
{
"name": "emqx@emqx-core-0.emqx-headless.default.svc.cluster.local",
"podName": "emqx-core-0",
"status": "running",
"otpRelease": "27.3.4.2-6/15.2.7.1",
"role": "core",
"version": "6.3.2",
"sessions": 0,
"connections": 0
},
{
"name": "emqx@emqx-core-1.emqx-headless.default.svc.cluster.local",
"podName": "emqx-core-1",
"status": "running",
"otpRelease": "27.3.4.2-6/15.2.7.1",
"role": "core",
"version": "6.3.2",
"sessions": 0,
"connections": 0
},
{
"name": "emqx@10.244.4.56",
"podName": "emqx-replicant-adcdef012-0",
"status": "running",
"otpRelease": "27.3.4.2-6/15.2.7.1",
"role": "replicant",
"version": "6.3.2",
"sessions": 42,
"connections": 42
},
{
"name": "emqx@10.244.4.57",
"podName": "emqx-replicant-adcdef012-1",
"status": "running",
"otpRelease": "27.3.4.2-6/15.2.7.1",
"role": "replicant",
"version": "6.3.2",
"sessions": 11,
"connections": 11
},
{
"name": "emqx@10.244.4.58",
"podName": "emqx-replicant-adcdef012-2",
"status": "running",
"otpRelease": "27.3.4.2-6/15.2.7.1",
"role": "replicant",
"version": "6.3.2",
"sessions": 13,
"connections": 13
}
]