Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Slony-IによるPostgreSQLオンラインアップグレード実験.pdf
tom--bo
May 28, 2016
1
470
Slony-IによるPostgreSQLオンラインアップグレード実験.pdf
tom--bo
May 28, 2016
Tweet
Share
More Decks by tom--bo
See All by tom--bo
B-trees
tombo
2
460
Group Replication and DB State Machine Approach
tombo
2
440
Introduction to orchestrator (MySQL)
tombo
3
420
look into binlogs
tombo
1
1.3k
About MySQL Weekly
tombo
0
380
sysbench-mysql-tester
tombo
0
950
About table-size-estimator
tombo
1
290
rinkou01_Cooperation Emergence under Resource-Constrained Peer Punishment
tombo
1
70
rinkou_02
tombo
1
31
Featured
See All Featured
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.4k
Side Projects
sachag
449
37k
Typedesign – Prime Four
hannesfritz
33
1.3k
Writing Fast Ruby
sferik
612
57k
The Illustrated Children's Guide to Kubernetes
chrisshort
14
34k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
Learning to Love Humans: Emotional Interface Design
aarron
261
37k
Robots, Beer and Maslow
schacon
152
7.1k
Documentation Writing (for coders)
carmenhchung
48
2.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
212
20k
Intergalactic Javascript Robots from Outer Space
tanoku
261
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
62k
Transcript
Slony-IによるPostgreSQL オンラインアップグレード実験 ⼤大塚知亮亮 (@tom__bo) 9.3.x から9.4.x へのReplication and Switchover
⾃自⼰己紹介 u ⼤大塚知亮亮 u Id:tom__bo (@tom__bo_CS) u 都内⼤大学院⽣生(M1) u アルバイト@はてな
⾃自⼰己紹介 u ⼤大塚知亮亮 u Id:tom__bo (@tom__bo_CS) u 都内⼤大学院⽣生(M1) u アルバイト@はてな
Outline u PostgreSQLのアップグレード u Slony-Iとは? u Slony-Iによるレプリケーション u 実験 u
経過 u 今後の課題
PostgreSQLのアップグレード u とあるサービス Master Slave Slav ・・・ Version 9.3 Slave
N Streaming Replication u 9.5へのアップグレード u UPSERT使いたい u BRINインデックス u WAL圧縮 ダウンタイムなしで だったら。。。
PostgreSQLのアップグレード u メジャーバージョン間でのレプリケーション u 標準の⽅方法のみでアップグレードする場合 1. 全体を停⽌止 2. 同期を待つ 3.
全サーバでアップグレード 4. 統計情報の再構成 5. レプリケーション再開 v9.3 v.9.4 PostgreSQL 9.3.11 Major version Minor version 時間がかかる
PostgreSQLのアップグレード u アップグレードにかかる時間の⽬目安(?) 参考:http://blog.endpoint.com/2015/07/how-fast-is-pgupgrade-anyway.html
PostgreSQLのアップグレード u サードパーティ製のツールを使う u トリガーベースのレプリケーション u Slony-I u Buccardo u
Londiste u Logical decodingを利利⽤用したレプリケーション u BDR 変更更を検知してツール間でデータをやり取りする メジャーバージョン間でレプリケーション出来る トリガ⽤用のテーブルを利利⽤用しなくて良良い(⾼高効率率率) PostgreSQL 9.4以上が必要
PostgreSQLのアップグレード u サードパーティ製のツールを使う u トリガーベースのレプリケーション u Slony-I u Buccardo u
Londiste u Logical decodingを利利⽤用したレプリケーション u BDR 今回実験 変更更を検知してツール間でデータをやり取りする メジャーバージョン間でレプリケーション出来る トリガ⽤用のテーブルを利利⽤用しなくて良良い(⾼高効率率率) PostgreSQL 9.4以上が必要
Slony-Iとは u PostgreSQLのコアメンバでもあるJan Wieck⽒氏が開発した”master to multiple slaves” レプリケーションシステム(最新はv2.2.4) u トリガーベースなので、メジャーバージョン間でのレプリケーションが可能
u テーブルごとにレプリケーション出来る u Primary keyのないテーブルはレプリケーション出来ない u DDLによる変更更・ラージオブジェクトはレプリケーション出来ない u DDLは専⽤用のコマンドを使うことでslaveにも適⽤用できる u 277ページに渡るPDFドキュメントがある(英語のみ) u 9.3.xまでのサポートしか公表されていない u 開発リリースが⽌止まっている(2015.2⽉月頃)
Slony-Iとは Master Slave Table 1 Table 2 Table 1 Table
2 Trigger Slonik command Operation Slonik Daemon Slonik Daemon Database Database
Slony-Iによるレプリケーション u ⽅方針 9.3 9.3 ・・・ 9.3 Streaming Replication アップグレード⽅方針
1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.3 9.3 ・・・ 9.3 Streaming Replication 9.4
・・・ 9.4 Slony-I Replication アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.3 9.3 ・・・ 9.3 Streaming Replication 9.4
・・・ 9.4 Slony-I Replication アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.3 9.4 ・・・ 9.4 Slony-I Replication アップグレード⽅方針
1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.4 9.3 ・・・ 9.4 Slony-I Replication Swich
Over アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.4 9.4 ・・・ 9.4 Slony-I Replication 9.3
removed アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.4 9.4 ・・・ 9.4 Slony-I Replication Application
Stop! アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
Slony-Iによるレプリケーション u ⽅方針 9.4 9.4 ・・・ 9.4 Application Stop! Streaming
Replication アップグレード⽅方針 1. Slony-Iによるレプリケーションを追加 u 9.4.xのサーバを導⼊入 2. 標準レプリケーションを⽌止める 3. Slony-Iのスイッチオーバでマスタを ⼊入れ替える 4. 旧マスタを外す(アップグレード完成) 5. (以降降必要であれば) 全体を⽌止めてデータの同期 6. 標準のレプリケーションに戻す
実験内容 u 実験環境 u VirtualBox 上の Debian8.x u Mac book(2010)
u CPU (6 core x 2) u Memory 48GB u 1環境に 2 core, 4GB memory 程度度 u 概要 u Pgbenchで3台のPostgreSQLサーバ を⽤用意 u 9.3.xをマスタとし、Slony-Iによる レプリケーションで9.4.xのサーバ 2台をスレーブとする。 u スレーブの1台とマスタをスイッチ オーバし、レプリケーションが継 続出来ているか確認する。 ⼿手順はブログでも書いています http://tombo2.hatenablog.com/entry/2016/05/18/140926
実験内容 u Slonikコマンドスクリプト u Setting.sh … クラスタの設定 u Repli_start.sh …
レプリ開始 u Switch_over.sh … スイッチオーバ u Repli_stop.sh … レプリ u 使⽤用するSlonikコマンド u cluster name u node x admin conninfo u init cluster u create/move set u set add table u store node/path u subscribe/lock set u sync u wait for event
実験 u Setting.sh(説明のために1部のみ抜き出しています) #!/bin/sh slonik <<_EOF_ cluster name = $CLUSTER;
node 1 admin conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'; node 2 admin conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$SLONY_USER'; node 3 admin conninfo = 'dbname=$DBNAME3 host=$HOST3 user=$SLONY_USER'; init cluster ( id = 1, comment = 'Node 1' ); set add table ( set id = 1, origin = 1, id = 1, fully qualified name = 'public.pgbench_accounts', comment = 'Table accounts' ); store node ( id = 2, comment = 'Node 2' , event node=1); store path ( server = 1, client = 2, conninfo = 'dbname=$DBNAME1 host=$HOST1, user=$SLONY_USER'); _EOF_ CLUSTER=slony_example DBNAME1=pgbench DBNAME2=pgbench DBNAME3=pgbench HOST1=192.168.32.11 HOST2=192.168.32.12 HOST3=192.168.32.13 SLONY_USER=pgsql PGBENCH_USER=pgbench
実験 u Slonyの起動 (master)$ slon $CLUSTERNAME "dbname=$MASTERDBNAME user=$REPLICATIONUSER host=$MASTERHOST" (slave1)$
slon $CLUSTERNAME "dbname=$SLAVEDBNAME user=$REPLICATIONUSER host=$SLAVEHOST_1" (slave2)$ slon $CLUSTERNAME "dbname=$SLAVEDBNAME user=$REPLICATIONUSER host=$SLAVEHOST_2"
実験 u repli_start.sh(説明のために1部のみ抜き出しています) #!/bin/sh slonik <<_EOF_ cluster name = $CLUSTER
node 1 admin conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'; node 2 admin conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$SLONY_USER'; node 3 admin conninfo = 'dbname=$DBNAME3 host=$HOST3 user=$SLONY_USER subscribe set ( id = 1, provider = 1, receiver = 2, forward = yes); _EOF_ CLUSTER=slony_example DBNAME1=pgbench DBNAME2=pgbench DBNAME3=pgbench HOST1=192.168.32.11 HOST2=192.168.32.12 HOST3=192.168.32.13 SLONY_USER=pgsql PGBENCH_USER=pgbench
実験 u switch_over.sh(説明のために1部のみ抜き出しています) #!/bin/sh slonik <<_EOF_ cluster name = $CLUSTER;
node 1 admin conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'; node 2 admin conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$SLONY_USER'; node 3 admin conninfo = 'dbname=$DBNAME3 host=$HOST3 user=$SLONY_USER'; lock set (id = 1, origin = 1); sync (id = 1); wait for event (origin = 1, confirmed = 2, wait on = 2); wait for event (origin = 1, confirmed = 3, wait on = 3); move set (id = 1, old origin = 1, new origin = 2); _EOF_ CLUSTER=slony_example DBNAME1=pgbench DBNAME2=pgbench DBNAME3=pgbench HOST1=192.168.32.11 HOST2=192.168.32.12 HOST3=192.168.32.13 SLONY_USER=pgsql PGBENCH_USER=pgbench
経過 u 9.3 から 9.4のレプリケーション・スイッチオーバに成功 (Pgbenchのデータスキーマ) u 9.3 から 9.5
では unsupportedが出る。 u レプリは出来たけど、その後のコマンドが応答しない(要検証) u <stdin>:54: Possible unsupported PostgreSQL version (90503) 9.5, defaulting to 8.4 support u データ転送はかなり⾼高速100万件程度度のデータなら⼀一瞬で追いつく u (仮想環境上でpgbenchの4テーブル) u 標準のレプリに戻すなら完全無停⽌止は不不可能
課題 u 標準のレプリケーションに戻せるか? u 各処理理にどれくらいの時間がかかるか不不明 u 負荷具合・データ量量・サーバのスペック等による、、、 u 実機に近い環境で実験 u
Slony-Iでレプリ出来ないschemaがないか u レプリケーションによるmasterへの負荷は? u slaveノードの遅延は? u Switch overにどれくらい時間がかかるか?
参考 u PostgreSQL Documents u https://www.postgresql.org/docs/9.3/static/pgbench.html u https://www.postgresql.org/docs/9.3/static/upgrading.html u PostgreSQL
wiki u https://wiki.postgresql.org/wiki/UDR_Online_Upgrade#PostgreSQL_Online_Upgrade u Slony-I Documents u http://www.slony.info/ u http://slony.info/adminguide/2.2/doc/adminguide/slony.pdf u 2ndQuadrant(BDR) u http://blog.2ndquadrant.com/progress-online-upgrade/ u Slony-I example u http://d.hatena.ne.jp/ttshrk/20110414/1302760971 u http://raghavt.blogspot.jp/2014/12/switchoverswitchback-in-slony-i-while.html u http://raghavt.blogspot.jp/2012/07/simple-slony-i-replication-setup.html u http://comments.gmane.org/gmane.comp.db.postgresql.slony1.general/11725 u Slony紹介 u https://thinkit.co.jp/story/2010/10/19/1811 u http://news.mynavi.jp/column/yetanother/031/
参考