😊

Riakのローカル環境を整えた時の壁 (7つのデータベース 7つの世界)

2023/08/04に公開

何を書くのか

書籍「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コンテナで構築するかぁと

  1. とりあえず、記事(上記URL)にある通りにDockerfile, compose.yaml, app.rubyを作成
.
├── README.md
├── docker-compose.yml
├── ruby
    ├── Dockerfile
    ├── app.rb
    ├── compose.yaml
  1. 記事にあるコマンドでGemfile作成
  2. 書籍の中に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"
  1. 記事にあるコマンドでRubyGemをインストール
  2. 書籍に書いてあるコードをapp.rubyに記載(接続先のポートはriakコンテナのポートフォワーディング設定によってよしなに変更(↑の記事のままの場合、8098))
  3. 記事に書いてあるコマンドで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