ゆるふわlinux-ha 〜postgresql編〜
DESCRIPTION
過去の仕事でPostgreSQLの冗長化をしたことがあってその時の話をささみ勉強会でお話しました。スライドの他に口頭で喋ってる部分が結構あるので、ちょっとアレですね!とりあえず、手順とかは参考になりますが、具体的な設定値などはちゃんと調べてくださいね!TRANSCRIPT
ゆるふわLinux-HA
~PostgreSQL編~Taro Matsuzawa (Georepublic Japan)
#ssmjp
自己紹介(名前編)
• まつざわたろう aka. btm
• btm = Broken Taro Matsuzawa
• Twitter: smellman
• あだ名: 組長
• 過去にとある組織で組長をしていました
自己紹介(執筆編)
• Firefox 3 Hacks, Firefox Hacks Rebooted (オライリー・ジャパン)
• Software Designで特集数回と半年間の連載
• C Magazineの特集でFirefoxのソースコード解説
自己紹介(趣味)• 音楽はエレクトロニカ、ブレイクコア中心
• Aphex Twin, Venetian Snares, Daedelus etc...
• ラノベ好き
• 年間100冊ぐらいしか読んでないけど
• ゲームはシューティングとRPGが中心
• 怒首領蜂大復活クリアできない...orz
所属• お仕事
• 合同会社Georepublic Japan
• プライベート
• スマートフォン勉強会(すまべん)@関東スタッフ
• 日本UNIXユーザ会幹事
• LL eventスタッフ
職業的な話• 学生時代にアルバイトでGISプログラマ
• 他のアルバイトでデスマーチ経験
• キーボードの上を走る小人さんとか...
• 現在三社目
• 地図系に戻りました(10年ぶり)
エンジニアとして• Linux (1998~)
• Visual Basic(2002~2006)
• Java(2003~)
• Ruby(2009~)
• ちょっとしたネットワーク
お断り• プログラマにネットワークエンジニアの真似事をしてるぐらいの人間です。
• ネットワークを本業としたことは無いです。
• 開発案件のついでにネットワークをやってるだけです。
• 自宅のルータはTimeCapsuleですw
今日のネタ
• PostgreSQL 9.1 の同期レプリケーションとLinux-HAを組み合わせて冗長化した時の話です。
注意• 昨年の12月から今年の1月ごろに前職で実際に構築したネタを元に書いています。
• 覚えてる and 手元にログが残ってる範囲で書いてます。
• デモ機作ろうとしたけど体力がなかったのでデモ機無しで行きます。
Linux-HAとは?
• Linux-HA Project(http://www.linux-ha.org/wiki/Main_Page)が開発、メンテナンスをしている高可用クラスタを構築するプロダクトを中心とした製品群のこと。
• Linux-HA Project以外からリリースされている製品も一般的には含まれます。
Linux-HA
Linux-HA Project以外
• 有名なところではPacemaker(http://
clusterlabs.org/)やDRBD(http://
www.drbd.org/)も一緒に扱われます。
• DRBDはLinux Kernelにマージされています。
Linux-HA Japan
• 国内でLinux-HA関係のプロダクトの開発支援、普及活動を行なっている団体
• 全国各地のOSCに出展・講演を行なっている
• 他にも勉強会の実施、講師として参加などをしている
• 日本語の情報はまずここを
普及活動?
まさかのCV付き
橋本まい 福原香織 新谷良子
田中理恵 丹下桜 日高里菜日高里菜
Linux-HAで何ができる?
何ができる?• 高可用クラスタとして「サービスを止めないシステム」を構築できます。
• サービスを止めないと言ってもいろいろあります。
• Arpanetの通説である核戦争が起きても通信ができるようにというのも一種ですよね...
いろいろ
• Linux-HAもいろんな止めないパターンがある
• 僕が過去に扱ったのは2台でサービスを極力止めないというパターンのみ
• 3台以上とか予算ないもん...
• あくまで僕がやった範囲で話をしますw
極力止めない• 良い物はぶっちゃけ予算がかかる
• サーバに監視ポートとか...
• 案件や人の使い方によってとかも
• タクシー代は出ますよね...
• エンジニアスキルとも兼ね合いです
• 僕には無理ですw
冗長化の方法
DBの冗長化
• PostgreSQLを例にとってもいくつかある
• pg-pool IIなどのミドルウェアを利用
• DRBDを用いてディスクをまるごと冗長化
• PostgreSQL9.1からの同期レプリケーションとLinux-HAを併用するパターン
特徴を知る
• 冗長化の手段は一長一短
• 銀の弾丸は無い
• システムにあったものを選択する
• まぁ普通だよね...(白目
pg-pool IIの例
pg pg
pg-pool
app
書き込みを両方に行なう
pg-pool IIの例
pg pg
pg-pool
app
検索は負荷分散できる
pg-pool IIの例
pg pg
pg-pool
app
pg-poolが障害ポイントに
HDD(master)
DRBD
pg
app
HDD(slave)
pg
HDDまるごと同期する
vip
HDD(master)
DRBD
pg
app
HDD(slave)
pg
PostgreSQLに障害があったら
vip
HDD(master)
DRBD
pg
app
HDD(slave)
pg
同期を停止してSalve側のHDDをマウントしてからPostgreSQLが起動 vip
同期レプリケーション
app
vip
pg pg
書き込みはmasterを通して
slaveへ
同期レプリケーション
app
pg pg
masterに障害があったら
vip
同期レプリケーション
app
pg pg
レプリケーションを停止して
vipを切り替えます vip
切り替え
• DRBDの図及び同期レプリケーションの図でリソースをスイッチさせるのがLinux-HAのプロダクト
• クラスタ制御部とリソース制御部を組み合わせる
クラスタ制御部とリソース制御部
まず知っておくこと
• Linux-HAでは現在クラスタ制御部とリソース制御部が分離されている
• もともとはHeartbeatだけだった
3つのプロダクト• Pacemaker
• リソース制御部
• Heartbeat
• クラスタ制御部
• Corosync
• クラスタ制御部
被ってる
• HeartbeatとCorosyncが同じ役割...
• Heartbeatの歴史を知るとわかりやすい
Heartbeat と CRM
HeartbeatV1
HeartbeatV2
CRM
HeartbeatV3
Pacemaker
Corosync
Common Library
クラスタ制御部
• HeartbeatとCorosyncはどちらを使っても良い
• 特徴に合わせてどちらかを選ぶ
Heartbeat V3
• わりと安定してる
• 多ノードには向いてない
• 3ノード以上は大変らしい
• スプリットブレインに弱い
Corosync
• 若干不安定
• 多ノード構成に強い
• スプリットブレインに強い
どちらを選ぶ?
• 2ノードならHeartbeatがよいかも
• 今回は触ってみたかった(本音)という理由でCorosyncを採用
• Heartbeat V1, V2やってたから飽きたんですよ...(もっと本音)
実際に組んでみよう
注意• 情報が古いです
• 2011年12月ごろの情報にそってます
• Linux-HA Japanのパッケージは使っていません
• 理由は特に無いのですが...
• Resource Agentは本家にはマージされています
• あくまで参考程度です
ネットワーク
DB1 DB2eth0
192.168.1.101
eth1192.168.2.1
eth2192.168.3.1
eth3192.168.4.1
eth0192.168.1.102
eth1192.168.2.2
eth2192.168.3.2
eth3192.168.4.2
vip(master)192.168.1.103
vip(slave)192.168.1.104
1. PostgreSQL 9.1をインストール
2. heartbeat, corosync, pacemakerをインストール
3. PostgreSQL 9.1用のResourceAgentをインストール
4. レプリケーションの設定
5. corosyncの設定
6. crmコマンドからpacemakerの設定
構築手順
PostgreSQLをインストール
# wget http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm# rpm -ivh pgdg-centos91-9.1-4.noarch.rpm# yum update# yum install postgresql91-server.x86_64# /etc/init.d/postgresql-9.1 initdb
PostgreSQL自体が配布しているyumを使うと便利
heartbeat, corosync, pacemaker
# wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-5.noarch.rpm# rpm -ivh epel-release-6-5.noarch.rpm # yum install corosync.x86_64 heartbeat.x86_64 pacemaker.x86_64
Resource Agentの多くがheartbeatパッケージに依存しているため、heartbeatが必要
Resource Agent
# wget https://github.com/t-matsuo/resource-agents/raw/pgsql91/heartbeat/pgsql# mv /usr/lib/ocf/resource.d/heartbeat/pgsql /usr/lib/ocf/resource.d/heartbeat/pgsql.bak# install -m 755 pgsql /usr/lib/ocf/resource.d/heartbeat/
ここから先• ここから先は、PostgreSQL 9.1対応のResource Agentの作者である
t-matsuoさんの PostgreSQL 9.1 ストリーミングレプリケーション対応 リソースエージェント https://github.com/t-matsuo/resource-
agents/wiki/PostgreSQL-9.1-%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%AF%BE%E5%BF%9C-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88 に沿っています
• Linux-HA Japanのパッケージを使っていないなどの差異があります
レプリケーションの設定
• 下記手順で行ないます。1. 同期を行なうためのsshの鍵交換
2. postgresql.confの修正
3. pg_hba.confの修正
鍵交換(DB1からDB2へ鍵を生成してコピー)# su - postgres$ ssh-keygen $ scp .ssh/id_rsa.pub [email protected]:/tmp/db1.pub(DB2で登録)# chmod 666 /tmp/db1.pub# su - postgres$ cat /tmp/db1.pub > .ssh/authorized_keys$ chmod 600 .ssh/authorized_keys
.sshは存在すると仮定、同じ作業をDB2からDB1へも
postgresql.conf(1)
DB1では下記内容を追加listen_addresses = '*'wal_level = hot_standbysynchronous_commit = onarchive_mode = onarchive_command = 'cp %p /var/lib/pgsql/9.1/data/pg_archive/%f && scp -q %p [email protected]:/var/lib/pgsql/9.1/data/pg_archive/%f'max_wal_senders = 5wal_keep_segments = 32replication_timeout = 5000hot_standby = onwal_receiver_status_interval = 2restart_after_crash = offinclude = '/var/lib/pgsql/rep_mode.conf'
postgresql.conf(2)
DB2へscpでコピーしてから archive_commandを編集
archive_command = 'cp %p /var/lib/pgsql/9.1/data/pg_archive/%f && scp -q %p [email protected]:/var/lib/pgsql/9.1/data/pg_archive/%f'
ようするにscpする向き先が変わるという感じ
pg_hba.conf
host all all 192.168.1.0/24 md5host replication all 192.168.2.0/24 trust
replication用にtrustを指定しておく(たぶん他の逃げ方あると思う...)
corosync
# vi /etc/corosync/corosync.conf
totemのinterfaceのbindnetaddrを変更するはず...
...手元に記録がないので割愛...
pacemaker
• crmコマンドで設定ファイルを流しこみます
• 設定ファイルの例は長いのでt-matsuoさんのwikiを参考にしてください
やりかた
# crmcrm(live)# configure crm(live)configure# (ここにコピペ)
crm(live)configure# commit
ステータス(crm_mon -A)============Last updated: Wed Apr 11 16:28:58 2012Last change: Thu Apr 5 01:44:51 2012 via crm_attribute on db1.localdomainStack: openaisCurrent DC: db1.localdomain - partition with quorumVersion: 1.1.6-3.el6-a02c0f19a00c1eb2527ad38f146ebc08348145582 Nodes configured, 2 expected votes7 Resources configured.============
Online: [ db1.localdomain db2.localdomain ]
vip-slave (ocf::heartbeat:IPaddr2): Started db2.localdomain Master/Slave Set: msPostgresql [postgresql] Masters: [ db1.localdomain ] Slaves: [ db2.localdomain ] Clone Set: clnPingCheck [pingCheck] Started: [ db2.localdomain db1.localdomain ] Resource Group: master-group vip-master (ocf::heartbeat:IPaddr2): Started db1.localdomain vip-rep (ocf::heartbeat:IPaddr2): Started db1.localdomain
Node Attributes:* Node db1.localdomain: + default_ping_set : 100 + master-postgresql:1 : 1000 + pgsql-data-status : LATEST + pgsql-master-baseline : 12:0000000030000000 + pgsql-status : PRI* Node db2.localdomain: + default_ping_set : 100 + master-postgresql:0 : 100 + pgsql-data-status : STREAMING|SYNC + pgsql-status : HS:sync
とりあえず• Masterを落とすとSlaveがMasterに昇格したりします。
• あたりまえだ
• 元のMasterを復帰するのに一工夫必要
• http://d.hatena.ne.jp/smellman/20120105/1325711325
まとめ• 冗長化は怖くない!
• 予算以外!
• Linux-HAはどんどん進化している
• Resource Agentを書くのは簡単だよ!
• 書いたらgithubにpush request!