投稿日: | 最終更新日:
【失敗】ラズパイAIサーバを作る(ストレージサーバ編 保存サーバを冗長化:レプリケーションする)
ファイル保存用のストレージサーバを作ります。まず、ストレージサーバに使用するラズパイの準備を行います。
ラズパイのストレージサービスを冗長化(レプリケーション)
前回、ラズベリーパイでAIサーバ群を作るにあたりストレージサービスを作りました。今回は、このストレージサービスを2重にして故障に強くする冗長化(レプリケーション)システムを構築します。なお、今まではラズパイ1台でしたがレプリケーション先として2台目のラズパイを用意します。
レプリケーションとは?
データの複製品を作るシステムです。1台目のラズパイにデータを保存したら同時に2台目のラズパイに同じデータを保存します。
失敗について
サービスのインストールはうまく行きました。しかし、肝心のレプリケーションでこけます。SSHが原因のようですが設定方法がわかりません。
引用元
下記の書籍の内容を実践していきます。
CQ出版InterFace2017年8月号『メカニズム丸見え!ラズパイAIサーバを作る 第5回 実際に基本ファイル保存サーバを「冗長化」する』 著者:土屋健氏
準備
用意するものは以下の3点のみです。
- ネットワーク・インターネット接続環境
- RaspberryPi3(前回ストレージサービスを立てた1台目)
- RaspberryPi3(今回の2台目)
- クライアントPC
ラズベリーパイとクライアントPCの環境を設定します。
①ラズパイの初期設定を行い、IPアドレスを固定します。
→ラズパイAIサーバを作る(ストレージサーバ編 ラズパイ準備)
②Go言語をインストールし、ストレージサーバプログラムをセットアップします。
→ラズパイAIサーバを作る(ストレージサーバ編 Go言語開発環境作成)
③ストレージサーバが動作するか確認します。
ネットワーク・インターネット接続環境
必要なソフトウェアを入手するため、インターネット環境を用意します。また、ラズパイと通信して操作するためにネットワーク環境が必要です。(※家庭用のルータ・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の作業です。土屋健さんが提供するサーバ配布ファイルを拝借(ダウンロード)します。
②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
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まわりでエラーが出ているようです。これについて現在調査中です。
次回
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1