Dağıtık projelerde genellikle yaşanılan sıkıtılardan biri kullanmış olduğunuz yazılımların yapıları gereği bir API’ye sahip olmamasından kaynaklanmaktadır. Bununla beraber yazılımların izin verdiği derece alt arayüzler ve genellikle ek yazılımlar üreterek çözümler geliştirilir.

Örneğin multi node’dan oluşan bir web-host farm’ında her noktadan gelecek değişilikleri bind üzerinde güncellemek/eklemek istiyorsunuz. Bunun için ya bir veritabanı üzerinden çalışan bir queue mantığı ile yönetmeniz ya da bu işi yapan bir RPC Interface ile gerçekleştirmeniz gerekecektir.

Bunun yerine diğer bir seçenek ise Bind’ın config dosyaları üzerinde değişiklik yapmaktan ziyade daha pratik bir uygulamaile host detay kayıtlarının MySQL üzerinde tutulduğu ve anlık olarak buradan değiştirildiği bir DNS sunucuya sahip olmak olabilir.

Bunun için sourceforge üzerinde yayınlan mysql-bind adlı projeyi kullanabiliriz. Debian bir sistem üzerinde yapmamız gereken adımlar şu adımlardan oluşmaktadır;

İşleme gerekli paketlerin yüklenmesi ile başlayalım;

 Bash |  copy code |? 
1
cd /usr/src
2
apt-get install mysql-server libmysqlclient15-dev
3
apt-get install build-essential
4
apt-get install libssl-dev libtool libdb-dev libldap2-dev libxml2-dev libcap2-dev hardening-wrapper libkrb5-dev debhelper fakeroot bison
5

Bu işlem sırasında MySQL size bir root parolası soracaktır. Belirlemiş olduğunuz bu parola tüm MySQL yönetimsel işlemlerinde kullanılacağından sağlam ve unutmayacağınız bir parola vermeniz gerekmektedir.

Bundan bir sonraki adımda bind source ve bind-mysql’i edinmek;

 Bash |  copy code |? 
1
apt-get source bind9
2
wget http://downloads.sourceforge.net/project/mysql-bind/mysql-bind/mysql-bind-0.2%20src/mysql-bind.tar.gz?use_mirror=garr
3
tar zxf mysql-bind.tar.gz
4


mysql-bind kodunu bind’a ekliyoruz;

 

 Bash |  copy code |? 
1
cd mysql-bind
2
cp mysqldb.c ../bind9-9.5.1.dfsg.P3/bin/named/
3
cp mysqldb.h ../bind9-9.5.1.dfsg.P3/bin/named/include/named/
4
cd ../bind9-9.5.1.dfsg.P3/
5

Bind’a Database driver’ını ekelemek için gerekli bilgileri MySQL’den almamız gerekiyor. Bu komutların vermiş olduğu çıktıları bir kenara not etmemiz gerekmektedir.

 Bash |  copy code |? 
1
mysql_config --cflags
2
mysql_config --libs
3
cd ../bind9-9.5.1.dfsg.P3/
4
nano bin/named/Makefile.in
5

Açılan dosyamız içerisinde DBDRIVER_OBJS yazan satıra gitmemiz gerekiyor. Bu satırda yer alan değişkenleri aşağıdaki gibi doldurmamız gerekiyor;

 C |  copy code |? 
01
02
DBDRIVER_OBJS = 
03
DBDRIVER_SRCS = 
04
DBDRIVER_INCLUDES =
05
DBDRIVER_LIBS =
06
 
07
DBDRIVER_OBJS = mysqldb.@O@
08
DBDRIVER_SRCS = mysqldb.c
09
DBDRIVER_INCLUDES = -I'/usr/include/mysql' //mysql_config --cflags ciktisi
10
DBDRIVER_LIBS = -L'/usr/lib/mysql' -lmysqlclient //mysql_config --libs ciktisi
11


dosyayı kaydederek kapatıyoruz.

Bir sonraki aşamada ise bind’ın MySQL bağlantısını açabilmesini sağlamak için gerekli eklemeleri bin/named/main.c içinde değişiklik yapmamız gerekiyor.

 Bash |  copy code |? 
1
2
nano bin/named/main.c
3

Dosya içerisinde öncelikle mysqldb header dosyasının dahil olmasını ardından ns_server_create fonksiyonunun çağırıldığı satırın öncesine mysqldb_init(); ekleyerek veritabanı bağlantısının yapılmasını, ns_server_destroy fonsksiyonundan hemen sonraki satırda mysqldb_clear(); ile açılan bağlantının kapatılmasını sağlamamız gerekiyor.

 C |  copy code |? 
01
#include <dns/view.h>
02
/*
03
*
04
*
05
*/
06
 
07
#include <dst/result.h>
08
 
09
#include "bin/named/include/named/mysqldb.h"
10
 
11
/*
12
*
13
*
14
*/
15
 
16
#endif
17
 
18
mysqldb_init();
19
ns_server_create(ns_g_mctx, &amp;ns_g_server);
20
}
21
 
22
/*
23
*
24
*
25
*
26
*/
27
 
28
destroy_managers();
29
 
30
ns_server_destroy(&ns_g_server);
31
mysqldb_clear();
32
 
33
ns_builtin_deinit();
34
 
35

Artık hazırlamış olduğumuz yapılandırmayı bir debian paketi haline getirebilir ve oluşturduğumuz paketleri yükleyebiliriz.

 Bash |  copy code |? 
1
2
dpkg-buildpackage -rfakeroot -b
3
cd ..
4
dpkg -i *.deb
5

Bu işlemden sonra bind’ı durdurarak MySQL üzerinde gerekli kullanıcı ve tablolaları yaratıroyuruz;

 Bash |  copy code |? 
1
2
/etc/init.d/bind stop
3
mysql -u root -p
4

%nbsp;

 SQL |  copy code |? 
01
02
CREATE DATABASE dns;
03
CREATE USER 'dnsuser'@'localhost' IDENTIFIED BY 'password';
04
GRANT SELECT ON dns.* TO 'dnsuser'@'localhost';
05
 
06
CREATE TABLE mydomains ( 
07
  name varchar(255) DEFAULT NULL, 
08
  ttl int(11) DEFAULT NULL, 
09
  rdtype varchar(255) DEFAULT NULL, 
10
  rdata varchar(255) DEFAULT NULL 
11
) TYPE=MyISAM;
12
 
13
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800'); 
14
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.'); 
15
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.'); 
16
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.'); 
17
INSERT INTO mydomains VALUES ('ns0.mydomain.com', 259200, 'A', '192.168.1.1'); 
18
INSERT INTO mydomains VALUES ('ns1mydomain.com', 259200, 'A', '192.168.1.1'); 
19
INSERT INTO mydomains VALUES ('www.mydomain.com', 259200, 'A', '192.168.1.1'); 
20
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'A', '192.168.1.1'); 
21

Hem kullanacağımız veritabanı hem de örnek bir domain için gerekli kayıtları oluşturmuş olduk. Artık sadece named.conf’a bu domain’i belirterek bind’ı başlatmamız yeterli olacaktır.

 Bash |  copy code |? 
1
2
zone "mydomain.com" { 
3
  type master; 
4
  notify no; 
5
  database "mysqldb dns mydomains localhost dnsuser password"; 
6
};
7

Konsoldan nslookup ile sorguladığınızda dns sunucunuzun verdiği sonuçları kontrol edebilirsiniz;

 Bash |  copy code |? 
01
02
>nslookup
03
>server 127.0.0.1
04
 Default server: 127.0.0.1
05
 Address: 127.0.0.1#53
06
>www.mydomain.com
07
Server:         127.0.0.1
08
Address:        127.0.0.1#53
09
 
10
Non-authoritative answer:
11
Name:   www.mydomain.com
12
Address: 192.168.1.1
13

Ve işte artık zone kayıtlarını MySQL üzerinde tutan bir bind sunucuya sahip durumdayız.

Not:

  • Boot sırasında MySQL sunucunun bind’tan önce başlamak zorunda olduğunu unutmayınız.
  • Çıkabilecek bind açıklarına karşı bind updatelerini kesinlikle takip etmenizi öneririm.

Bir çok insan tarafından şu sözleri duyuyorum;  “MySQL’de veritabanı aktarınca karakter problemi çıkıyor.”, “MySQL’de karakter seti problemi var.”

Hayır efendim MySQL’de karakter seti problemi yoktur, MySQL’in huyunu suyunu bilmeyen insan vardır.

MySQL veritabanı çalışmasında iki tane farklı karakter seti kullanır. Bunlardan birincisi veritabanı motoruna (database engine; MyISAM, InnoDB) verilir. İkincil olarak bağlantı karakter setidir ve MySQL Client’a verilir.

Öntanımlı MySQL kurulumlarında (Örneğin; Distro repolarından, cPanel, Plesk, vb. hosting otomasyon yazılımları ile)  bağlantı ve veritabanı karakter seti latin1 olarak gelmektedir.

En sık yapılan hatayı şöyle basit bir hatadır. Kişi gider veritabanını UTF-8 olarak yaratır. Sonra PHP ile sadece bağlanır ve sürekli veri yazar fakat bu veriyi yazdıran zat-ı muhterem bu sunucuya bağlantı sırasında MySQL Client’ın kullandığı karakter seti merak etmez. Bunu irdelemediği için de UTF-8 veritabanına Latin1 ile bağlanır ve verileri böyle yazar. Sonuç! absürt karakterlere sahip bir veritabanı.

Ne yapıyormuşuz demek ki, veritabanını istediğimiz karakter seti ile yaratıyormuşuz, daha sonra bağlanırken de veritabanının sahip olduğu karakter seti ile bağlanıyormuşuz. Evet tam olarak böyle.

Mesela UTF-8 bir veritabanı yarattığımızı varsayalım. Buna bağlanırken kesinlikle şunu yapmıyoruz;

 PHP |  copy code |? 
1
2
mysql_connect("server","kullanici","sifre");
3
mysql_select_db("veritabani");
4
mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");
5

Bunun yerine; bağlantıdan hemen sonra bir seferlik;
 PHP |  copy code |? 
1
2
mysql_connect("server","kullanici","sifre");
3
mysql_select_db("veritabani");
4
mysql_query("SET NAMES UTF8");
5
mysql_query("SET CHARACTER SET UTF8");
6
 
7
mysql_query("insert into tablo ('a','b') values ('ÇÖPĞÖÜĞÜ','İŞÜĞÜMÖMÖM')");
8

durumu MySQL’e bildiriyoruz.

Tabi ki bir projede 50 yerde bağlantı kuranlar bu noktada OOP’nin neden varolduğunu anlayabilirler.

- “Ee bilmem ne SQL Server bunu otomatik seçiyormuş”.

- Peki multi collation olan bu sistemde farklı farklı tablolar için ne yapmayı düşünüyorsun? diye sormazlar mı kişiye.

Önemli olan nasıl yediğin değil, o yoğurdu yemek!