Mysql 5.7 mysqldump bug

Mysql 5.7 ye terfi ettikten sonra backup sistemimde aşırı bir yavaşlık meydana geldi.

Nedenini araştırdığımda şunu buldum :

https://bugs.launchpad.net/percona-server/+bug/1589334

mysqldump komutuna –no-tablespaces parametresini girdiğimizde ise her şey eskisi gibi güzel oldu.

 

windows 10 openvpn “no tap-windows adapters on this system” hatası

Selamlar;

Hata nasıl oluştu?

Windows 10 üzerinde openvpn ile 1 den fazla ayrı vpn’e bağlanmamız gerekiyordu. Ancak ilk bağlandığına düzgünce bağlanırken, ikincisine bağlanırken bu hatayı almaya başladım. Yani diyor ki, “VPN’e bağlanacak yeterli sayıda TAP-windows ethernet adapter bulamadığından şikayetçiyim, 1 tane varmış onu da ilk connection için kullanmış belli ki, yeni eklemeniz gerekiyor.”

No tap-win32 adapters on this system hatasının düzeltilmesi

Genelde C:/Program Files/TAP-Windows/bin klasöründe olan “addtap” adlı dosyayı Administrator olarak çalıştırıp kendinize yeni bir TAP-windows ethernet adapter eklemeniz gerekiyor.

Umarım işe yarar 🙂

hardlink, ve Rsync + hardlink ile incremental (sadece değişen dosyaları) günlük backup almak

Selamlar;

Rsync’i backup almak için kullanmaktayız. Buradaki güzelliğimiz şöyle, sadece değişen dosyaları backup almak istiyoruz, ancak diğer dosyalarımız da link olarak backup aldığımız klasörün içerisinde hazır bulunsun istiyoruz. Böylelikle, backupı geri yüklemek, klasörü silip, backup olarak aldığımız klasörü kopyalamak kadar basit olabilsin.

Hard-link nedir?

Hard link temel olarak , dosyanın diskte bulunan kısmını işaret eden pointer ın adıdır. Yani normal 1 dosya oluşturup adına a.txt verdiğimizi hayal edelim. Burada, a.txt ye ait veriler diskte bir yerde bulunmakta, ve bu disk alanını işaret eden a.txt ismi ise bir hardlinktir. ve aynı disk bloğuna 1’den fazla hard-link verebiliriz. Yani hem a.txt hem b.txt dediğmiz şey aynı veriyi içerebilir. Bu durumda 2 pointer (2 hard-link) ama tek dosyamız olacaktır. hard-link in kısayoldan veya symbolic linkten tek farkı ise, bu şeyin bir link değil tamı tamamına gerçek bir dosya olarak davranmasıdır. a.txt ve b.txt aynı disk alanını gösteren 2 hardlink ise, burada a.txt yi silerseniz bile, işletim sistemi, bu veri alanına işaret eden başka bir hard link olduğu için veriye sizi b.txt üzerinden halen eriştirebilir halde tutacaktır. Yani a.txt yi sildiğinizde aynı veriye b.txt den halen erişebilir olmaktasınız.

hardlinks

Hard-link ile kullanılan Rsync’in avantajı nedir?

Bu şekilde aldığınız backuplar cümbür cemaat tüm kasörü aynen backup almış gibi olmanızı sağlar, ancak disk alanı olarak bunu harcamanıza gerek olmaz. Sadece değişen dosyalarınız cp komutu ile kopyalanır, diğerleri ln komutu ile hardlink yapılır. bu harclink yapılanlar disk alanı harcamaz. Sadece df -i komutuyla gördüğünüz INode harcarlar. (yani disk pointer’ı harcarlar). Yani zararı yoktur (dosyayı kopyalasaydık hem INode hem disk alanı harcayacaktık), kârı çok büyüktür (özellikle büyük dosyalarda disk alanından çok kâr ederiz), ek olarak da bütün backup klasörümüz gerçekten o anki halinin copy paste’i gibi kullanılabilir haldedir. Yani base directorynizi 2-3 gün sonra bile silseniz, hiç canınız acımaz. 

Kodlar çok kısa ve basit

aşağıda /local-backup/ dizinimiz yedeklerimizin gün gün bulunduğu ana klasörümüz olacak. /var/www/ana_dizin/ de yedeği alınacak ve üzerinde zaman zaman birşeylerin değişeceği ana dizinimiz olacak. Bu dosyayı backuper.sh olarak alıp cronjobunuza ekleyebilirsiniz.

basedir=$(ls -t /local-backup/| head -1)
/usr/bin/rsync -avtb --delete --link-dest=../$basedir /var/www/ana_dizin/ /local-backup/`date +%F`/

basedir ile başlayan satır, oluşan en güncel backup dizinini bulacak, bir alt satırdaki komut ile de rsync ile buraya hardlink verecek şekilde backupı alacaksınız.

Bu kodda bulunan `date +%F` kısmı sadece Y-m-d formatında tarihi verdiğinden bu backup scriptini günde 1 kere çalıştırmanız makul olacak, aksi halde üzerine yazacaktır. Ancak siz orada `date +%F` kısmını `date +%Y-%m-%d:%H:%M:%S` şeklinde saniyeye kadar değişken hale getirebilirsiniz.

Deneyelim

  • Boş disk alanımızı kontrol edelim, (df komutu ile)
  • anlayabilmek içini içinde 5 MB lık 2 dosya olan bir klasör oluşturup backupını alacak şekilde backuper.sh ımızı düzenleyelim. date kısmında da `date +%Y-%m-%d:%H:%M:%S` eklinde verelim ki bir kaç defa ayrı klasörlere backup alabilelim.
  • scriptimizi 10 kez çalıştıralım. Toplamda 10 MB x 10 kez çalıştırma = 100MB lık disk alanımız eksilmesi gerekirken, df -h yaptığımızda sadece 10 MB lık disk alanımız (ilk nüsha) eksildiğini göreceksiniz.
  • Bu noktadan itibaren anlamamızı pekiştirmek için çeşitli varyasyonlarla ana dizindeki dosyaları değiştirebiliriz.

Görüşmek üzere.

 

MacOsx (Host) ve Ubuntu (Client) Arasında NFS kurmak

Selamlar;

Önsöz : Genelde Virtualbox üzerinde kurduğumuz Ubuntu’lar ile ilgili dosya işlemlerini macosx’imde bulunan kod editörleri ile yapmak istiyordum. Bu sebeple kendime böyle bir ortam kurmam gerekti. Bu işlemi yaparken virtualboxımda 2 adet ethernet interface tanımlıyorum. İlk interface’i NAT olarak ayarlıyorum, 2. ethernet interface’ini ise, ipsi hiç değişmeyecek olan (ve değişmesine ihtiyaç da olmayan) host only adapter ile yapıyorum. Böylece İlgili NFS paylaşımını sadece host-only yapmış oluyorum ve networkte güvende oluyorum. ilgili virtualbox internete NAT üzerinden çıkıyor ve benim 2. interface’im sadece bana özel olmuş oluyor. Bu kısımda siz ihtiyacınıza göre bir ayar yapabilirsiniz.

Neden NFS? Klasör paylaşımı olmaz mı?

Aslında olur. Ancak ben web uygulaması için performans kaybı veya yavaşlık yaşamak istemiyorum ve ortak klasörde bu sefer ubuntu tarafında yavaşlıklar yaşıyorum ve bunu gerçekten istemeyeceğim boyutta yaşamaktaydım.

Haydi Başlayalım ;

Öncelikle Bu işlemleri yaptığım işletim sistemlerini belirteyim

Host : MacOsx 10.11.4 (El Capitan)

Client : Ubuntu 14.04.4 LTS

1- Client için Ubuntu üzerinde gerekli programın kurulması:

Aşağıdaki komut ile bu işlemi yapıyoruz.

apt-get install nfs-common

2- Macosx üzerinde export işleminin yapılması

sudo nano /etc/exports
ile açtığımız dosyaya aşağıdaki (veya benzer) bir satır ekliyoruz. Benim örneğimde /usr/local/share/web/custom adlı dizini NFS üzerinden yayına açıyoruz.

/usr/local/share/web/custom -alldirs -mapall=emre:admin -network 192.168.56.0 -mask 255.255.255.0

Burada, -mappall parametresinde benim macosx üzerindeki user ve grubum yer almakta. -network ile belirttiğim parametrede host-only adaptörümüzün ilgili IP range’i yer almakta.

Son olarak, macosx te default olarak var olan Nfsd uygulamasını restart ediyoruz.

sudo nfsd disable
sudo nfsd enable

3- Ubuntu üzerinde ilgili ayarların yapılması

1. maddede gerekli olan nfs-common paketini kurduktan sonra

İlgili klasörü ubuntuda nereye map etmek istiyorsak, buraya bir klasör oluşturuyoruz. Ben /home/web/custom adlı bir yere oluşturacağım.

mkdir -p /home/web/custom
sudo nano /etc/fstab

ile ilgili dosyayı açıyoruz ve içerisine yukarıdaki ayarlara istinaden şu satırı ekliyoruz.

192.168.56.1:/usr/local/share/web/custom /home/web/custom nfs defaults 0 0

ve daha sonra

mount -a

komutu ile mount işlemini tamamladım.

4- Deneyelim

Şimdi macosx üzerinde bir dosya oluşturalım ve ubuntu üzerinde de görebildiğinizden emin olalım.

5- User eşleşmesi (Opsiyonel)

Ben bir web uygulaması çalıştıracağım için yetkilerle ilgili problem yaşamak istemediğimden dolayı, macostaki dosyalarımın hepsini, ubuntudaki www-data user’ına map etmek istiyordum. Bunu normalde parametrelerle yapabileceğimiz gibi, ben yaşadığım birkaç problemden sonra şöyle bir trick buldum.

Ubuntu üzerinde denemek için oluşturduğumuz ilgili dosyanın user ve grubuna bakalım. ls -l komutu ile baktığımızda ilglii user ve grup idlerini görebiliriz.

Ubuntu üzerinde önceden apt-get install nginx ile nginx kurunca kendiliğinden oluşan www-data user ve grubu olduğundan dolayı, /etc/passwd dosyasına gittim ve www-data ya ait id yi bu id ile değiştirdim. Aynı şeyi /etc/group dosyasında www-data user’ının grubunu da değiştirerek tamamladım.

Artık macosxte oluşturduğum yeni bir dosyanın, ubuntu tarafında www-data user ve grubuyla oluştuğunu görüyorum.

 

Sonuç

Böylece artık editör üzerinde taklalar atmaktan (remote sunucu ayarları vb..) kurtarıp, doğru düzgün bir ayar ile workbench imizi güzelce kurabiliyoruz. Veyahut da versiyon kontrol sistemleri üzerinden sürekli git push – pull lar beklemek zorunda kalmıyoruz. Güle güle kullanıyoruz.

Linux ss komutu (Linux ss command) ve parametreleri

SS Nedir?

ss : socket statistics demektir. Yani socketler ile ilgili istatistiki bilgi verir. ss komutu ile network ile ilgili bilgilere ulaşabiliyoruz.

Kullanılabileceği Parametreler :

-V, --version	output version information
   -n, --numeric	don't resolve service names    -- servis isimlerini çözmeden işlem yap
   -r, --resolve       resolve host names  -- host isimlerini çöz
   -a, --all		display all sockets  -- tüm socketleri göster
   -l, --listening	display listening sockets  -- takip edilen (listen) socketleri göster
   -o, --options       show timer information -- zamanlayıcı bilgilerini göster
   -e, --extended      show detailed socket information  -- detaylı socket bilgilerini göster
   -m, --memory        show socket memory usage  -- memory (ram) kullanımını göster
   -p, --processes	show process using socket -- socket kullanan işlemi (process) göster
   -i, --info		show internal TCP information  -- iç TCP bilgilendirmesini göster
   -s, --summary	show socket usage summary -- socket kullanım özetini göster
   -b, --bpf           show bpf filter socket information  -- bpf filtreli socket bilgilendirmesi (bpf nedir? : https://www.kernel.org/doc/Documentation/networking/filter.txt ) 
   -4, --ipv4          display only IP version 4 sockets  -- sadece IPV4 socketleri göster
   -6, --ipv6          display only IP version 6 sockets  -- sadece IPV6 socketleri göster
   -0, --packet	       display PACKET sockets  -- sadece Packet socketleri göster
   -t, --tcp		display only TCP sockets  -- sadece TCP socketleri göster
   -u, --udp		display only UDP sockets  -- sadece UDP socketleri göster
   -d, --dccp		display only DCCP sockets  -- sadece DCCP socketleri göster
   -w, --raw		display only RAW sockets  -- sadece RAW socketleri göster
   -x, --unix		display only Unix domain sockets  -- sadece Unix socketleri göster
   -f, --family=FAMILY display sockets of type FAMILY  -- değer olarak vereceğiniz veri tipindeki socketleri göster. (Örn : -f "test" ile test tipindeki socketi gösterir)