2009年05月26日

[Wakame] PostgreSQLもスケール対象へ (4/n)

livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

[Wakame] PostgreSQLもスケール対象へ (3/n)の続編

予告通り、今回はオンラインリカバリを実行してみる。

  • node1(PostgreSQL)
    • オンラインリカバリ用にnode1の鍵作成
    • オンラインリカバリ用にnode2に鍵登録
    • リカバリスクリプト配置
  • pgpool-II
    • 対象ノードを登録
    • pgpool-IIを再起動
    • node2をノードから外す
    • node2に対してリカバリを実行
    • pgbenchしてみる?

作業内容: node1(PostgreSQL)

▼作業が面倒なので、あらかじめUNIXアカウントpostgresになっておく

node1$ sudo su postgres

▼node1の鍵作成

node1$ ssh-keygen -t dsa -N ""
鍵のファイル名を問われるので、デフォルトファイル名で問題なければEnter

▼node2に鍵を登録

node1$ cat /var/lib/postgresql/.ssh/id_dsa.pub | ssh (node2)  "cat >> /var/lib/postgresql/.ssh/authorized_keys"

▼リカバリスクリプト配置

pgpool-IIによるレプリケーションとオンラインリカバリからスクリプトを拝借。

node1$ cd /usr/local/pgsql/data

node1$ chmod +x recovery_1st_stage.sh
node1$ chmod +x recovery_2nd_stage.sh 
node1$ chmod +x pgpool_remote_start 

作業内容: pgpool-II

pgpool-II$ cd /usr/local/pgpool2/etc

pgpool-II$ sudo vi pgpool.conf
listen_addresses = '*'
port = 9999
pcp_port = 9898

# for debian
socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
backend_socket_dir = '/var/run/postgresql'

# Logging directory
logdir = '/tmp'

# pid file name
pid_file_name = '/var/run/postgresql/pgpool.pid'

# Replication mode
replication_mode = true

# Health check user
health_check_user = 'nobody'

# node1
backend_hostname0 = '192.168.1.123'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/usr/local/pgsql/data'

# node2
backend_hostname1 = '192.168.1.124'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data'

recovery_user = 'postgres'

recovery_1st_stage_command = 'recovery_1st_stage.sh'
recovery_2nd_stage_command = 'recovery_2nd_stage.sh'

▼pgpoolを起動

pgpool-II$ sudo -u postgres /usr/local/pgpool2/bin/pgpool -n &

▼pcp_node_infoでノード情報を確認

pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 0
192.168.1.123 5432 1 1073741823.500000
pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1
192.168.1.124 5432 1 1073741823.500000

pgpoolのノード対象となっている事を確認。

この時、node2のPostgreSQLは停止状態にあるにも関わらず、pcp_node_infoではステータスが「1」となっている。 一度pgpoolへ接続すると状態に変化が現れた。

pgpool-II$ psql -h localhost -p 9999

pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 0
192.168.1.123 5432 2 1073741823.500000
pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1
192.168.1.124 5432 3 1073741823.500000

ノードの状態がそれぞれ、node1は「2」、node2は「3」となった。

▼node2をクラスタから切り離す

pgpool-II$ /usr/local/pgpool2/bin/pcp_detach_node 100 192.168.1.122 9898 postgres postgres 1

出力が無いので、無事に切り離されたのかが良く分からない。

pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1
192.168.1.124 5432 3 1073741823.500000

pcp_node_infoで確認してみると、状態は「3」のまま。

▼オンラインリカバリを実行

pgpool-II$ pcp_recovery_node 100 192.168.1.122 9898 postgres postgres 1

メッセージが出力されないので、成功したのか失敗したのかが分かりづらい。

pgpool-II$ ./pcp_node_info 100 192.168.1.122 9898 postgres postgres 1
192.168.1.124 5432 1 1073741823.500000

どうやら成功したようだ。
pgpool-recoveryを使うと簡単にノードを追加出来るね。

今後の予定

  • 図を使ってpgpool-recoveryを使ったオンラインリカバリのまとめ
  • AWS(Amazon EC2, Amazon EBS)を使ってノード増殖検証

関連エントリ





半袖 at 18:00│Comments(0)TrackBack(0)Wakame 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔