Pages

22 Şubat 2011 Salı

Database Resident Connection Pooling(DRCP) ile bağlantı havuzu oluşturma

Bu yazıda Oracle 11g ile birlikte gelen yeni bir özelliği inceleyeceğiz. Database Resident Connection Pooling(DRCP), tipik web uygulamalarında kullanılan veritabanı içinde bağlantı havuzu oluşturma metodudur. Kullanılan web uygulamasının veritabanı bağlantısını kısa süreli bağlantı için kullanıp, çalışmasını bitirince bağlantıyı serbest bırakan tarzda uygulama türleri için ideal bir bağlantı havuzu metodudur. DRCP, dedicated sunucuları toplar. “Pooled server(toplu sunucu)”, sunucu arkaplan prosesleri ve veritabanı oturumu kombinasyonu ile aynı anlama gelmektedir.

DRCP, aynı middle-tier sunucu üzerindeki middle-tier prosesler üzerinden veritabanı bağlantısı paylaşımını etkinleştirebildiği gibi, gerektiğinde middle-tier hostlar üzerindende bağlantı paylaşımını etkinleştirebilmektedir. Bu olay, geniş sayıda istemci bağlantılarını desteklemek için gereken veritabanı kaynaklarında inanılmaz derecede yük azalmasına sebebiyet verir, böylece veritabanında bellek talebinde azalma olur ve hem veritabanı katmanında, hemde middle-tier katmanında ölçeklenebilirlik artar. Halihazırda uygun bir sunucu havuzunun olması, aynı zamanda istemci bağlantısı oluşturma ve devre dışı bırakma maliyetini azaltmak yoluyla ilave katma değerlerde sağlar.

DRCP, middle-tier katmanında bağlantı havuzu oluşturma imkanının olmadığı çoklu prosesli ve tekil thread uygulama sunucuları(PHP/Apache gibi) gibi mimarilerde oldukça kullanışlıdır.

DRCP kullanıldığında oturum belleği için PGA’dan alan tahsis edilir. İstemci tarafından ilk bağlantı talebi alındığında “Connection Broker” uygun bir toplu(pooled) sunucuyu alır ve istemci bağlantısını bu toplu sunucuya  devreder. Eğer uygun bir toplu sunucu yoksa, DRCP bir tane oluşturur. Eğer havuz, maksimum sayıyı aştıysa bir toplu sunucu boşa çıkıncaya kadar, bu istemci bağlantısı kuyrukta beklemeye alınır. Veritabanı kaynakları serbest bırakıldığında, bu toplu sunucu tekrar havuza serbest bırakılır. Bellek gereksinimi toplu sunucu sayısı ve onların oturumları ile orantılıdır.Her bir toplu sunucu için bir oturum vardır.

DRCP’nin dedicated ve shared sunucu yapılarına nazaran ne kadar efektif şekilde bellek kullandığına şöyle örnek verebiliriz. Her bir oturum için 300KB bellek ve her bir sunucu prosesi için 3MB bellek gereksinimi duyan bir uygulama çalıştırdığınızı düşünün. Havuz büyüklüğü 100 ayarlanmış olsun ve paylaşımlı sunucu sayısıda 100 olsun. 5000 istemci olduğunda, dedicated, shared sunucu ve DRCP kullanarak teker teker ne kadar toplam bellek ihtiyacı oluşacak bir inceleyelim. Her oturum için toplu havuz için PGA’da tahsis edilen küçük parçacık(granül) boyutu 35KB’dır.

Dedicated Server
Kullanılan bellek = 5000 X (300 KB + 3 MB) = 16.5 GB
Shared Server
Kullanılan bellek = 5000 X 300 KB + 100 X 3 MB = 1.8 GB
Database Resident Connection Pooling
Kullanılan bellek = 100 X (300 KB + 3 MB) + (5000 X 35KB)= 505 MB

Ne zaman DRCP kullanılmalıdır?

  • Geniş sayıda istemci bağlantısının en az bellek kullanımı ile desteklenmesinin gerektiği durumlarda,
  • İstemci uygulamalarının benzer olduğu ve oturumu paylaştığı veya tekrar kullanabildiği durumlarda,
  • İstemci uygulamalarının veritabanı bağlantısını kazanıp, diğerlerine nazaran daha kısa süreli kullandıktan sonra serbest bırakmak durumunda kaldığı yapılarda,
  • Oturum ilişkisinin(istemcinin hep aynı sunucuya gittiği durumlarda -bellekten belleğe) istemci talepleri üzerinden gerekmediği durumlarda,
  • İstemci tarafında birçok proses ve birçok hostun olduğu durumlarda.
Bunun yanında DRCP kullanımında bir takım kısıtlamalarda mevcuttur. Örneğin, veritabanını DRCP ile bağlantı açıldığında kapatamazsınız, DRCP yi durduramazsınız, bağlı bir kullanıcının şifresi değiştirilemez, paylaşımlı veritabanı linki ile DRCP ye bağlantı açılamaz ve şifreleme, sertifika gibi Gelişmiş Güvenlik Seçenekleri(ASO) kullanılamaz.

Database Resident Connection Pooling(DRCP) yapılandırması

Oracle veritabanı kurulduğunda SYS_DEFAULT_CONNECTION_POOL varsayılan bağlantı havuzu olarak gelmektedir ancak başlatılmamıştır. DRCP yi etkinleştirmek için, bağlantı havuzunun başlatılması gerekmektedir.

  1. SYS kullanıcı olarak oturum açarak aşağıdaki paketi çalıştırıyoruz.
$ sqlplus sys/password as sysdba
SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL();

Bundan sonra instance her başladığından bağlantı havuzu otomatik olarak başlayacaktır. Oracle RAC ortamında yukardaki komut düğümlerden sadece birinde çalıştırılmalıdır, böylece diğer düğümlerdede otomatik olarak başlatılmış olur.

  1. Uygulamanın veritabanına bağlantısında POOLED takısı kullanılmalıdır veya tnsnames.ora dosyasında yeni bir servis oluşturulmalıdır.
linux1:1521/orcl:POOLED

veya aşağıdaki gibi tnsnames.ora dosyası içerisine ORCL_DGRP adında yeni bir servis eklenir ve DGRP bağlantısını kullanacak oturumlar bu yeni servis ismi üzerinden başlatılır. Bu tavsiye edilen yapılandırma türüdür.

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linux1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ORCL_DGRP =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = linux1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = POOLED)
      (SERVICE_NAME = orcl)
    )
  )


DRCP bağlantılarında performansın geliştirilmesi
Database Resident Connection Pool etkinleştirildikten sonra pakette yapılacak birkaç ekleme ile bağlantı performansında geliştirmeler yapılabilir.

minsize à havuzun kesin olarak en az sayıda  sunucu ile geleceği ve devame edeceğini sağlar. Varsayılan değeri 4’tür.
maxsize à maksimum sayıdaki toplu havuzu belirtir. Maxsize değeri aşıldığında, istemci talebi, uygun bir toplu havuz boşa çıkıncaya kadar bekler. Varsayılan değeri 40’dır.
inactivity_timeout à boşta olan toplu havuzu kaynakları elverişli hale getirmek için sonlandırır. Varsayılan değer 300 saniyedir. minsize değerinde toplu havuz kullanılıyorsa devreye girmez.
max_think_time à Toplu havuzların ölü bağlantılar veya kötü istemciler tarafından kalıcı olarak kilitlenmemesi için kullanılır. Uygulamanın ne kadar süre işlem yapmadığını belirtir. Varsayılan değer 120 saniyedir.
max_lifetime_session à Toplu havuz için maksimum yaşam süresi.

Aşağıdaki örnek komut ile değişiklik işleme sokulur.

exec dbms_connection_pool.alter_param('SYS_DEFAULT_CONNECTION_POOL', 'MAX_LIFETIME_SESSION', '120');

Aşağıdaki grafik DRCP kullanımında bellek kullanımını göstermektedir.



DBA_CPOOL_INFO görünümüne sorgu çekilerek havuz durumu, maksimum ve minimum bağlantı sayısı ve boşta oturumların timeout süreleri elde edilebilir.

SQL> SELECT connection_pool, status, maxsize FROM dba_cpool_info;

CONNECTION_POOL                STATUS              MAXSIZE
------------------------------                 ----------------          ----------
SYS_DEFAULT_                          INACTIVE          40
CONNECTION_POOL                    

V$CPOOL_STATS görünümüne sorgu çekilerek, oturum talep sayıları, havuz içinde bulunan talebi karşılayan oturum sayısı ve her bir oturum için toplam bekleme süresi gibi bilgiler elde edilebilir.

SQL> SELECT pool_name, num_requests, num_hits, num_misses
           FROM v$cpool_stats;

POOL_NAME                                      NUM_REQUESTS   NUM_HITS     NUM_MISSES
----------------------------                         -----------------------     ---------------   -------------------
SYS_DEFAULT_CONNECTION      1                                   0                      1         
_POOL            


0 yorum:

Yorum Gönder