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

推薦する

MySQL 5.7 MGR シングルマスター決定マスターノード方式の詳細説明

当銀行のMGRは年末に開始されます。公式文書を読んだり、毎日テストを受けたりしなければなりません。毎...

リクエストを転送したり、静的リソースファイルにアクセスしたりする複数の場所への nginx の実装

この記事では主に、リクエストを転送したり、静的リソース ファイルにアクセスしたりする nginx の...

Linux で静的ルーティングを追加するための 2 つの実装方法の分析

ルートを追加するコマンド: 1.ルート追加route add -net 192.56.76.0 ne...

Dockerでプロジェクトを実行する方法

1. プロジェクトwarが保存されているディレクトリを入力しますDockerfileを編集する vi...

HTML ヘッド構造

以下では、よく使われるヘッド構造と、各タグや要素の意味や使用シーンを紹介します(この記事は、Yisi...

MySQL で左結合を使用して where 条件を追加する問題の詳細な分析

現在の需要:グループとファクターの 2 つのテーブルがあります。1 つのグループは複数のファクターに...

hrefパラメータ転送における中国語の文字化けについて

パラメータを渡すために href が必要で、パラメータが中国語の場合、文字化けした文字が表示されます...

画像ソーシャルネットワーキングサイトのUIアプリケーションの比較分析(図)

私たちの生活、仕事、勉強において、ソーシャル ネットワークは徐々に将来のインターネット発展のトレンド...

JavaScript 構造化代入の詳細な説明

目次コンセプト配列の分割値を個別に宣言して割り当てるデフォルト値の構造化解除変数値の交換関数によって...

MySQLで更新可能なビューを作成する方法の詳細な説明

この記事では、例を使用して、MySQL で更新可能なビューを作成する方法について説明します。ご参考ま...

Linux ディスク パーティションの実装の原理と方法の分析

覚えて: IDE ディスク: 最初のディスクは hda、2 番目のディスクは hdb...最初のディ...

mysql-5.7.21-winx64 無料インストール版のインストール - Windows チュートリアル詳細説明

1 ダウンロードアドレスは https://dev.mysql.com/downloads/mysq...

Linux インストール MongoDB の起動と一般的な問題の解決

MongoDB のインストール プロセスと問題記録1. MongoDBのインストールMongoDBを...

Docker を使用した Redis マスタースレーブレプリケーションの実践の詳細説明

目次1. 背景2. 操作手順3. Dockerをインストールする4. 主なサービス構成5. サービス...

Jenkins+Docker継続的インテグレーションの実装

目次1. Jenkinsの紹介2. Jenkinsをインストールしてデプロイする1. 環境情報2. ...