ホーム >  マイコン > RaspberryPi >  【失敗】ラズパイAIサーバを作る(ストレージサーバ編 保存サーバを冗長化:レプリケーションする)

投稿日:   |  最終更新日:

【失敗】ラズパイAIサーバを作る(ストレージサーバ編 保存サーバを冗長化:レプリケーションする)

RaspberryPiマイコン

ファイル保存用のストレージサーバを作ります。まず、ストレージサーバに使用するラズパイの準備を行います。

ラズパイのストレージサービスを冗長化(レプリケーション)

前回、ラズベリーパイでAIサーバ群を作るにあたりストレージサービスを作りました。今回は、このストレージサービスを2重にして故障に強くする冗長化(レプリケーション)システムを構築します。なお、今まではラズパイ1台でしたがレプリケーション先として2台目のラズパイを用意します。

レプリケーションとは?

データの複製品を作るシステムです。1台目のラズパイにデータを保存したら同時に2台目のラズパイに同じデータを保存します。

失敗について

サービスのインストールはうまく行きました。しかし、肝心のレプリケーションでこけます。SSHが原因のようですが設定方法がわかりません。

引用元

下記の書籍の内容を実践していきます。

CQ出版InterFace2017年8月号『メカニズム丸見え!ラズパイAIサーバを作る 第5回 実際に基本ファイル保存サーバを「冗長化」する』 著者:土屋健氏

準備

用意するものは以下の3点のみです。

  • ネットワーク・インターネット接続環境
  • RaspberryPi3(前回ストレージサービスを立てた1台目)
  • RaspberryPi3(今回の2台目)
  • クライアントPC

ラズベリーパイとクライアントPCの環境を設定します。

①ラズパイの初期設定を行い、IPアドレスを固定します。

ラズパイAIサーバを作る(ストレージサーバ編 ラズパイ準備)

②Go言語をインストールし、ストレージサーバプログラムをセットアップします。

ラズパイAIサーバを作る(ストレージサーバ編 Go言語開発環境作成)

③ストレージサーバが動作するか確認します。

ラズパイAIサーバを作る(ストレージサーバ編 動作確認)

ネットワーク・インターネット接続環境

必要なソフトウェアを入手するため、インターネット環境を用意します。また、ラズパイと通信して操作するためにネットワーク環境が必要です。(※家庭用のルータ・HUBでOK。)


RaspberryPi3(1台目)

ストレージサービスのサーバとしてRaspberryPi3ModelBを使用します。RaspberryPi2ModelBでもかまいません。

RaspberyyPi Raspberry Pi 3 Model B (Element14)
OS RASPBIAN JESSIE LITE
IPアドレス 192.168.11.5

RaspberryPi3(2台目)

もう1台のストレージサービスのサーバです。このラズパイとレプリケーションしますが、ipアドレス以外1台目と全く同じ環境です。

RaspberyyPi Raspberry Pi 3 Model B (Element14)
OS RASPBIAN JESSIE LITE
IPアドレス 192.168.11.6

クライアントPC

操作開発用のクライアントPCを用意します。windowsでもmacでも可能ですが、今回はubuntuを利用します。

OS Ubuntu 16.04.1 LTS 64bit


Myサーバ配布ファイルのダウンロード・配置

ストレージサーバのテンプレートを拝借します。クライアントPCでダウンロードしてLANに接続したラズパイ3にファイルを送ります。

現時点でのラズパイのディレクトリ内容

  • /home/pi/CQ/MyServer/
  • MyStorageServer
  • config.json
  • MyStorageServer
  • MyStorageServer.go
  • README
  • ._README
  • Storager/
  • ._Storage
  • golang
  • go
  • gopath

①ラズパイ側の作業です。以下のように、ホームディレクトリ直下にMyサーバ配布ファイルを配置する場所を作成します。

mkdir ~/CQ/download

「~/」は、ホームディレクトリです。piユーザの場合は、「/home/pi」です。

クライアントにMyサーバ配布ファイルをダウンロードしてラズパイへ転送

①クライアントPCの作業です。土屋健さんが提供するサーバ配布ファイルを拝借(ダウンロード)します。

Myサーバ配布ファイル

②SSH接続ができましたので、以下の「scp」コマンドでファイルをラズパイのディレクトリにコピーします。

scp MyServer-0.3.tar.gz pi@192.168.11.5:~/CQ/download

2台目のラズパイも準備できましたら、同じようにコピーします。

scp MyServer-0.3.tar.gz pi@192.168.11.6:~/CQ/download

冗長化プログラムのビルド

①ストレージサービスを稼働させている場合、停止して下さい。

②CQディレクトリで「Myサーバ配布ファイルのダウンロード・配置」でコピーした冗長化プログラム「MyServer-0.3.tar.gz」を解凍します。また、以下の場所に冗長化プログラムがあるとします。

  • /home/pi/CQ/download/
  • MyServer-0.3.tar.gz

解凍作業

cd /home/pi/CQ
tar zxf /home/pi/CQ/download/MyServer-0.3.tar.gz

③解凍できましたら、以下のように環境設定を行います。

export MYSERVER_ROOT=$HOME/CQ/MyServer
export GOROOT=$MYSERVER_ROOT/golang/go
export GOPATH=$MYSERVER_ROOT/golang/gopath
export PATH=$GOROOT/bin:$PATH

※bashを使って作業している場合、「myserver.env」という設定ファイルを使って以下のコマンドを実行しても同じです。

. /home/pi/CQ/MyServer/myserver.env

④追加パッケージをインストールします。

go get golang.org/x/crypto/ssh
go get github.com/tmc/scp

golang.org/x/crypto/ssh

Go言語のSSHクライアントです。もう2台のラズパイと通信するために使用します。

package ssh

github.com/tmc/scp

sshを使ってサーバにファイルを転送するためのコマンドです。

⑤プログラムをビルドします。

cd /home/pi/CQ/MyServer/MyStorageServer
go build

エラーなくビルドが完了すると、「MyStorageServer」というファイルが生成されます。これでプログラムの更新が完了しました。

⑥config.jsonファイルを編集します。

nano /home/pi/CQ/MyServer/MyStorageServer/config.json

以下の部分を変更します。

{
	"host": "192.168.11.5",
	"data_store": "/home/pi/CQ/MyServer/Storage/DATA/",
	"port": 3001,
〜省略〜
	"api_host":"192.168.11.5",
	"api_port":3001
}

新しく追加された「api_host」「api_port」に対して、hostとportと同じ値を設定します。

冗長化プログラムのビルド(2台目のラズパイ)

1台目のラズパイとipアドレス以外同じ環境にします。

①ラズパイの初期設定を行い、IPアドレスを固定します。

ラズパイAIサーバを作る(ストレージサーバ編 ラズパイ準備)

②Go言語をインストールし、ストレージサーバプログラムをセットアップします。

ラズパイAIサーバを作る(ストレージサーバ編 Go言語開発環境作成)

冗長化プログラムビルド(2台目のラズパイ)

1台目のラズパイと同じ作業内容です。

①ストレージサービスを稼働させている場合、停止して下さい。

②CQディレクトリで「Myサーバ配布ファイルのダウンロード・配置」でコピーした冗長化プログラム「MyServer-0.3.tar.gz」を解凍します。また、以下の場所に冗長化プログラムがあるとします。

  • /home/pi/CQ/download/
  • MyServer-0.3.tar.gz

解凍作業

cd /home/pi/CQ
tar zxf /home/pi/CQ/download/MyServer-0.3.tar.gz

③解凍できましたら、以下のように環境設定を行います。

export MYSERVER_ROOT=$HOME/CQ/MyServer
export GOROOT=$MYSERVER_ROOT/golang/go
export GOPATH=$MYSERVER_ROOT/golang/gopath
export PATH=$GOROOT/bin:$PATH

※bashを使って作業している場合、「myserver.env」という設定ファイルを使って以下のコマンドを実行しても同じです。

. /home/pi/CQ/MyServer/myserver.env

④追加パッケージをインストールします。

go get golang.org/x/crypto/ssh
go get github.com/tmc/scp

⑤プログラムをビルドします。

cd /home/pi/CQ/MyServer/MyStorageServer
go build

エラーなくビルドが完了すると、「MyStorageServer」というファイルが生成されます。これでプログラムの更新が完了しました。

⑥config.jsonファイルを編集します。

nano /home/pi/CQ/MyServer/MyStorageServer/config.json

以下の部分を変更します。

{
	"host": "192.168.11.6",
	"data_store": "/home/pi/CQ/MyServer/Storage/DATA/",
	"port": 3001,
〜省略〜
	"api_host":"192.168.11.6",
	"api_port":3001
}


SSHの設定確認

SSHの設定を行います。Raspbian(OS)がデフォルトの状態の場合は、SSHは既に有効になっていると思いますのでそのままで大丈夫です。ipアドレスは以下のものとします。(※ipアドレスはご自身の環境に合わせて下さい。)

ラズベリーパイ IPアドレス
1台目 192.168.11.5
2台目 192.168.11.6

①1台目にログインします。ここから2台目にログインできるか確認します。

ssh pi@192.168.11.6

②1台目にログインしている状態から、scpで2台目のラズパイにファイルをコピーできるか確認します。

echo "mydata" > /tmp/mydata
scp /tmp/mydata pi@192.168.11.6:/tmp/

③1台目にログインしている状態から、sshで2台目のファイルを削除できることを確認します。

ssh pi@192.168.11.6 rm -rf /tmp/mydata

④2台目のラズパイからも同じ動作確認を行います。

レプリケーションのための追加設定

①config.jsonを変更します。1台目のラズパイは以下のような記述になります。

{
	"host": "192.168.11.5",
	"data_store": "/tmp/Storage/DATA/",
	"port": 3001,
	"html_list_mode": false,
	"servers": [{"host":"192.168.11.5", "port":3001},
		   {"host":"192.168.11.6", "port":3001} ],
	"user": "pi",
	"password": "raspberry",
	"replication_async": true,
	"meta_store": "",
	"api_host":"192.168.11.5",
	"api_port":3001
}

②2台目のラズパイは以下のように設定します。

{
	"host": "192.168.11.6",
	"data_store": "/tmp/Storage/DATA/",
	"port": 3001,
	"html_list_mode": false,
	"servers": [{"host":"192.168.11.6", "port":3001},
		   {"host":"192.168.11.5", "port":3001} ],
	"user": "pi",
	"password": "raspberry",
	"replication_async": true,
	"meta_store": "",
	"api_host":"192.168.11.6",
	"api_port":3001
}

ストレージサービスの起動

2台のラズベリーパイのストレージサービス起動します。

①ログインしてパスを移動します。

cd $HOME/CQ/MyServer/MyStorageServer

②起動コマンドを実行します。

. /start.sh

動作確認

2台のラズベリーパイのストレージサービスを起動したら、動作確認します。今度はクライアントPCで以下の操作を行います。

①ファイルの保存実行します。

echo "test data" > test.data
curl -F name=mydata -F $'file=@test.data' http://192.168.11.5:3001/storage/

②各サーバにデータが保存されていることを確認します。

curl http://192.168.11.5:3001/storage/mydata

test data

③2台目におなじ「mydata」が保存されていればレプリケーション成功でしたが、保存されていません。

curl http://192.168.11.6:3001/storage/mydata

④1台目を通常起動した状態で、コピー時どんなエラーが発生していたか確認しました。

cd /home/pi/CQ/MyServer/MyStorageServer
./MyStorageServer

以下のようなエラーが確認できました。

Failed to dial: ssh: must specify HostKeyCallback

どうもSSHまわりでエラーが出ているようです。これについて現在調査中です。

次回


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告