Merhaba arkadaşlar, bugün sizlere sunucu yönetiminde en kritik bileşenlerden biri olan MySQL veya MariaDB veritabanlarınızı, hizmeti durdurmadan veya kullanıcıları etkilemeden nasıl bakım ve optimizasyondan geçirebileceğinizi anlatacağım. Özellikle büyük tablolar, sürekli yazma/okuma yapan canlı sistemlerde bu araçlar hayat kurtarıcıdır. Ben de kendi sunucu parkurumda sıklıkla kullandığım için tecrübelerimi paylaşmak istiyorum.
Percona Toolkit Nedir ve Kurulumu
Percona Toolkit, MySQL, MariaDB ve MongoDB sistemleri için geliştirilmiş, komut satırından çalışan profesyonel bir araç setidir. Tablo onarımı, veri senkronizasyonu, sorgu analizi, sistem izleme gibi onlarca farklı işi yapabilen araçlar içerir. İlk adım olarak bu araçları sunucumuza kurmalıyız.
Debian/Ubuntu tabanlı sistemler için kurulum şu şekilde:
RHEL/CentOS tabanlı sistemler için ise öncelikle EPEL reposunu etkinleştirip sonra yükleyebilirsiniz:
Kurulum bittikten sonra versiyon kontrolü yaparak her şeyin yolunda olduğundan emin olalım.
Canlı Sistemde Sorgu Analizi: pt-query-digest
Optimizasyona nereden başlayacağımızı bilmek için önce sorunlu noktaları tespit etmeliyiz. `pt-query-digest` aracı, yavaş sorgu loglarınızı veya genel sorgu loglarınızı analiz edip size detaylı bir rapor sunar. Bu rapor, hangi sorguların en çok zaman aldığını, en sık çalıştığını gösterir ve optimizasyon önceliğinizi belirlemenizi sağlar.
Genel sorgu log'unuzu analiz etmek için (log'un açık olduğundan emin olun):
Eğer canlı trafiği anlık analiz etmek isterseniz, `tcpdump` ile yakalayıp analiz edebilirsiniz. Bu yöntem sunucuya ek yük bindirebileceği için yoğun olmayan saatlerde yapmanızı öneririm.
Tablo Yapısını Optimize Etme: pt-online-schema-change
Bu araç, benim en sevdiğim ve en sık kullandığım araçlardan biri. Büyük bir tabloya ALTER komutu (INDEX ekleme, kolon tipi değiştirme, kolon silme/ekleme) çalıştırdığınızda tablo kilitlenir ve bu canlı sistemlerde dakikalarca süren kesintilere yol açabilir. `pt-online-schema-change` ise bu işlemi, orijinal tabloyu kitlemeden, arka planda yeni bir tablo oluşturup verileri kopyalayarak yapar.
Örneğin, `forum_posts` tablosuna yeni bir index eklemek istiyoruz:
Bu komut çalışırken, kullanıcılarınız tabloya yazmaya ve okumaya devam edebilir. Araç, değişiklikleri anlık olarak yeni tabloya da taşır. İşlem bittiğinde orijinal tablo ile yeni tablonun yerini değiştirir ve eski tabloyu siler. Şu ayara çok dikkat etmelisiniz: `--chunk-size` parametresi ile her seferde taşınacak veri miktarını ayarlayabilir, sunucu yükünü kontrol altında tutabilirsiniz.
Kritik Tablo Bakımı: pt-table-checksum & pt-table-sync
Master-Slave replikasyon ortamınız varsa, zamanla veri tutarsızlıkları (drift) oluşabilir. Bu iki araç, tutarsızlıkları tespit etmek ve düzeltmek için birebirdir.
Öncelikle, master ve slave'ler arasında checksum karşılaştırması yapalım:
Bu komut, her tablo için bir checksum hesaplar ve sonuçları `forumdb.checksums` tablosuna yazar. Slave'ler de bu tabloyu replike eder. Daha sonra slave'lerde bu tablo kontrol edilerek farklılıklar tespit edilir.
Eğer bir tutarsızlık bulunursa, düzeltmek için `pt-table-sync` kullanılır. Ancak bu araç DOĞRUDAN veriyi değiştirir. Bu nedenle önce ne yapacağını `--print` parametresi ile görmek şarttır!
Çıktıyı kontrol ettikten ve emin olduktan sonra, `--execute` parametresi ile değişiklikleri uygulayabilirsiniz. Bu işlemleri yaparken mutlaka bir yedeğinizin alınmış olduğundan emin olun.
Pratik İpuçları ve Güvenlik
Test Ortamı: Bu araçları ilk defa kullanacaksanız, mutlaka önce üretim ortamına benzeyen bir test/staging sunucusunda deneyin.
Kullanıcı Hakları: Araçları çalıştıracağınız MySQL kullanıcısının (`--user` ile belirtilen) yeterli yetkilere (SELECT, INSERT, ALTER, SUPER vs.) sahip olduğundan emin olun.
Yoğun Saatler: `pt-online-schema-change` gibi işlemleri, trafiğin nispeten düşük olduğu saatlerde planlayın.
Config Dosyası: Sık kullandığınız kullanıcı, host ve port bilgilerini ~/.my.cnf dosyasına yazarak her seferinde parametre girmekten kurtulabilirsiniz. Dosya izinlerinin 600 olmasına dikkat edin!
Monitoring: Uzun süren işlemler sırasında sunucunuzun CPU, RAM ve IO istatistiklerini (`top`, `iotop`, `vmstat`) takip etmeyi unutmayın.
Umarım bu rehber, veritabanı sunucularınızı daha sorunsuz yönetmenize yardımcı olur. Percona Toolkit, içinde daha keşfedilecek çok araç barındırıyor. Benim en çok kullandıklarım bunlardı.
Peki siz bu araçları veya başka yöntemleri kendi sunucularınızda nasıl kullanıyorsunuz? Özellikle çok büyük tablalar (50GB+) için ekstra taktikleriniz var mı? Tecrübelerinizi paylaşırsanız hepimiz faydalanırız. Sorularınız ve eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin. Kolay gelsin!
Percona Toolkit, MySQL, MariaDB ve MongoDB sistemleri için geliştirilmiş, komut satırından çalışan profesyonel bir araç setidir. Tablo onarımı, veri senkronizasyonu, sorgu analizi, sistem izleme gibi onlarca farklı işi yapabilen araçlar içerir. İlk adım olarak bu araçları sunucumuza kurmalıyız.
Debian/Ubuntu tabanlı sistemler için kurulum şu şekilde:
Bash:
sudo apt-get update
sudo apt-get install percona-toolkit
RHEL/CentOS tabanlı sistemler için ise öncelikle EPEL reposunu etkinleştirip sonra yükleyebilirsiniz:
Bash:
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install percona-toolkit
Kurulum bittikten sonra versiyon kontrolü yaparak her şeyin yolunda olduğundan emin olalım.
Bash:
pt-query-digest --version
Optimizasyona nereden başlayacağımızı bilmek için önce sorunlu noktaları tespit etmeliyiz. `pt-query-digest` aracı, yavaş sorgu loglarınızı veya genel sorgu loglarınızı analiz edip size detaylı bir rapor sunar. Bu rapor, hangi sorguların en çok zaman aldığını, en sık çalıştığını gösterir ve optimizasyon önceliğinizi belirlemenizi sağlar.
Genel sorgu log'unuzu analiz etmek için (log'un açık olduğundan emin olun):
Bash:
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_analysis_$(date +%Y%m%d).txt
Eğer canlı trafiği anlık analiz etmek isterseniz, `tcpdump` ile yakalayıp analiz edebilirsiniz. Bu yöntem sunucuya ek yük bindirebileceği için yoğun olmayan saatlerde yapmanızı öneririm.
Bu araç, benim en sevdiğim ve en sık kullandığım araçlardan biri. Büyük bir tabloya ALTER komutu (INDEX ekleme, kolon tipi değiştirme, kolon silme/ekleme) çalıştırdığınızda tablo kilitlenir ve bu canlı sistemlerde dakikalarca süren kesintilere yol açabilir. `pt-online-schema-change` ise bu işlemi, orijinal tabloyu kitlemeden, arka planda yeni bir tablo oluşturup verileri kopyalayarak yapar.
Örneğin, `forum_posts` tablosuna yeni bir index eklemek istiyoruz:
Bash:
pt-online-schema-change --alter "ADD INDEX idx_user_created (user_id, created_at)" D=forumdb,t=forum_posts --execute
Bu komut çalışırken, kullanıcılarınız tabloya yazmaya ve okumaya devam edebilir. Araç, değişiklikleri anlık olarak yeni tabloya da taşır. İşlem bittiğinde orijinal tablo ile yeni tablonun yerini değiştirir ve eski tabloyu siler. Şu ayara çok dikkat etmelisiniz: `--chunk-size` parametresi ile her seferde taşınacak veri miktarını ayarlayabilir, sunucu yükünü kontrol altında tutabilirsiniz.
Master-Slave replikasyon ortamınız varsa, zamanla veri tutarsızlıkları (drift) oluşabilir. Bu iki araç, tutarsızlıkları tespit etmek ve düzeltmek için birebirdir.
Öncelikle, master ve slave'ler arasında checksum karşılaştırması yapalım:
Bash:
pt-table-checksum --replicate=forumdb.checksums h=localhost,u=admin,p=sifre
Bu komut, her tablo için bir checksum hesaplar ve sonuçları `forumdb.checksums` tablosuna yazar. Slave'ler de bu tabloyu replike eder. Daha sonra slave'lerde bu tablo kontrol edilerek farklılıklar tespit edilir.
Eğer bir tutarsızlık bulunursa, düzeltmek için `pt-table-sync` kullanılır. Ancak bu araç DOĞRUDAN veriyi değiştirir. Bu nedenle önce ne yapacağını `--print` parametresi ile görmek şarttır!
Bash:
pt-table-sync --replicate=forumdb.checksums h=master_host,u=admin,p=sifre h=slave_host --print
Çıktıyı kontrol ettikten ve emin olduktan sonra, `--execute` parametresi ile değişiklikleri uygulayabilirsiniz. Bu işlemleri yaparken mutlaka bir yedeğinizin alınmış olduğundan emin olun.
Test Ortamı: Bu araçları ilk defa kullanacaksanız, mutlaka önce üretim ortamına benzeyen bir test/staging sunucusunda deneyin.
Kullanıcı Hakları: Araçları çalıştıracağınız MySQL kullanıcısının (`--user` ile belirtilen) yeterli yetkilere (SELECT, INSERT, ALTER, SUPER vs.) sahip olduğundan emin olun.
Yoğun Saatler: `pt-online-schema-change` gibi işlemleri, trafiğin nispeten düşük olduğu saatlerde planlayın.
Config Dosyası: Sık kullandığınız kullanıcı, host ve port bilgilerini ~/.my.cnf dosyasına yazarak her seferinde parametre girmekten kurtulabilirsiniz. Dosya izinlerinin 600 olmasına dikkat edin!
Monitoring: Uzun süren işlemler sırasında sunucunuzun CPU, RAM ve IO istatistiklerini (`top`, `iotop`, `vmstat`) takip etmeyi unutmayın.
Umarım bu rehber, veritabanı sunucularınızı daha sorunsuz yönetmenize yardımcı olur. Percona Toolkit, içinde daha keşfedilecek çok araç barındırıyor. Benim en çok kullandıklarım bunlardı.
Peki siz bu araçları veya başka yöntemleri kendi sunucularınızda nasıl kullanıyorsunuz? Özellikle çok büyük tablalar (50GB+) için ekstra taktikleriniz var mı? Tecrübelerinizi paylaşırsanız hepimiz faydalanırız. Sorularınız ve eklemek istedikleriniz için aşağıya yazmaktan çekinmeyin. Kolay gelsin!