Greenplumをサーバ1台で動かす

前回予告しました通りレッツトライ。

Greenplumっていうと外資系の企業のホームページとかエンタープライズ系の技術情報サイトとかでアーキテクチャの話ばっかりで疲れますので、肩の力でも抜いて導入系の記事なんかどうでしょう。水曜どうでしょう

Greenplumは「シェアードナッシング」とか「並列分散DB」とか言われますけど、もちろん1台のサーバで動かすことも可能ですので、まずはそのへんから行きたいと思います。手元に用意するものは特にありません。お使いのラップトップとメールアカウント、インターネットと小額のマネー(EC2を使うので)です。

とりあえずダウンロードする

http://www.greenplum.com/community/downloads/
画面下にスクロールするとLinuxのタブがあるのでそいつを開いて緑色の「Download Software」をクリッコします。メールアカウントとか適当でよいので入力するとすぐにダウンロード用メールが来ます。今回は上から二番目のCentOS5 64bit用(Red Hat Enterprise Linux 5.x / CentOS 5.x (x86 – 64bit) )ってやつにします。
ちなみにご覧の通りVMwareのイメージもありますので、Windows PC上で動かす人もとりあえずこれダウンロードしてLinux動かすこともできます。


EC2でCentOSのサーバを用意する

Amazon EC2はご存知ですか。そうですか。一応説明しておくと仮想サーバを時間課金で利用できるいわゆるクラウドサービスの走りですね。Linuxサーバが別途用意できる人も割愛してください。ただサーバの追加とか試すには仮想環境はもってこいですので一考の価値があります。お金で解決できる問題はお金で解決するのがかっこいい大人ってもんです。嘘です。ただ、常時起動するのでもなければ10台ぐらい動かしてもランチ一回分にもならないと思いますので気にする必要はないんじゃないでしょうか。
ちなみにダウンロードしたCommunity Editionですが、「評価・研究・開発目的に限り」複数ノードでの利用も認められているようです。まーそんな内部でどう使われてるかなんて分かりっこないし落ちてるバイナリを勝手に使ってても(自粛)

AMIはCent5/x86_64またはRHEL5/x86_64の適当なのをスタートさせてください。EBSイメージがよいでしょう。

インスタンスタイプはLarge、インスタンス数1、あとは適当にデフォルトでOKとします。

インストーラをアップロード

起動したサーバにはsshできたでしょうか。
先ほどダウンロードしたzipをscpでアップしておくとよいでしょう。明日は天気でしょう。

インストールする

gpadminユーザ作成

まずはユーザでも作ります。sshした段階でrootだと思うのでgpadminという名前で一般ユーザを作っておきましょう。

インストーラの解凍&実行

ひきつづきrootのままでアップロードしたzipをunzipします。出てきた.binファイルを実行します。jdkインストーラと一緒ですね。

[root@host ~]# unzip greenplum-db-4.0.4.0-build-3-SingleNodeEdition-RHEL5-x86_64.zip 
Archive:  greenplum-db-4.0.4.0-build-3-SingleNodeEdition-RHEL5-x86_64.zip
  inflating: README_INSTALL          
  inflating: greenplum-db-4.0.4.0-build-3-SingleNodeEdition-RHEL5-x86_64.bin  
[root@host ~]# ./greenplum-db-4.0.4.0-build-3-SingleNodeEdition-RHEL5-x86_64.bin 

ライセンス条項が出てくるので良い子のみんなはちゃんと最後まで読んで、良くない子は適当に読み流してあとは"yes"を連発すればOK. /usr/local/greenplum-db-4.0.4.0/以下にクリーンインストールされましたとさ。/usr/local/greenplum-db/がシンボリックリンクになっています。
ちなみにこのあたりはunzipしたファイルREADME_INSTALLにも出てきます。

README_INSTALLに従ってOSパラメータを設定。

/etc/sysctl.confに以下を追記。Cent/RHELならデフォルトそのままでもいけるかも。デフォルトそのままがよさげ。

kernel.sem = 250 64000 100 512
kernel.shmmax = 500000000
kernel.shmmni = 4096kernel.shmall = 4000000000
kernel.sem = 250 64000 100 512
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_max_syn_backlog=4096
net.ipv4.conf.all.arp_filter = 1
net.core.netdev_max_backlog=10000
vm.overcommit_memory=2

念のためここでOS再起動して設定を反映させます。それにしても最近のEC2はOS再起動とかも激っパヤ。

gpadminユーザの設定

greenplumの各種コマンドを実行するのにシェルの設定が必要です。そのためのスクリプトが/usr/local/greenplum-db/greenplum_path.shにありますので、gpadminの$HOME/.bash_profileに追記します。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
source /usr/local/greenplum-db/greenplum_path.sh

ログインしてログアウトするとgpstartとか見えてるはずです。見えてなければ何かおかしいのでご確認よろしこ。

[gpadmin@host ~]$ which gpstart
/usr/local/greenplum-db/bin/gpstart
sshセットアップ

シングルノードでもsshがいります。とりあえず鍵作成。パスフレーズなしでお願いします。できたらlocalhostにログインできるところまで確認よろしこ。

[gpadmin@host ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/gpadmin/.ssh/id_rsa): 
Created directory '/home/gpadmin/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/gpadmin/.ssh/id_rsa.
Your public key has been saved in /home/gpadmin/.ssh/id_rsa.pub.
[gpadmin@host ~]$ cd .ssh
[gpadmin@host .ssh]$ cat id_rsa.pub >> authorized_keys
[gpadmin@host .ssh]$ chmod 600 authorized_keys 
[gpadmin@host .ssh]$ ssh localhost

DBの初期化と起動

データディレクトリ作成

どこでもいいですが、今回は/data/にします。/data/masterをマスタ、/data/segments以下にセグメントサーバのディレクトリです。
それぞれディレクトリ作っときます。

[root@host ~]# mkdir /data/
[root@host ~]# mkdir /data/master /data/segments
[root@host ~]# chown gpadmin.gpadmin /data -R
gpinitsystem

PostgreSQLのinitdbみたいなものがgpinitsystemです。マスタとセグメントサーバの両方を初期化しますので結構大掛かりです。マスタとかセグメントとかの説明を端折りますけど面倒なので。
やることはいっぱいあるので設定ファイルがあります。/usr/local/greenplum-db/docs/cli_help/gp_init_config_exampleをいじればよいです。

[gpadmin@host ~]$ cp /usr/local/greenplum-db/docs/cli_help/gp_init_singlenode_example ~/

中身はディレクトリだけかえます。

59c59
< declare -a DATA_DIRECTORY=(/gpdata1 /gpdata2)
---
> declare -a DATA_DIRECTORY=(/data/segments /data/segments)
74c74
< MASTER_DIRECTORY=/gpmaster
---
> MASTER_DIRECTORY=/data/master

セグメントサーバは2つ作るので同じですが/data/segmentsを2度書いてます。お気になさらずに。

あとはホスト名をファイルにしておくのとssh鍵交換をすませておくこと。

[gpadmin@host ~]$ echo 127.0.0.1 > single_hostlist
[gpadmin@host ~]$ gpssh-exkeys -h 127.0.0.1

gpssh-exkeysで鍵交換を一発解決。ありがちなknown_hosts問題も解消。

実行

作成した設定ファイルは-cオプションでどぞ

[gpadmin@host ~]$ gpinitsystem -c gp_init_singlenode_example

"Greenplum Database instance successfully created."って出ればOK牧場みたいっすよ。
psqlで接続してあげてください。psqlがつながればあとは普通のPostgreSQLと同じなのでcreatedbしたりCREATE TABLEしたりSELECTしたりして玩んでください。あと、マスタディレクトリの場所を環境変数にセットしておかないと次回以降起動できないので忘れずに。

# .bash_profile
export MASTER_DATA_DIRECTORY=/data/master/gpsne-1

ちなみにここにpostgresql.confとか入ってます。興味のある方はぜひ覗いてみるとよいんではないでしょうか。

復習用

gpinitsystemのログは~/gpAdminLogs/に出ます。あとインストールのインストラクションは/usr/local/greenplum-db/docs/GPDB-SingleNodeEdition-QuickStart.pdfにかいてあります。

まとめ

長くなってますが、エッセンスは簡単ですね。EC2起動も入って1時間ぐらいで実現可能なレベルですから。次はマルチサーバ構成にチャレンジしたいです安西先生