29 Ağustos 2014 Cuma

Postgresql Database Nedir,Nasıl Kurulur

PostgreSQL
Postgresql açık kaynak kodlu,gelişmiş bir Database yönetim sistemidir. Client-Server mimarisi temellidir. Çoğu database sisteminde olduğu gibi yazanlar ve okuyanlar birbirini bloklamaz. Standart haline gelmiş sql dilini kullanır. Çoğu kişi tarafından Mysql ile kıyaslansa da ikisinin benzer tek yönü açık kaynak kodlu sistemler olması olarak nitelendirilir.
Postgresql kaynaklarından okuduğum kadarıyla ; Oracle’ın 7 sürümüyle gelen, yazan ve okuyanların birbirini bloklamaması özelliğiyle (snapshat isolation) dizayn edilmiş ilk database postgresql’dir. Bu özelliği anlamak için http://en.wikipedia.org/wiki/Snapshot_isolation makalesi okunabilir. Snapshat isolation, bir örnekle açıklayacak olursak; mesela bir çalışan tablomuzun olduğunu ve bir çalışanın maaşına %50 zam yaptığımızı düşünelim, bu işlem uzun süren bir sql olsun ve 2 saat sonunda commit edilsin. Bu iki saat içinde database’den bu maaş bilgisini çekmeye çalışan birisi, bu verinin tutarlı bir haline erişmek zorundadır.Dolayısıyla eski maaş bilgisine erişmeye devam edecektir bu sql tamamlanana kadar. Bu durumda yazan ve okuyanlar birbirini bloklamamış oluyor. Postgresql ile kullanıcılar kendi datatiplerini,index tiplerini,operatörlerini yaratabilir. Postgresql’i ücretsiz olarak http://www.postgresql.org/download/ adresinden indirebilirsiniz. Bunun yanında çoğu linux dağıtımı içinde paketler halinde bulunmaktadır. İlgili RPM paketlerini indirip linux sunucumuza kurduğumuzda postgreyi yüklemiş oluyoruz..Detaylı kurulum adımları için https://wiki.postgresql.org/wiki/Detailed_installation_guides#General_Linux dökümanı incelenebilir.
Ben oracle Linux 6.3’ün kurulum sırasında postgres paketlerini seçtim ve Linux kurulduğu sırada postgres de kurulmuş olarak geldi. Oracle da olduğu gibi postgresde de linux üzerinde ayrı bir OS user’ı yaratılması gerekiyor. Dediğim gibi ben ilgili paketi seçtiğimde postgres OS user’ı da sistemimde yaratıldı.
Bu kurulum sırasında aşağıdaki environmentlar da oluşturuldu.
PGDATA=/var/lib/pgsql/data
PGPORT=5432
PGLOG=/var/lib/pgsql/pgstartup.log
Daha sonra postgres database’imizi ilk defa başlatmak için yapmamız gereken değişiklikler aşağıda sırasıyla verilmiş  ( http://www.postgresql.org/docs/9.1/static/runtime.html )
17.1. The PostgreSQL User Account
17.2. Creating a Database Cluster
17.3. Starting the Database Server
      17.3.1. Server Start-up Failures
      17.3.2. Client Connection Problems
17.4. Managing Kernel Resources
      17.4.1. Shared Memory and Semaphores
      17.4.2. Resource Limits
      17.4.3. Linux Memory Overcommit
17.5. Shutting Down the Server
17.6. Upgrading a PostgreSQL Cluster
      17.6.1. Upgrading Data via pg_dump
      17.6.2. Non-Dump Upgrade Methods
17.7. Preventing Server Spoofing
17.8. Encryption Options
17.9. Secure TCP/IP Connections with SSL
      17.9.1. Using Client Certificates
      17.9.2. SSL Server File Usage
      17.9.3. Creating a Self-signed Certificate
17.10. Secure TCP/IP Connections with SSH Tunnels
Database için sunucu üzerinde tanımladığımız dizini postgres’e gösteriyoruz. Bunu aşağıdaki kodu çalıştırıarak yapıyoruz. Directory PGDATA environment’ında verdiğimiz dizin olmalıdır.
Burda Database cluster, database sunucusu üzerinde çalışan bir single instance tarafından yönetilen database’ler topluluğu olarak tanımlanmaktadır. Bu initialization işleminden sonra PGDATA dizinine gittiğimiz zaman belli başlı konfigürasyon dosyalarının burada oluştuğunu görüyoruz.Ve default olarak postgres adıyla gelen bir database bu cluster’a eklenmiş oluyor.Bunun yanında initialization işlemi sırasında template1 adı verilen bir database daha bu clustera eklenmiş durumda.
Data area ise bu cluster içerisinde yer alan databaselerin datalarını tutan dizin olarak adlandırılır. Defaultu olmamakla birlikte  /var/lib/pgsql/data ve /usr/local/pgsql/data yaygın olarak kullanılır. İnitdb –d komutunu kullanabileceğimiz gibi pg_ctl komutunu da kullanabiliriz.
-D parametresiyle data direcroty dizinimizi gösteriyoruz. Bu data directory dizinini yaratmadıysak bile initdb komutu initialization işlemi sırasında kendisi oluşturmayı deneyecektir.


Oracle’daki password file mantığıyla düşünecek olursak, burda database’e erişim sırasında ıp bazlı bir kontrol de yapılmaktadır. PGDATA dizininde yer alan pg_hba.conf dosyası bu erişim kısıtlarıyla ilgili konfigürasyonlar yapılır. Database’i ilk defa start ettikten sonra bunun içerisinde değişiklik yapacağız. Yine karakter seti vb local sistem ayarlarını da initialization sırasında clustera alıyor.
Bu işlemlerden sonra database’i başlatmak için aşağıdaki komutu kullanıyoruz;
# pg_ctl start –l logfile
Daha sonra 5432 portunu kontrol ederek postgre servisinin dinlenip dinlenmediğini kontrol edebiliriz.
# lsof –i :5432


Oracle’da olduğu gibi postgres’de de kernel parametrelerini düzenlemeli ve resource limitlerini tanımlamalıyız.

Name
Description
Reasonable values
SHMMAX
Maximum size of shared memory segment (bytes)
at least several megabytes (see text)
SHMMIN
Minimum size of shared memory segment (bytes)
1
SHMALL
Total amount of shared memory available (bytes or pages)
if bytes, same as SHMMAX; if pages, ceil(SHMMAX/PAGE_SIZE)
SHMSEG
Maximum number of shared memory segments per process
only 1 segment is needed, but the default is much higher
SHMMNI
Maximum number of shared memory segments system-wide
like SHMSEG plus room for other applications
SEMMNI
Maximum number of semaphore identifiers (i.e., sets)
at least ceil((max_connections + autovacuum_max_workers + 4) / 16)
SEMMNS
Maximum number of semaphores system-wide
ceil((max_connections + autovacuum_max_workers + 4) / 16) * 17 plus room for other applications
SEMMSL
Maximum number of semaphores per set
at least 17
SEMMAP
Number of entries in semaphore map
see text
SEMVMX
Maximum value of semaphore
at least 1000 (The default is often 32767; do not change unless necessary)


Linux için önerilen kernel parametreleri aşağıdaki gibi set edilmelidir.
$ sysctl -w kernel.shmmax=17179869184
$ sysctl -w kernel.shmall=4194304

Shutdown işlemi için ise farklı yöntemler bulunmaktadır.
SIGTERM: Bu mode smart shutdown mode olarak adlandırılmaktadır. Bununla kapatırsak postgres yeni connectionlara izin vermeyecektir. Fakat varolan sessionların işleri yapılmaya devam edilir.Tüm sessionlar koptuktan sonra kapatma işlemi yapılır.Database online backup modda ise, backup moddan çıkana kadar bekler kapatmak için..

SIGINT: Fast shutdown mode. Yeni connectionlara izin vermez ve bağlı olan olan kullanıcıların transactionları abort edilir.DB backup modda ise backup modda terminate edilir.Ve yarıda kalan backup bir işimize yaramaz.

SIGQUIT: Immediate shutdown mode. Oracle’daki shutdown abort’a karşılık gelmektedir. Bir sonraki açılışta recovery ister.
pg_ctl -D /usr/local/pgsql/data stop -m fast

PGDATA dizininde pg_hba.conf dosyasına user ıp’mizi bağlanabileceği databaseleri yazıp nasıl bağlanmasını istediğimizi (passwor - güvenilir) belirtip
pg_ctl reload yaparak sistemin yeni konfigürasyonları tanımasını sağlayarak bağlanıyoruz database’e.. Dbye bağlanmak için ise editör olarak pgAdmin tool’unu kullanabiliriz..

....