Chef11のchef-serverをHA構成にする

はてなブックマーク - Chef11のchef-serverをHA構成にする

Chef11のchef-serverをHA構成にする

はじめに

Chef11はいままでのChefとはserverの構成がガラリと変わり、APIがRubyからErlangに、バックエンドのCouchDBがPostgreSQLになりました。その他はフロントエンドにはnginx、WebUIにunicornRabbitMQSolrはそのまま。

基本的にそのまま使ってて問題ないのだけども、やはりサーバーは壊れるのでバックアップがないと困るよね、ということで調べてもあんまり情報がなかったので、やってみたメモを残します。めんどいのでrootで作業しています。

とりあえずinstallする

先ほどのChef11のWikiにある、Quick Startをみて、Platformにあったパッケージをダウンロード。もしくはInstall Chefというページからダウンロード。Debian6でやりましたが、Ubuntu12用のパッケージではうまく動きませんでしたので、Ubuntu10用のを使いました。11のは知らん。

# wget https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/10.04/x86_64/chef-server_11.0.6-1.ubuntu.10.04_amd64.deb
# dpkg -i chef-server_11.0.6-1.ubuntu.10.04_amd64.deb

PrimaryとSecondary、2台のサーバーに入れましょう。

PostgreSQLのReplication

PostgreSQLはほとんど知らないし、Chef11のパッケージは /opt/chef-server 以下にRubyやGemsやPostgreSQLやその他依存もろもろすっぽり収まって完結しているため、普通にPostgreSQLをinstallした場合とは勝手がちょっと違うので注意が必要です。

Primaryの設定

設定ファイルは /var/opt/chef-server/postgresql/data 以下にあります。まずアクセス許可。SECONDARY_SERVER_IPADDRESSは任意に読み替えてください。サブネットマスクまで必須です。

# echo "host replication repl_user SECONDARY_SERVER_IPADDRESS/0 trust" >> /var/opt/chef-server/postgresql/data/pg_hba.conf

次にReplicationの設定。/var/opt/chef-server/postgresql/data/postgresql.conf をエディタで開いて、以下のようにします。hot_standby = onの設定はここでは意味が無いですが、あとでこのファイルがそのままSecondary側にコピーされるのでここで変えておいて問題ないです。

  • listen_addresses = ‘*’
  • wal_level = hot_standby
  • max_wal_senders = 1
  • hot_standby = on

次にPostgreSQLのシェルに入ってユーザーを作りますが、opscode-pgsqlユーザーにならないとシェルに入れないので面倒です。

# su opscode-pgsql -
$ pgsql postgres -c "CREATE ROLE repl_user LOGIN REPLICATION PASSWORD 'P@ssw0Rd'"

ここまでやったらPostgreSQLを再起動。Chef11のコンポーネントたちは、daemontoolsの下で動いているので普通には再起動できません。が、専用の管理コマンドが用意されているのでそいつを使います。

# chef-server-ctl restart postgresql

Secondaryの設定

Primaryからdebファイルをscpするなりこっちでもwgetするなりして、dpkg -iまでは一緒。installが終わったらPostgreSQLまわりの掃除をします。とりあえず止めて、消す。

# chef-server-ctl stop postgresql
# rm -rf /var/opt/chef-server/postgresql/data

消したらPrimaryからデータを持ってきます。PRIMARY_SERVER_IPADDRESSは任意に読み替えてください。

# /opt/chef-server/embedded/bin/pg_basebackup -x -p 5432 -h PRIMARY_SERVER_IPADDRESS -U repl_user -W -D /var/opt/chef-server/postgresql/data --progress --verbose

終わったらrecovery.confを作ります。sampleからコピって書き換えます。

# cp /opt/chef-server/embedded/share/postgresql/recovery.conf.sample /var/opt/chef-server/postgresql/data/recovery.conf

/var/opt/chef-server/postgresql/data/recovery.conf で最低限以下のようにいじる。application_nameは別になんでもいいっぽいです。

  • standby_mode = on
  • primary_conninfo = ‘host=PRIMARY_SERVER_IPADDRESS port=5432 user=repl_user password=P@ssw0Rd application_name=stby’

あとはrootで作業してしまったのでownerを変えて起動。

# chown -R opscode-pgsql:opscode-pgsql /var/opt/chef-server/postgresql/data
# chef-server-ctl start postgresql

chef-server-ctl tailでログをみたり、chef-server-ctl statusでpostgresqlがrunになっていることを確認できればOKです。また、Primary側で以下のコマンドを叩くことでも確認できます。stateがstreamingになっていればOK。

$ sudo -u opscode-pgsql psql opscode_chef -c "SELECT * FROM pg_stat_replication"

念のためSolrのindexは作りなおしておいたほうがいいです。

# chef-server-ctl reindex

切り替える

さてフェイルオーバーさせてみます。いくつか方法がありますが、とりあえず手動でやります。Secondary側で、opscode-pgsqlユーザーで操作します。SecondaryはRead-Onlyなので、 CREATE TABLE test (i integer) とかやって失敗→切り替え→もっかいやったら成功、でPrimaryになったことを確認できます。

$ /opt/chef-server/embedded/bin/pg_ctl promote -D /var/opt/chef-server/postgresql/data

こんだけ。また2台構成に戻すには、同じ事をやってやればいいはずです。が、時間経ちすぎてWALファイルがなくなっちゃったとか、転送前にコケてて欠落してるとか、そういう場合はその限りではありません。ていうかそれはChefと関係ないんでそっち方面のマニュアルみるなり調べるなりしてください。


comments powered by Disqus