Ağ Altyapısı ve Dağıtılmış İşlem Ahmet Burak Can Hacettepe Üniversitesi abc@cs.hacettepe.edu.tr Dağıtılmış İşlem Bilgisayar ağlarında dağıtılmış işlem temel olarak iki bağlamda düşünülür: Ağ düzeyi Birlikte (Koşut) İşlem (Parallel Processing) Görev Göçü (Process migration) İstemci-Sunucu (Client-Server) Bilgisayar sistemlerindeki uygulamalara dağıtılmış işlem yeteneğini kazandırabilmek için, bir iletişim altsistemine ihtiyaç vardır. Böyle bir altsistem, kütüklerin kullanım kolaylığında, bilgisayarlar arası iletişime imkan sağlamalıdır. 1 2 Bilgisayarlar Arası Veri İletişimi TCP/IP Protokol Katmanları 3 4
TCP/IP de Veri Gönderimi IP Paket Görünümü 5 6 IP Adreslerinin Noktalı Onlu Gösterimi TCP ve UDP Datagram Görüntüleri 7 8
İstemci/Sunucu Yaklaşımı Socket Sistem Çağrılarıyla İstemci- Sunucu Program İletişimi 9 10 Satır Yankılaması Yapan Sunucu Programı - 1 Satır Yankılaması Yapan Sunucu Programı - 2 [...] /*include*/ #define MAX 80 #define SUNUCU_KAPISI 1490 main(){ char yastik[max]; int fd, sock; /*Connection and Rendezvous descriptors*/ int nb; unsigned long istemci_boyu; struct sockaddr_in sunucu, istemci; sunucu.sin_family = AF_INET; sunucu.sin_addr.s_addr = INADDR_ANY; sunucu.sin_port = htons(sunucu_kapisi); sock = socket(af_inet, SOCK_STREAM, 0); bind(sock, (struct sockaddr *)&sunucu, sizeof sunucu); listen(sock, 5); istemci_boyu = sizeof istemci; while(1) { fd=accept(sock,(struct sockaddr *)&istemci, istemci_boyu); while((nb = read(fd, yastik, MAX)) > 0) write(fd, yastik, nb); 11 12
Satır Yankılama İsteyen İstemci Programı - 1 Satır Yankılama İsteyen İstemci Programı - 2 [...] /*include*/ #define MAX 80 #define SUNUCU_KAPISI 1490 main(int argc, char *argv[]) { int nb, sock; char yastik[max]; char sunucu_adi[max]; struct sockaddr_in sunucu; struct hostent *s_bilgi; sock = socket(af_inet, SOCK_STREAM, 0); strcpy(sunucu_adi, argv[1]); s_bilgi = gethostbyname(sunucu_adi); sunucu.sin_family = s_bilgi->h_addrtype; memcpy(&sunucu.sin_addr, s_bilgi->h_addr, s_bilgi->h_length); sunucu.sin_port = htons(sunucu_kapisi); 13 if((connect(sock,(struct sockaddr *)&sunucu, sizeof sunucu))< 0){ printf("bağlanti yapilamiyor\n"); exit(1); printf("%s sunucusuna bağlanıldı.\n", argv[1]); while((nb = read(0, yastik, MAX)) > 0){ /* Klavyeden oku */ write(sock, yastik, nb); /* Sunucu ya yolla */ nb = read(sock, yastik, MAX); /* Sunucu dan geri al */ write(1, yastik, nb); /* Ekrana yaz */ close(sock); 14 Yankılama Programının Çalışması Little-endien, Big-endien Gösterimleri Sunucu (mars makinası) mars$ sunucu& mars$ İstemci (dunya makinası) dunya$ istemci mars mars sunucusuna bağlanıldı. merhaba merhaba hayat var mı? hayat var mı? soruma cevap ver! soruma cevap ver! 15 16
Sunucu Programın Koşut Hizmet Vermesi Örnek sunucu programında, bir istemci, sunucudan hizmet almaya başladıktan sonra, istemci sonlanmadan diğer istemciler sunucuya bağlanıp hizmet alamazlar. connect() komutu ile bağlanmaya çalışan diğer istemci, listen() komutunun tanımladığı kuyruğa bağlanarak sunucu programın accept() komutuna dönmesini bekler. Bu yaklaşım, istemci programların sunucudan eşanlı hizmet almalarına olanak vermez. Koşut İşlem Yapabilen Sunucu Program Örneği - 1 [...] /*include*/ #define MAX 80 #define SUNUCU_KAPISI 1490 main(){ char yastik[max]; int fd, nb, sock; unsigned long istemci_boyu; struct sockaddr_in sunucu, istemci; sunucu.sin_family = AF_INET; sunucu.sin_addr.s_addr = INADDR_ANY; sunucu.sin_port = htons(sunucu_kapisi); signal(sigchld, SIG_IGN); 17 18 Koşut İşlem Yapabilen Sunucu Program Örneği - 2 SIGCHLD iletisi sock = socket(af_inet, SOCK_STREAM, 0); bind(sock, (struct sockaddr *)&sunucu, sizeof sunucu); listen(sock, 1); istemci_boyu = sizeof istemci; while(1) { fd=accept(sock,(struct sockaddr *)&istemci,&istemci_boyu); if(fork() == 0) { /* Bu kesimi oğul sunucu görev çalıştırır */ while((nb = read(fd, yastik, MAX)) > 0) write(fd, yastik, nb); exit(0); else /* Bu kesimi ata sunucu görev çalıştırır */ close(fd); 19 UNIX te görevlerin sonlanmasına sağlayan exit() komutu, ata göreve signal komutu ile SIGCHLD iletisini gönderir. Ata görev, signal() komutu aracılığıyla SIGCHLD iletisini almadan oğul görevin görev iskeleti silinmemektedir. UNIX te görev iskeletine sahip sonlanmış görevler, hortlak görev (zombie process) olarak adlandırılır. Hortlak görevler, ata görevleri sonlanana kadar sistemde kalır. UNIX te tüm görevlerin ilk atası init görevidir. Bir görev, yarattığı oğul görevler sonlanmadan sonlanırsa, oğul görevler, yetim (orphan) durumuna düşer. UNIX te, yetim görevler, init görevini ata olarak alırlar. 20
Connectionless Modda İstemci ve Sunucu Çağrıları Connectionless Modda İstemci ve Sunucu Program Yapıları sendto(sock, buf, buf_len, flags, address, address_length); recvfrom(sock, buf, buf_len, flags, address, &address_length); sock: socket() çağrısının döndürdüğü gösterge (rendezvous descriptor), buf: Aktarıma konu olan veri yastığı göstergesi, buf_len: Aktarıma konu olan veri yastığı boyu, flags: Özel seçenek göstergesi, genelde 0, address: sendto() bağlamında verinin gönderileceği hedef uygulama, recvfrom() bağlamında verinin alınacağı kaynak uygulama, address_length: Uygulama adresinin boyudur. 21 22 Connectionless Modda Sunucu Örneği - 1 Connectionless Modda Sunucu Örneği - 2 [...] /*include*/ #define MAX 80 #define SUNUCU_KAPISI 1490 main() { char yastik[max]; int nb, sock; unsigned long istemci_boyu; struct sockaddr_in sunucu, istemci; sunucu.sin_family = AF_INET; sunucu.sin_addr.s_addr = INADDR_ANY; sunucu.sin_port = htons(sunucu_kapisi); sock = socket(af_inet, SOCK_DGRAM, 0); bind(sock, (struct sockaddr *)&sunucu, sizeof sunucu); istemci_boyu = sizeof istemci; while(1) { while ((nb = recvfrom(sock, yastik, MAX, 0, (struct sockadd *)&istemci, &istemci_boyu))>0) sendto(sock, yastik, nb, 0, (struct sockaddr *)&istemci, sizeof istemci); 23 24
Connectionless Modda İstemci Örneği - 1 Connectionless Modda İstemci Örneği - 2 [...] /*include*/ #define MAX 80 #define SUNUCU_KAPISI 1490 main(int argc, char *argv[]){ int nb, sock; unsigned long sunucu_boyu; char yastik[max]; char sunucu_adi[max]; struct sockaddr_in sunucu, istemci; struct hostent *s_bilgi; istemci.sin_family = AF_INET; istemci.sin_addr.s_addr = INADDR_ANY; istemci.sin_port = 0; /*Kapı Numarasını sistem belirlesin*/ sock = socket(af_inet, SOCK_DGRAM, 0); bind(sock, (struct sockaddr *)&istemci, sizeof istemci); strcpy(sunucu_adi, argv[1]); s_bilgi = gethostbyname(sunucu_adi); sunucu.sin_family = s_bilgi->h_addrtype; memcpy(&sunucu.sin_addr, s_bilgi->h_addr, s_bilgi->h_length); sunucu.sin_port = htons(sunucu_kapisi); sunucu_boyu = sizeof sunucu; while((nb = read(0, yastik, MAX)) > 0){ sendto(sock,yastik,nb,0,(struct sockaddr *) &sunucu, &sunucu_boyu); nb = recvfrom(sock,yastik,max,0,(struct sockaddr *) &sunucu, &sunucu_boyu); write(1, yastik, nb); close(sock); 25 26 Yankılama Programının Connectionless Modda Çalışması Alan Adı Sistemi (DNS-Domain Name System) Sunucu (mars makinası) mars$ sunucu& mars$... mars$ istemci localhost localhost sunucusuna bağlanıldı. bir sinyal aldık bir sinyal aldık ne yapacağız? ne yapacağız? off, vazgeçtim boşver! off, vazgeçtim boşver! İstemci (dunya makinası) dunya$ istemci mars mars sunucusuna bağlanıldı. merhaba merhaba hayat var mı? hayat var mı? soruma cevap ver! soruma cevap ver! IP numaraları yerine, bilgisayarların simgesel adlarla (hostname) tanımlanabilmesi Internet kullanımını kolaylaştırır. Simgesel adlardan, IP numaralarına dönüşümü DNS sistemi sağlar. DNS sisteminde, Internet alan adları (domain names) hiyerarşik bir ağaç yapısı şeklinde ele alınır. Ağacın yönetimi, en tepede ABD de INTERNIC tarafından ele alınır. INTERNIC, alt dalların yönetimini yerel otoritelere bırakır. 27 28
Alan Adı Sistemi Adlandırma Sıradüzeni DNS sunucular ve resolver Herbir Internet alanı (domain) ile ilgili bilgilerin saklanması ve yönetimi, ilgili Internet alanı için ayrılmış olan DNS sunucu tarafından yapılır. Herbir Internet alanı için bir birincil (primary) DNS sunucunun yanında, ikincil (secondary) DNS sunucular atanabilir. DNS sunucular üzerinde iki çeşit sorgu yapılabilir: Hostname-to-IP number IP number-to-hostname Resolver yazılımı, DNS istemcisi olarak çalışıp, DNS sunuculardan adres sorgulaması yapar. Adres sorgulaması, resolver tarafından özyineli veya özyineli olmayan istem şeklinde DNS sunucuya gönderilir. 29 30 Alan Adı Sunucuları Arası İşbirliği Düzeneği Özyineli DNS Sorgusu Özyineli olmayan sorgulara, DNS sunucular cevap olarak başka DNS sunucu adreslerini döndürürler. Özyineli sorgularda, DNS sunucu aranan IP adresini veya makinanın bulunamadığı uyarısını döndürür. 31 32
DNS İstemci ve Sunucu Önbellekleri Network File System (NFS) ve Network Information Service (NIS) Adres dönüştürme işlemini hızlandırmak ve bazı sorguları engellemek için uygulama programları, DNS resolver ve DNS sunucular ayrı ayrı önbellekler bulundurabilirler. Referans: http://en.wikipedia.org/wiki/domain_name_system 33 UNIX işletim sistemi, ağ düzeyi kütük paylaşım hizmetini, Network File System (NFS) sistemiyle vermektedir. NFS sistemi, bir UNIX makinasının yerel diskindeki kütükleri, başka bir UNIX makinasının erişimine açmaya imkan verir. Windows ta ağ düzeyi kütük paylaşımı, File and Printer Sharing servisleri ile yapmaktadır. Windows tan, bir UNIX makinasında saklanan kütüklere erişmek için, Samba sistemi kullanılabilir. NFS ile uzaktan erişime açılan kütüklere, erişim haklarını belirlemek için, Network Information Service(NIS) kullanılır. NIS sistemi, bir ana makinada saklanan UNIX kullanıcı bilgilerinin, başka makinalara paylaştırılmasına ve kullanıcıların bu makinalara girişine imkan sağlar. 34 NFS Bağlamında Uzak Kütük İşlemlerinin Ele Alınışı Uzak Alt Kılavuzun Yerel Kılavuz İçinde Sanal Konumu 35 36
Uzak bir Alt Kılavuza mount Programı ile Bağlanılması Uzak Kütüklere İlişkin Sistem Çağrılarının Ele Alınışı 37 38 NFS-VFS ile Farklı Kütük Yönetim Sistemlerine Erişim Dağıtık Protokollere Örnek: Distributed Transaction Processing Dağıtık veritabanı (Distributed Database) sistemlerinde, veri, birden fazla veritabanı sunucusunda saklanır. Bir transaction, ağ üzerinden birden fazla veritabanı sunucusunda işletilebilir. Bir transaction un gerektirdiği işlemler bitirildiği zaman, transaction a katılan bütün sunucular üzerinde commit işleminin yapılarak sonuçların kalıcı olarak dağıtık veritabanlarına yazılması gerekir. Eğer herhangi bir nedenle, bir sunucuda yapılması gereken işlemler yapılamazsa, transaction abort edilmelidir. Commit/abort işlemlerinin, sunucuların çakılması, ağ bağlantısının kopması gibi durumlarda, veri bütünlüğünü bozmadan yapılması önemli bir problemdir. 39 40
İki-aşamalı Onaylama (Two-Phase Commit) Protokolü İki-aşamalı Onaylama Protokolü İki aşamalı onaylama (2PC) protokolü, dağıtık sistemler üzerinde, düğümlerin bir transaction konusunda ortak commit/abort kararına varmasını sağlayan bir dağıtık algoritmadır. Protokole katılanlar: Coordinator: Protokolü yöneten düğüm Cohort: Protokole katılan diğer düğümler Protokolün aşamaları: Commit-Request aşaması Commit aşaması Coordinator Commit-Request Aşaması Commit Aşaması Query to commit Aggrement(Yes)/Abort(No) Commit/Rollback Acknowledgement Cohort 41 42 İki-aşamalı Onaylama Protokolü İki-aşamalı Onaylama Protokolünün Problemleri Coordinator, Query-to-commit gönderdikten sonra, bir cohort çakılırsa, coordinator timeout sonunda abort gönderir. 2PC, bloklayan bir protokoldür. Bir cohort mesaj bekleme sırasında sonsuz bekleme durumuna düşebilir. Eğer bir cohort, agreement mesajını gönderdikten sonra, coordinator çakılırsa, bu cohort, başka bir cohort tan transaction sonucunu öğrenene kadar beklemek zorunda kalır. 43 44
Üç-aşamalı Onaylama (Three-Phase Commit) Protokolü Üç-aşamalı Onaylama Protokolü Üç-aşamalı onaylama (3PC) protokolü, 2PC protokolünün eksiklerini gidermek üzere tasarlanmıştır. Bu protokol, aşağıdaki durumlarda, işlevsel olan sunucuların bir transaction hakkında karar vermesini sağlar ve bloklanmayı engeller: Commit işlemi sırasında coordinator veya cohort lardan birinin veya birkaç tanesinin çökmesi durumunda Bazı sunucuların ağının erişilemez olması durumlarında 45 46 Üç-aşamalı Onaylama Protokolü Referanslar http://en.wikipedia.org/wiki/two-phase_commit_protocol http://en.wikipedia.org/wiki/three-phase_commit_protocol http://ei.cs.vt.edu/~cs5204/sp99/distributeddbms/duckett/tpcp.html http://ei.cs.vt.edu/~cs5204/sp99/distributeddbms/sreenu/3pc.html 47 48