Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

1. はじめに

この記事では、Docker Swarm を使用して Nebula Graph クラスターをデプロイする方法について説明します。

2. 星雲団の構築

2.1 環境整備

機械の準備

ip

メモリ (Gb)

CPU(コア)

192.168.1.166

16

4

192.168.1.167

16

4

192.168.1.168

16

4

インストールする前に、すべてのマシンに Docker がインストールされていることを確認してください。

2.2 スウォームクラスターの初期化

192.168.1.166マシンで実行

$ docker swarm init --advertise-addr 192.168.1.166
Swarm が初期化されました: 現在のノード (dxn1zf6l61qsb1josjja83ngz) がマネージャーになりました。
この Swarm にワーカーを追加するには、次のコマンドを実行します。
 docker swarm 参加 \
 --トークン SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.1.166:2377
 
この Swarm にマネージャーを追加するには、「docker swarm join-token manager」を実行し、指示に従います。

2.3 ワーカーノードへの参加

init コマンド プロンプトに従って、Swarm ワーカー ノードに参加し、それぞれ 192.168.1.167 と 192.168.1.168 で実行します。

docker swarm 参加 \
 --トークン SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.1.166:2377

2.4 クラスターの検証

ドッカーノードls
 
ID ホスト名 ステータス 可用性 マネージャ ステータス エンジン バージョン
h0az2wzqetpwhl9ybu76yxaen * KF2-DATA-166 準備完了 アクティブ 到達可能 18.06.1-ce
q6jripaolxsl7xqv3cmv5pxji KF2-DATA-167 レディアクティブリーダー 18.06.1-ce
h1iql1uvm7123h3gon9so69dy KF2-DATA-168 準備完了 アクティブ 18.06.1-ce

2.5 Dockerスタックを構成する

docker-stack.yml を vi する

以下を設定します

 バージョン: '3.6'
 サービス:
  メタ0:
  画像: vesoft/nebula-metad:nightly
  環境変数:
   - ./nebula.env
  指示:
   - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
   - --local_ip=192.168.1.166
  - --ws_ip=192.168.1.166
  - --port=45500
  - --data_path=/data/meta
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
  制約:
   - ノード.ホスト名 == KF2-DATA-166
 ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.166:11000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
 ポート:
  - 目標: 11000
   公開数: 11000
   プロトコル: tcp
  モード: ホスト
  - ターゲット: 11002
   公開: 11002
   プロトコル: tcp
  モード: ホスト
  - 目標: 45500
   公開数: 45500
  プロトコル: tcp
   モード: ホスト
 ボリューム:
  - データ-metad0:/data/meta
  - ログ-metad0:/logs
 ネットワーク:
  - 星雲ネット
 
 メタ1:
 画像: vesoft/nebula-metad:nightly
  環境変数:
  - ./nebula.env
 指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --local_ip=192.168.1.167
  - --ws_ip=192.168.1.167
  - --port=45500
  - --data_path=/data/meta
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
 展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-167
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.167:11000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
 開始期間: 20秒
  ポート:
  - 目標: 11000
   公開数: 11000
  プロトコル: tcp
   モード: ホスト
  - ターゲット: 11002
   公開: 11002
  プロトコル: tcp
   モード: ホスト
  - 目標: 45500
   公開数: 45500
   プロトコル: tcp
   モード: ホスト
 ボリューム:
  - データメタ1:/data/meta
  - ログ-metad1:/logs
 ネットワーク:
  - 星雲ネット

 メタ2:
  画像: vesoft/nebula-metad:nightly
 環境変数:
  - ./nebula.env
 指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --local_ip=192.168.1.168
  - --ws_ip=192.168.1.168
  - --port=45500
  - --data_path=/data/meta
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-168
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.168:11000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 11000
   公開数: 11000
   プロトコル: tcp
   モード: ホスト
  - ターゲット: 11002
   公開: 11002
   プロトコル: tcp
   モード: ホスト
  - 目標: 45500
   公開数: 45500
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - データメタ2:/data/meta
  - ログ-metad2:/logs
  ネットワーク:
  - 星雲ネット
 
 ストレージd0:
  画像: vesoft/nebula-storaged:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --local_ip=192.168.1.166
  - --ws_ip=192.168.1.166
  - --port=44500
  - --data_path=/data/ストレージ
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-166
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.166:12000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 12000
   出版数: 12000
   プロトコル: tcp
   モード: ホスト
  - ターゲット: 12002
   出版年: 12002
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - データストレージ0:/data/storage
  - ログ保存先0:/logs
  ネットワーク:
  - 星雲ネット
 ストレージd1:
  画像: vesoft/nebula-storaged:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --local_ip=192.168.1.167
  - --ws_ip=192.168.1.167
  - --port=44500
  - --data_path=/data/storage
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-167
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.167:12000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 12000
   出版数: 12000
   プロトコル: tcp
   モード: ホスト
  - ターゲット: 12002
   出版年: 12004
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - データストレージ1:/data/storage
  - ログ保存先1:/logs
  ネットワーク:
  - 星雲ネット
 
 ストレージ2:
  画像: vesoft/nebula-storaged:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --local_ip=192.168.1.168
  - --ws_ip=192.168.1.168
  - --port=44500
  - --data_path=/data/storage
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-168
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.168:12000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 12000
   出版数: 12000
   プロトコル: tcp
   モード: ホスト
  - ターゲット: 12002
   出版年: 12006
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - データストレージ2:/data/storage
  - ログ保存2:/logs
  ネットワーク:
  - 星雲ネット
 グラフd1:
  画像: vesoft/nebula-graphd:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --port=3699
  - --ws_ip=192.168.1.166
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-166
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.166:13000/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 3699
   公開: 3699
   プロトコル: tcp
   モード: ホスト
  - 目標: 13000
   出版数: 13000
   プロトコル: tcp
 # モード: ホスト
  - ターゲット: 13002
   公開: 13002
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - ログ-graphd:/logs
  ネットワーク:
  - 星雲ネット
 
 グラフd2:
  画像: vesoft/nebula-graphd:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --port=3699
  - --ws_ip=192.168.1.167
  - --log_dir=/logs
  - --v=2
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-167
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.167:13001/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 3699
   公開: 3640
   プロトコル: tcp
   モード: ホスト
  - 目標: 13000
   公開: 13001
   プロトコル: tcp
   モード: ホスト
  - ターゲット: 13002
   公開: 13003
   プロトコル: tcp
 # モード: ホスト
  ボリューム:
  - ログ-graphd2:/logs
  ネットワーク:
  - 星雲ネット
 グラフd3:
  画像: vesoft/nebula-graphd:nightly
  環境変数:
  - ./nebula.env
  指示:
  - --meta_server_addrs=192.168.1.166:45500,192.168.1.167:45500,192.168.1.168:45500
  - --port=3699
  - --ws_ip=192.168.1.168
  - --log_dir=/logs
  - --v=0
  - --minloglevel=2
  展開する:
  レプリカ: 1
  再起動ポリシー:
   条件: 失敗時
  配置:
   制約:
   - ノード.ホスト名 == KF2-DATA-168
  依存:
  -メタ0
  -メタ1
  -メタ2
  ヘルスチェック:
  テスト: ["CMD", "curl", "-f", "http://192.168.1.168:13002/status"]
  間隔: 30秒
  タイムアウト: 10秒
  再試行: 3
  開始期間: 20秒
  ポート:
  - 目標: 3699
   公開: 3641
   プロトコル: tcp
   モード: ホスト
  - 目標: 13000
   公開: 13002
   プロトコル: tcp
 # モード: ホスト
  - ターゲット: 13002
   公開: 13004
   プロトコル: tcp
   モード: ホスト
  ボリューム:
  - ログ-graphd3:/logs
  ネットワーク:
  - 星雲ネット
 ネットワーク:
 星雲ネット:
  外部: 真
  取り付け可能: true
  名前: ホスト
 ボリューム:
 データメタ0:
 ログ-metad0:
 データメタ1:
 ログメタ1:
 データメタ2:
 ログメタ2:
 データ保存0:
 ログ保存0:
 データ保存1:
 ログ保存1:
 データ保存2:
 ログ保存2:
 ロググラフ:
 ログ-graphd2:
 ログ-graphd3:
docker-stack.yml

編輯nebula.env

次のコンテンツを追加します

 TZ=UTC
ユーザー=ルート

星雲.env

2.6 星雲クラスターを起動する

docker スタックデプロイ nebula -c docker-stack.yml

3. クラスタ負荷分散と高可用性構成

現在 (1.X) の Nebula Graph クライアントは負荷分散機能を提供しておらず、接続する graphd をランダムに選択するだけです。そのため、本番環境で使用する場合は、負荷分散と高可用性を自分で行う必要があります。

図3.1

展開アーキテクチャ全体は、データ サービス層、負荷分散層、高可用性層の 3 つの層に分かれています。図3.1に示すように

負荷分散層: クライアント要求を負荷分散し、下位のデータサービス層に分配します。

高可用性レイヤー: このレイヤーは、haproxy の高可用性を実装し、負荷分散レイヤーのサービスを確保して、クラスター全体の正常なサービスを保証します。

3.1 負荷分散構成

haproxy は docker-compose を使用して設定されます。次の3つのファイルを個別に編集します

Dockerfileは次の内容を追加します

haproxy:1.7より
 haproxy.cfg をコピー /usr/local/etc/haproxy/haproxy.cfg
エクスポーズ3640

Dockerファイル

docker-compose.ymlに以下を追加します。

 バージョン: "3.2"
 サービス:
 ハプロキシ:
  コンテナ名: haproxy
  建てる: 。
  ボリューム:
  - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
  ポート:
  -3640:3640
  再起動: 常に
  ネットワーク:
  - アプリネット
 ネットワーク:
 アプリネット:
  外部: 真

ドッカーの作成

haproxy.cfgに以下を追加します

グローバル
  デーモン
  マックスコン 30000
  ログ 127.0.0.1 local0 情報
 ログ 127.0.0.1 local1 警告

 デフォルト
 ログ形式 %hr\ %ST\ %B\ %Ts
 ロググローバル
  モード http
  オプション http-keep-alive
  タイムアウト接続 5000ms
  タイムアウトクライアント 10000ms
  タイムアウトサーバー 50000ms
  タイムアウト http-request 20000ms
 
 # 独自のフロントエンドとバックエンドをカスタマイズし、conf を listen する
 #カスタム
 
 graphd-clusterを聞く
  バインド *:3640
  モード TCP
  マックスコン 300
  バランスラウンドロビン
  サーバー server1 192.168.1.166:3699 maxconn 300 チェック
  サーバー server2 192.168.1.167:3699 maxconn 300 チェック
  サーバー server3 192.168.1.168:3699 maxconn 300 チェック
 
 統計を聞く
  バインド *:1080
  統計情報の更新 30秒
  統計 uri /stats

3.2 haproxyを起動する

docker-compose を起動 -d

3.2 高可用性構成

注意: キープアライブを設定するには、事前に VIP (仮想 IP) を用意する必要があります。以下の設定では、192.168.1.99 が仮想 IP です。

192.168.1.166、192.168.1.167、192.168.1.168で次の設定を行います。

keepalivedをインストールする

apt-get update && apt-get upgrade && apt-get install keepalived -y

keepalived 設定ファイル /etc/keepalived/keepalived.conf を変更します (3 台のマシンで次の設定を行い、優先度を決定するために優先度を異なる値に設定する必要があります)

192.168.1.166 マシン構成

 グローバル定義 {
  router_id lb01 #識別情報、名前のみ。
 }
 vrrp_script chk_haproxy {
  スクリプト「killall -0 haproxy」間隔 2
 }
 vrrp_インスタンス VI_1 {
  状態マスター
  インターフェースens160
  仮想ルータID 52
  優先度999
  # MASTERとBACKUPロードバランサー間の同期チェックの時間間隔を秒単位で設定します。advert_int 1
  # 認証タイプとパスワード認証を設定する {
  # 認証タイプを設定します。主なタイプは PASS と AH の 2 つです。auth_type PASS
  # 認証パスワードを設定します。同じ vrrp_instance では、MASTER と BACKUP は正常に通信するために同じパスワードを使用する必要があります。auth_pass amber1
  }
  仮想IPアドレス{
   # 仮想 IP は 192.168.1.99/24、バインドされたインターフェースは ens160、エイリアスは ens169:1、プライマリおよびバックアップ インターフェースは同じです 192.168.1.99/24 dev ens160 label ens160:1
  }
  トラックスクリプト {
   chk_haproxy
  }
 }

167 マシン構成

 グローバル定義 {
  router_id lb01 #識別情報、名前のみ。
 }
 vrrp_script chk_haproxy {
  スクリプト「killall -0 haproxy」間隔 2
 }
 vrrp_インスタンス VI_1 {
  状態 バックアップ
  インターフェースens160
  仮想ルータID 52
  優先度888
  # MASTERとBACKUPロードバランサー間の同期チェックの時間間隔を秒単位で設定します。advert_int 1
  # 認証タイプとパスワード認証を設定する {
  # 認証タイプを設定します。主なタイプは PASS と AH の 2 つです。auth_type PASS
  # 認証パスワードを設定します。同じ vrrp_instance では、MASTER と BACKUP は正常に通信するために同じパスワードを使用する必要があります。auth_pass amber1
  }
  仮想IPアドレス{
   # 仮想 IP は 192.168.1.99/24、バインドされたインターフェースは ens160、エイリアスは ens160:1、プライマリおよびバックアップ インターフェースは同じです 192.168.1.99/24 dev ens160 label ens160:1
  }
  トラックスクリプト {
   chk_haproxy
  }
 }

168 マシン構成

 グローバル定義 {
  router_id lb01 #識別情報、名前のみ。
 }
 vrrp_script chk_haproxy {
  スクリプト「killall -0 haproxy」間隔 2
 }
 vrrp_インスタンス VI_1 {
  状態 バックアップ
  インターフェースens160
  仮想ルータID 52
  優先度777
  # MASTERとBACKUPロードバランサー間の同期チェックの時間間隔を秒単位で設定します。advert_int 1
  # 認証タイプとパスワード認証を設定する {
  # 認証タイプを設定します。主なタイプは PASS と AH の 2 つです。auth_type PASS
  # 認証パスワードを設定します。同じ vrrp_instance では、MASTER と BACKUP は正常に通信するために同じパスワードを使用する必要があります。auth_pass amber1
  }
  仮想IPアドレス{
   # 仮想 IP は 192.168.1.99/24、バインドされたインターフェースは ens160、エイリアスは ens160:1、プライマリおよびバックアップ インターフェースは同じです 192.168.1.99/24 dev ens160 label ens160:1
  }
  トラックスクリプト {
   chk_haproxy
  }
 }

keepalived関連コマンド

# キープアライブを開始する
systemctl 開始キープアライブ
# 起動時にkeepalivedが自動的に起動するようにする systemctl enable keeplived
# keepalivedを再起動する
systemctl を再起動する keepalived

IV. その他

オフラインで展開するにはどうすればいいですか?画像をプライベート画像ライブラリに変更するだけです。ご不明な点がございましたら、お気軽にお問い合わせください。

これで、Docker swarm を使用して Nebula Graph クラスターをすばやくデプロイする方法についての記事は終了です。Docker を使用して Nebula Graph クラスターをデプロイする方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nebula Graphはリスク管理のビジネス慣行を解決します

<<:  MySql のグループ化と各グループからランダムに 1 つのデータを取得する

>>:  シンプルなドラッグ効果を実現するJavaScript

推薦する

純粋な CSS を使用して脈動するローダー効果のソースコードを作成する

効果プレビュー右側の「クリックしてプレビュー」ボタンを押すと現在のページでプレビューが表示され、リン...

MySQLデータベースを誤って削除した後にデータを回復するための手順

日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...

Node.js コンソールで強調表示されたコードを印刷する方法

序文コードを実行してエラーが発生すると、エラーが出力されます。エラーにはスタック情報が含まれており、...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

VMware12 インストール centOS8 構成グラフィック チュートリアルの詳細説明 (vm 仮想マシン インストール centos8 チュートリアル)

数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...

MySQLにおける分散ロックの考え方をDBの助けを借りて詳しく説明します

序文スタンドアロン ロックであっても分散ロックであっても、共有データに基づいて現在の操作の動作を判断...

HTML ul および li タグを使用して画像を表示するサンプル コード

以下のコードをDreamweaverのコードエリアにコピーすると、プレビュー時に以下の画像が表示され...

Linuxで同一ファイルを見つける方法

コンピュータを使用すると、システム内に大量のゴミが生成されます。最も一般的なケースは、同じファイルが...

HTML テーブル マークアップ チュートリアル (1): テーブルの作成

<br />これは 123WORDPRESS.COM が提供する一連のチュートリアルです...

PostgreSQL正規表現の一般的な機能の概要

PostgreSQL正規表現の一般的な機能の概要正規表現は、複雑なデータ処理を必要とするプログラムに...

HTMLフォームアプリケーションにはチェックボックスとラジオボタンの使用が含まれます

チェックボックスやラジオボタンの使用を含むコードをコピーコードは次のとおりです。 <!DOCT...

js でパズルゲームを実装する

この記事では、パズルゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内容は...

複数レベルの複雑な動的ヘッダーの avue-crud 実装例

目次序文バックグラウンドデータの結合フロントエンドデータ表示ページ効果表示Avue.js は、既存の...

MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ

この記事では、MySQL の null (IFNULL、COALESCE、NULLIF) に関連する...

process.env.NODE_ENV 本番環境モードを設定する方法

始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...