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

推薦する

ファイル操作のためのLinuxシステムコール

目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...

MySQL を暗号化および復号化するいくつかの方法 (要約)

目次前面に書かれた双方向暗号化エンコード/デコードAES_ENCRYPT/AES_DECRYPT D...

MYSQL 左結合の最適化 (10 秒から 20 ミリ秒)

目次【機能背景】 [生のSQL] 【独自SQL解析】 【分析手順】 [最適化されたSQL] 【最適化...

CentOS 7.x のマスターおよびスレーブ DNS サーバーの展開

1. 準備例: 2 台のマシン: 192.168.219.146 (マスター)、192.168.21...

MySQL 8.0.20 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.20 winx64 のインストールと設定方法を次のように説明します...

MySQL マスタースレーブレプリケーションプロセスの詳細な説明

1. マスタースレーブレプリケーションとは何ですか?マスター データベースの DDL および DML...

MySQL DEFINER の使用方法の詳細な説明

目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...

Dockerコマンドの自動補完の実装

序文この友人がどれくらいDockerを使っていなかったのかは分かりませんが、突然Dockerコマンド...

CSS初心者向けチュートリアル: 背景画像を画面全体に表示する

インターフェース全体に背景画像を表示したい場合は、当然 body に背景を追加することを考えます。コ...

Vueは秒殺しのカウントダウンコンポーネントを実装する

この記事では、2番目のキルカウントダウンコンポーネントを実装するためのVueの具体的なコードを参考ま...

vue-router を遅延ロードする 3 つの方法のまとめ

遅延読み込みを使用しない 'vue' から Vue をインポートします。 '...

HTML タグ マーキーを使用してスクロール効果を実現する簡単な方法 (必読)

ページの自動スクロール効果は JavaScript で実現できますが、今日偶然、JS 制御なしでさま...

HTML テーブル マークアップ チュートリアル (2): テーブル境界属性 BORDER

デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...

CSS スクロールバースタイル変更コード

CSS スクロールバースタイル変更コード .scroll::-webkit-scrollbar { ...

MySQL の結合クエリとサブクエリの問題

目次複数テーブル結合の基本構文クロス結合と直積現象クロスコネクトデカルト積現象内部結合外部結合左外部...