ゆるふわlinux-ha 〜postgresql編〜

Post on 08-Jun-2015

6.780 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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 root@192.168.2.2:/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 postgres@192.168.2.2:/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 postgres@192.168.2.1:/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!

top related