SysAdminDay

Ara
07
2009

MySQL ve DNS

logo-mysqlMySQL’de yetkilendirme kullanıcı@host ÅŸeklinde yapılmakta. Yani kullanıcının hangi host’dan MySQL’e eriÅŸebileceÄŸi de belirlenmekte.

Bu yetkilendirmeyi bazen  emre@192.168.1.1 bazen de emre@testserver.ford.com.tr şeklinde tanımlarız.

Bu iki yöntemin avantaj ve dezavantajlarından biraz bahsedelim:

  • Hostname ile yetkilendirmenin avantajını ÅŸu ÅŸekilde açıklayabiliriz:

Sunucunun IP’sini deÄŸiÅŸtirmeniz gerektiÄŸinde tüm MySQL yetkilerini teker teker deÄŸiÅŸtirmek yerine DNS kaydında (veya /etc/hosts dosyasında) gerekli deÄŸiÅŸikliÄŸi yapmanız yeterli olacaktır.

  • IP adresi ile yetkilendirmenin avantajı ise:

MySQL sistemini başka bir sunucuya (DNS) doğrudan bağımlı hale getirmemiş olursunuz.

İlk bakışta, yönetmisel açıdan işinizi kolaylaştıracağı için ve muhtemelen her an erişilebilir durumda olması için yedekli yapıda kurduğunuz DNS sunucunuza güvendiğiniz için hostname ile yetkilendirmeyi tercih edersiniz.

O zaman şu durumları da göz önünde bulundurmakta fayda var:

MySQL, bir hostname’i çözeceÄŸi zaman öncelikle kendi host cache’ine bakar. Aradığı hostname’i host cache’inde bulamaz ise, IP adresinden hostname’i çözer, sonra hostname’den IP adresini çözer ve iki sonucu karşılaÅŸtırarak IP adresinini netleÅŸtirir.

MySQL sunucunuza eriÅŸen çok fazla host varsa (en basitinden 128′den fazla, çünkü MySQL host cache’i varsayılan olarak 128 host bilgisi tutar) veya DNS sunucunuz yavaÅŸ çalışıyorsa bu DNS sorguları MySQL performansınızı düşürecektir.  Özellkle MySQL veritabanınız thread-safe özelliÄŸiyle çalışmıyorsa bu yavaÅŸlığın çok ciddi boyutlara ulaÅŸtığını görebilirsiniz.

Hostname ile yetkilendirme yaptığınızda dikkat etmeniz gereken diğer bir durum da şu olacaktır:

Åžayet bir IP adresi için birden çok DNS kaydınız var ise yukarıda anlattığım DNS sorgulama mekanizması düzgün çalışmayacağı için bu IP’den MySQL sunucusuna eriÅŸmeye çalışan tüm uygulamalar aÅŸağıdakine benzer bir hata alacaktır:

Warning: mysql_connect(): Host ‘testserver.ford.com.tr’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’ in /srv/www/htdocs/xx/xxx.php on line xxx

Bu hatayı aldığınızda doğal olarak ilk yapacağınız şey mysqladmin flush-hosts yapmak olacaktır. Kısa bir süre için de olsa problemin düzeldiğinizi göreceksiniz ama çok sürmeyecek bu durum.

emreyasar@mysqlserver:~> host 192.168.1.1 yazdığınızda
1.1.168.192.in-addr.arpa domain name pointer testserver.ford.com.tr.
1.1.168.192.in-addr.arpa domain name pointer test1.ford.com.tr.
1.1.168.192.in-addr.arpa domain name pointer test2.ford.com.tr.

gibi birden çok sonuç alıyorsanız MySQL 192.168.1.1 IP’sinden gelen istemleri güvenlik gereÄŸi bloklayacaktır.

Peki bu durumda ne yapmalıyız?

MySQL sunucunusunun /etc/my.cnf dosyasına  skip_name_resolve satırını ekleyip MySQL servisini yeniden başlatın.

Problemin çözüldüğünü göreceksiniz.

MySQL’de yetkilendirme kullanıcı@sunucu ÅŸeklinde yapılmakta. Yani kullanıcının hangi host’dan MySQL’e eriÅŸebileceÄŸi de belirlenmekte.
Bu yetkilendirmeyi bazen emre@192.168.1.1 bazen de emre@testserver.ford.com.tr şeklinde tanımlarız.
Bu iki yöntemin avantaj ve dezavantajlarından biraz bahsedelim:
Hostname ile yetkilendirmenin avantajını şu şekilde açıklayabiliriz:
Sunucunun IP’sini deÄŸiÅŸtirmeniz gerektiÄŸinde tüm MySQL yetkilerini teker teker deÄŸiÅŸtirmek yerine DNS kaydında (veya /etc/hosts dosyasında) gerekli deÄŸiÅŸikliÄŸi yapmanız yeterli olacaktır.
IP adresi ile yetkilendirmenin avantajı ise:
MySQL sistemini başka bir sunucuya (DNS) doğrudan bağımlı hale getirmemiş olursunuz.
İlk bakışta, yönetmisel açıdan işinizi kolaylaştıracağı için ve muhtemelen her an erişilebilir durumda olması için yedekli yapıda kurduğunuz DNS sunucunuza güvendiğiniz için hostname ile yetkilendirmeyi tercih edersiniz.
O zaman şu durumları da göz önünde bulundurmakta fayda var:
MySQL, bir hostname’i çözeceÄŸi zaman öncelikle kendi host cache’ine bakıyor. Aradığı hostname’i host cache’inde bulamaz ise, IP adresinden hostname’i çözer, sonra hostname’den IP adresini çözer ve iki sonucu karşılaÅŸtırarak IP adresinini netleÅŸtirir.
MySQL sunucunuza eriÅŸen çok fazla host varsa (en basitinden 128′den fazla) veya DNS sunucunuz yavaÅŸ çalışıyorsa bu DNS sorguları MySQL performansınızı düşürecektir. Özellkle MySQL veritabanınız thread-safe özelliÄŸiyle çalışmıyorsa bu yavaÅŸlığın çok ciddi boyutlara ulaÅŸtığını farkedebilirsiniz.
Hostname ile yetkilendirme yaptığınızda dikkat etmeniz gereken diğer bir durum da şu olacaktır:
Åžayet bir IP adresi için birden çok DNS kaydınız var ise yukarıda anlattığım DNS sorgulama mekanizması düzgün çalışmayacağı için bu IP’den MySQL sunucusuna eriÅŸmeye çalışan herkes aÅŸağıdakine benzer bir hata alacaktır:
Warning: mysql_connect(): Host ‘testserver.ford.com.tr’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’ in /srv/www/htdocs/xx/xxx.php on line xxx
Bu hatayı aldığınızda doğal olarak ilk yapacağınız şey mysqladmin flush-hosts yapmak olacaktır. Kısa bir süre için de olsa problemin düzeldiğinizi göreceksiniz ama çok sürmeyecek bu durum.
emreyasar@mysqlserver:~> host 192.168.1.1 yazdığınızda
1.1.168.192.in-addr.arpa domain name pointer testserver.ford.com.tr.
1.1.168.192.in-addr.arpa domain name pointer test1.ford.com.tr.
1.1.168.192.in-addr.arpa domain name pointer test2.ford.com.tr.
gibi birden çok sonuç alıyorsanız MySQL 192.168.1.1 IP’sinden gelen istemleri güvenlik gereÄŸi bloklayacaktır.
Peki bu durumda ne yapmalıyız?
Basit: MySQL sunucunusunun /etc/my.cnf dosyasına skip_name_resolve satırını ekleyip MySQL servisini yeniden başlatın.
Artık yukarıdaki hatayı almayacaksınız.

Yorum yok »

RSS feed for comments on this post. TrackBack URL


Yorum yaz

  

Altyapi WP Temadown Wp Tr Temayapim TheBuckmaker Cevirmen Otel