😊
Riakのローカル環境を整えた時の壁 (7つのデータベース 7つの世界)
何を書くのか
書籍「7つのデータベース 7つの世界」のRiakパートにて、ローカル環境を整える上でやったことと立ちはだかった3つの壁
本題
実行環境
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
Riak動作環境構築
ローカル環境に直接入れたくないし、Dokcerコンテナで環境構築するかぁと
以下、参考にしたリポジトリをcloneしてそのまま利用
Ruby実行環境構築
2日目の初っ端にRiakにデータを入れる用のRubyスクリプトを実行する手順が存在する
Rubyの実行環境もDokcerコンテナで構築するかぁと
- とりあえず、記事(上記URL)にある通りにDockerfile, compose.yaml, app.rubyを作成
.
├── README.md
├── docker-compose.yml
├── ruby
├── Dockerfile
├── app.rb
├── compose.yaml
- 記事にあるコマンドでGemfile作成
- 書籍の中にRiakドライバとjsonドライバが必要と書いてあるのでGemfileに記載
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "riak-client"
gem "json"
- 記事にあるコマンドでRubyGemをインストール
- 書籍に書いてあるコードをapp.rubyに記載(接続先のポートはriakコンテナのポートフォワーディング設定によってよしなに変更(↑の記事のままの場合、
8098
)) - 記事に書いてあるコマンドでapp.rubyを実行
立ちはだかる1つ目の壁(Client.newのArgumentError)
Traceback (most recent call last):
2: from app.rb:5:in `<main>'
1: from app.rb:5:in `new'
/app/vendor/bundle/ruby/2.7.0/gems/riak-client-2.6.0/lib/riak/client.rb:118:in `initialize': [:http_port] are not valid options for Client.new (ArgumentError)
エラーの原因は記載の通りRiak::Client.new()
の引数不正。
なぜ引数不正になるのかというと、riak-clientのバージョンが書籍執筆時と比べて新しくなっており、改修が入っているから
バージョンを古くしてみようということで、Gemfile修正
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
-removed gem "riak-client"
+added gem "riak-client" , "~> 1.2"
gem "json"
そして、app.rubyを実行
立ちはだかる2つ目の壁(コネクションの確立ができない)
/app/vendor/bundle/ruby/2.7.0/gems/riak-client-1.2.0/lib/riak/client.rb:452:in `rescue in recover_from': Failed to open TCP connection to 127.0.0.1:8098 (Connection refused - connect(2) for "127.0.0.1" port 8098) (RuntimeError)
エラーメッセージによると、127.0.0.1:8098に接続しにいって落ちている。
それもそのはず、riak環境とruby環境は別個のコンテナだし、networkも別だから。
それぞれのコンテナを同じnetworkに接続してあげましょうということで、docker-compose.yaml(or compose.yaml)を修正
riak側
version: "3"
services:
coordinator:
中略
volumes:
- schemas:/etc/riak/schemas
+added networks:
+added - riak-kv-docker_coordinator
member:
中略
volumes:
schemas:
external: false
+added networks:
+added riak-kv-docker_coordinator:
+added name: riak-kv
ruby側
version: "3"
services:
ruby:
build:
context: .
dockerfile: ./Dockerfile
volumes:
- type: bind
source: ./
target: /app
+added networks:
+added - riak-kv
+added networks:
+added riak-kv:
+added external: true
app.rubyにホストの指定を追加
-removed client = Riak::Client.new(:http_port => 8098)
+added client = Riak::Client.new(:host => "riak-kv-docker-coordinator-1",:http_port => 8098)
bucket = client.bucket('rooms')
そして、app.rubyを実行
立ちはだかる3つ目の壁(obsoleteのwarning)
/app/vendor/bundle/ruby/2.7.0/gems/riak-client-1.2.0/lib/riak/util/escape.rb:55: warning: URI.escape is obsolete
エラーメッセージによると、riak-client-1.2.0
の中でobsoleteなメソッドを使っているらしい
バージョン新しくするかぁとGemfile修正
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
-removed gem "riak-client" , "~> 1.2"
+added gem "riak-client" , "~> 2.6"
gem "json"
app.rbも修正
require 'rubygems'
require 'riak'
STYLES = %w{single double queen king suite}
-removed client = Riak::Client.new(:host => "riak-kv-docker-coordinator-1",:http_port => 8098)
+added client = Riak::Client.new(nodes:[{:host => "riak-kv-docker-coordinator-1"}])
bucket = client.bucket('rooms')
for floor in 1..100
省略
そして、app.rubyを実行
やっとできた
コメントはお気軽にお願いいたしますm(_ _)m
Discussion