PostgreSQL: Yük altında canlı çalışan db'de pg_start_backup () yapabilir miyim?


19

Yerleşik çoğaltmamız bozuldu (kesinti sırasında "istenen WAL segmenti zaten kaldırıldı") Master'ı tekrar durduramayız.

Yapabilir miyiz

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ köle ustası,
  3. pg_stop_backup()

... master postgresql hala tam yük altında iken? (Ya edecek pg_start_backup()yol

  • masa kilitleri,
  • I / O blokları,
  • tutarsızlıklar,
  • yangın alarmı,
  • yavaş db yanıtı

Başka bir deyişle pg_start_backup()başvurumuzu etkiler mi?


Dokümanları kontrol ettin mi? Diyor Varsayılan olarak, pg_start_backup bitirmek için uzun zaman alabilir". Varsayılan yarısı senin arası denetim noktası ile, bir kontrol noktasını gerçekleştirir ve kontrol noktası, önemli bir zaman dönemine yaymak edilecektir için G / Ç gerekli olmasıdır (işleme noktası checkpoint_completion_target yapılandırma parametresine bakın). Bu genellikle istediğiniz şeydir, çünkü sorgu işleme üzerindeki etkiyi en aza indirir. " Ancak bunun pratikte (ve sizin durumunuzda) ne anlama geldiği pek açık değildir.
dezso

Yanıtlar:


11

pg_start_backupdezso notları gibi bir kontrol noktası gerçekleştirecektir. Bunun bir etkisi vardır, ancak veritabanınız yine de kontrol noktalarını oldukça düzenli bir şekilde gerçekleştirir ve işlevini yerine getirmesi gerekir, bu yüzden sizin için bir sorun oluşturmazlar. Erken bir kontrol noktası, daha az verinin toplandığı anlamına gelir, yani bir kontrol noktasından gelen herhangi bir şey pg_start_backupnormalden daha düşük etkili olacaktır.

Endişelenmeniz gereken yer rsync veya eşdeğer bir pg_basebackupadımdır. Bu okuma I / O sıralı olduğu için çok kötü olmayacak, ancak yine de veritabanınızın I / O performansını önemli ölçüde incitecek ve aynı zamanda sıcak verileri RAM önbelleğinden daha az lehine itme eğiliminde olacak - daha fazla ihtiyaç duyulan veriler tekrar okunduğunda önbellek bozulmasına neden olur.

Sen kullanabilirsiniz niceve ioniceyardım sınırına G / Ç darbe (ancak önbellek etkisi); ancak bunun bir maliyeti vardır. Yedekleme daha uzun sürecektir ve yedeklemeyi tamamlayıp pg_stop_backupsisteminizi çalıştırmadan önce - anladığım kadarıyla - WAL biriktiremez, silemez, yedekleme çalışmasının sonunda BÜYÜK bir kontrol noktası için kontrol noktası borcu biriktirir ve tablo ve dizin biriktirir çünkü ölü satırları temizleyemez. Bu nedenle, özellikle çok yüksek churn tablolarınız varsa yedeklemenin sonsuza kadar sürmesini göze alamazsınız.

Sonunda, güvenli bir şekilde kullanıp kullanamayacağınızı pg_start_backupve pg_stop_backuportamınızdaki etkin yedekler için söylemek zor . Çoğu insan yapabilir, ancak donanımınızın yapabileceklerinin kenarına yakınsanız, sıkı zamanlama gereksinimlerine sahipseniz, durma riskini karşılayamazsanız ve çok yüksek churn tablolarının yanı sıra çok büyük tablolara sahipseniz, sorun yaratabilir .

Ne yazık ki, hemen hemen test etmeniz ve görmeniz gerekiyor.

Yapabiliyorsanız, CHECKPOINTLVM, SAN'ınızın araçları, EBS veya ne varsa onu kullanmak yerine veritabanınızın bulunduğu birimin atomik anlık görüntüsünü almaya değer olabilir . Bunu yapabiliyorsanız, anlık görüntüyü boş zamanlarınızda kopyalayabilirsiniz. Bu yaklaşım, PITR / sıcak bekleme / sıcak bekleme için bir temel yedekleme almak için uygun değildir, ancak statik bir yedek kopya için mükemmel bir şekilde iyidir ve sistem üzerinde çok daha düşük bir etkiye sahiptir. Bunu ancak anlık görüntüleriniz atomsa ve WAL dahil tüm veritabanınız tek bir birimdeyse yapabilirsiniz.

Henüz araştırmadığım bir olasılık iki yaklaşımı birleştirmek. Bana muhtemelen ( denenmemiş ve muhtemelen yanlış ve güvensiz , henüz bilmiyorum) olabilir:

  • pg_start_backup
  • Tüm tablo alanlarının, ana veri dizininin ve xlog biriminin anlık görüntülerini tetikleyin
  • pg_stop_backup
  • WAL'ı son arşive kadar pg_stop_backup
  • Anlık görüntü birimlerinden veri kopyalama

Temel olarak, fikir, boş zamanlarınızda kopyalayabileceğiniz her birimin belirli bir zaman noktasını alarak DB'nin kontrol noktalarını ne kadar geciktireceğini azaltmaktır.


Pg_start_backup () çoğunlukla "kontrollü bir kontrol noktası" olduğunu anladıktan sonra, sadece denemek ve görmek için güven kazandık. Çalışan uygulama üzerindeki etkisi önemsiz gibi görünüyor. (SSD'de ana ana datadir) :-) Önerdiğiniz "denenmemiş ve muhtemelen güvensiz" fikir yetkinlik seviyemizin biraz üstünde ve macera arzusu.
Daniel

Oh, ve biz ilk denemede rsync iyonice yoktu. Çünkü asıl yükü görmek istedik. Asla ikinci bir rsync koşusuna ihtiyaç duymadığımız için her şey yolunda. Bundan bir şey öğrendik.
Daniel

7

Bu mezar kazma ama burada bir şeyleri düzeltmem gerekiyor.

Önceki cevap şöyledir:

G / Ç etkisini sınırlamaya yardımcı olmak için güzel ve iyonice kullanabilirsiniz (ancak önbellek etkisini değil); ancak bunun bir maliyeti vardır. Yedekleme daha uzun sürer ve yedeklemeyi tamamlayıp pg_stop_backup komutunu çalışana kadar sisteminiz - anladığım kadarıyla - WAL biriktirir, silemez, yedekleme çalışmasının sonunda BÜYÜK bir kontrol noktası için kontrol noktası borcu biriktirir ve tablo biriktirir. indeks bloat çünkü ölü satırları temizleyemez. Bu nedenle, özellikle çok yüksek churn tablolarınız varsa yedeklemenin sonsuza kadar sürmesini göze alamazsınız.

Bu doğru değil. Sistem, yapılandırmanızda belirtilen WAL sayısını tutacaktır ( çevrimiçi belgelere bakınız ). Yani, temel olarak, arasındaki yüksek değer:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Bu durumu düşünelim:

  • kopyalanacak yüzlerce konser olduğu için yedeklemeniz uzun sürüyor
  • küçük bir WAL retansiyonunuz var (örneğin 3'e kontrol noktası_seçimleri)
  • WAL arşivlemeyi kurmadınız

ardından "pg_start_backup ()" başlatıldıktan sonra, WAL dosyalarınız yedekleme sırasında döner. Yedeklemeniz bittiğinde, başka bir veritabanı motoruna geri yüklemeyi deneyeceksiniz. Lansmandaki motor, en azından "pg_start_backup ()" yayınladığınızda oluşturulan WAL dosyasını soracaktır.

pg_start_backup 
-----------------
B/D0020F18
(1 row)

Veritabanı, WAL dosyası "0000000x0000000B000000D0" (burada x, TimelineID'nizdir ) sağlanana kadar önyüklemeyi kabul etmez . Bu WAL dosyası, sistemin önyüklenmesi için minimumdur. Tabii ki, sadece bu dosya ile, verilerin geri kalanı sahip olmadığınız WAL dosyalarında bulunduğundan verileri kaybedersiniz, ancak en azından çalışan bir veritabanı motoruna sahip olursunuz.

Bu yüzden ya WAL arşivlemesi yapmalısınız ya da gerekli WAL dosyalarını kendiniz kaydetmelisiniz, ancak Postgresql bunu sizin için yapmayacaktır.


3
Çok iyi gözlem. pg_basebackup --xlog-method=streamEğer yanlış değilsem bundan kaçınılabilir .
tomorrow__

2
Evet, PG 9.2'den bu yana, temel yedeklemeyle WAL akışını gerçekleştirebilirsiniz. İkinci bir akış açar, bu nedenle max_wal_sendersminimum 2'ye ayarlamanız gerekir. Bu, yedeklemenin sonunda "eksik WAL" sorununu önlemenin güzel bir yoludur.
sterfield

4

PostgreSQL ile ilgili deneyimime gelince, o an üzerinde gerçekten büyük bir performans etkiniz yoksa nispeten güvenli bir işlemdir. Eğer varsa, tüm müşterilerinizden yazmayı geçici olarak duraklatmak daha iyidir.

Efendimi yük altında köle senkronize ederken sadece bir kritik durumum vardı ve buna OOM katili neden oldu (evet, veritabanı düğümlerinde OOM Killer'ı TAMAMEN devre dışı bırakmalısınız, o gün bilmiyordum).

Bu yüzden gece yedekleme veritabanını geri yükledim ve tekrar oynamak için pg_archive dizininden tüm WAL segmentleri postgres verdi (sadece pg_xlog klasörüne kopyalandı). Her şey yolunda gitti ama kesinti elbette kaçınılmazdı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.