2009年05月26日
[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)を使ってノード増殖検証
関連エントリ
- [Wakame] PostgreSQLもスケール対象へ (1/n)
- [Wakame] PostgreSQLもスケール対象へ (2/n)
- [Wakame] PostgreSQLもスケール対象へ (3/n)