galera etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
galera etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Eylül 2020 Çarşamba

PostgreSQL High Memory Utilization var mı nasıl kontrol edilir?

 PostgreSQL memory kullanımı fazla ise neler kontrol edilmesi gerekir?

Memoryden okumak her zaman diskten okumadan daha ölçülebilirdir, yani bütün database teknolojileri için kullanabildiğiniz kadar memory kullanmak isteyebilirsiniz.

Yaptığınız ayarlardan emin değil veya bir hatanız varsa, bu high memory utilization veya out-of-memory bile oluşturur.


Burada, nasıl PostgreSQL memory kullanımını kontrol edebileceğimize ve hangi parametreleri dikkate almanız gerektiğine bakacağız.

PostgreSQL mimarisi ile başlayalım.


PostgreSQL mimarisi

PostgreSQL mimarisi 3 temel parça üzerine kurulmuştur.

Processler, Memory ve Disk.


Memory iki sınıfa kategori edilebilir:


Local Memory: Her arka plan process’i tarafından kendi querileri işlemek için yüklenir ve alt alanlara ayrılmıştır.


*Work mem: Work mem ORDER BY ve DISTINCT işlemlerine göre tuple’ları sıralamak ve tabloları birleştirmek için kullanılır.


*Maintenance work mem: Bu alan bazı bakım işlemlerinde kullanılır.Örneğin, VACUUM, eğer "autovacuum_work_mem" belirtilmemişse.


*Temp buffers: Geçici tabloları depolamak için kullanılır.


Shared Memory: PostgreSQL server başlatıldığında PostgreSQL tarafından ayrılır ve onun işlemlerinde kullanılır. Alt alanlara ayrılmıştır.


*Shared buffer pool: PostgreSQL direkt memoryden çalışmak ve diske erişimi azaltmak için sayfalarla tabloları ve indexleri diskten yükler.


*WAL buffer:  The WAL data databasedeki işlem günlüğüdür ve değişiklikleri içerir. WAL buffer WAL data nın diske verilerini yazmadan önce verileri geçici olarak tuttuğu alandır.

Bu, kontrol noktası adı verilen önceden tanımlanmış bazı zamanlarda yapılır. Bir sunucu arızası durumunda bilgi kaybını önlemek için bu çok önemlidir.


* Commit log: Eşzamanlılık için bütün işlemleri kaydeder.


Ne olduğunu nasıl anlarsınız?

Eğer yüksek miktarda memory kullanımı varsa önce bu tüketimi yapan processin hangisi olduğunu belirleyiniz.

"Top" linux komutunu kullanın.


Muhtemelen buradaki en iyi seçenek "top" komutu ("htop" komutu da aynı işlevi görmektedir.)

Top komutu ile memory tüketen her bir processi ve processleri görebilirsiniz.

Yüksek miktarda memory kullanımından PostgreSQL sorumlu olduğundan emin olduktan sonra neden olduğunu kontrol edelim.


PostgreSQL Log'u kullanmak

Loglara baktığımızda aşağıdaki gibi bir mesaj ile karşılaşabiliriz:

"Resource temporarily unavailable

 

Out of memory: Kill process 1161 (postgres) score 366 or sacrifice child"


Eğer yeterli memory yoksa veya birden fazla hata varsa bunun gibi:

"FATAL:  password authentication failed for user "username"

 

ERROR:  duplicate key value violates unique constraint "sbtest21_pkey"

 

ERROR:  deadlock detected"


Beklenmedik davranışlar ile karşılaştığınızda database tarafında bu yüzden loglar kullanışlıdır bir sorunu belirlemede ve daha fazlasında.

Aslında bu logları parse edip alarmlar da oluşturabilirsiniz (“FATAL”, “ERROR” veya “Kill”).


Pg_top Kullanımı


Eğer bir PostgreSQL process’in yüksek memory kullandığını biliyor, ama bunu log dosyaları size yardımcı olmuyorsa, pg_top size yardımcı olacak kullanışlı bir araçtır.

Bu araç Linux Top ile benzerdir, ama özellikle PostgreSQL içindir. Yani, onu kullandığınızda database’niz üzerinde daha detaylı bilgi sahibi olursunuz, ve querileri kill edebilir, veya çalışan bir job’ın üzerinde yanlış bir şey var ise bunları tespit edebilirsiniz.


Ama database üzerinde bir error tespit edemediniz ve hala yüksek miktarda memory tüketiyorsa. O zaman muhtemelen database’inizin konfigürasyonuna bakmanız gerekecek.


Hangi konfigürasyon parametrelerini dikkate almak gerekir

Eğer herşey iyi gözüküyor ama hala yüksek memory kullanımı sorunu varsa,

konfigürasyonu kontrol etmeli ve doğru olduğundan emin olmalısınız.

Yani aşağıdaki parametreleri dikkate almalısınız.


Shared_buffers

Bu database sunucusunun kullandığı shared memory de kullandığı memory miktarıdır. Eğer bu çok az olursa, database daha fazla diski kullanır ve daha fazla yavaş olmasına sebep olur. Ama çok fazla olursa yüksek memory kullanımı oluşur.Dökümana göre, eğer database sunucusuna 1GB veya üzerinde RAM atanırsa, başlangıç olarak shared_buffer sistemdeki memory’nin %25’ni kullanır.


work_mem

Diskteki geçici dosyaya yazmadan önce ORDER BY, DISTINCT ve JOIN özel olarak kullandığı memory miktarıdır. Shared_buffers da olduğu gibi, bu parametreyi çok düşük miktarda verilirse, bir çok işlemimiz disk’e gider, ama fazlası memory kullanımı için tehlikeli olabilir. Varsayılan değeri 4 MB'dır.


max_connections

work_mem ayrıca  max_connecitons değeriyle el ele gider, çünkü her bağlantıda bu işlemleri aynı anda yürütür ve her işlemin geçici dosyalara veri yazmadan önce bu değerle belirtilen kadar memory kullanmasına izin verilecektir.

Bu parametre database bağlanan max eş zamanlı bağlantı sayısını belirler, eğer bağlantı sayısını yüksek ayarlarsak bu bize kaynak yetersizliği sorunları oluşturacaktır. Varsayılan değeri 100’dür.


temp_buffers

temp_buffers her oturumda geçici tabloları tutmak için kullanılır.

Bu parametre bu iş için en fazla memory alanını ayarlar. Varsayılan değeri 8 MB’dir.


maintenance_work_mem

Bu bir işlemin Vacuuming, adding indexes veya foreign keys tüketebileceği en fazla memory miktarıdır. İyi tarafı bu tip bir işlem bir oturum içinde bir işlem olarak çalışır ve çok yaygın bir şey değildir bir oturum içinde birden fazla işlem çalıştırması.Varsayılan değeri 64 MB’dır.

autovacuum_work_mem

Vacuum maintenance_work_mem’i kullanırım varsayılan olarak, ama onu bu parametre yardımıyla ayırabiliriz.  Her bir autovacuum worker için max memory kullanımını belirleyebiliriz.


wal_buffers

Diske henüz yazılmamış WAL data için kullanılan shared memory miktarıdır.

Varsayılan olarak shared_buffers’ın %3’dür, ama 64kb az olamaz ve WAL bölümünden de çok olamaz, tipik olarak 16 MB’dır.



Sonuç

Birden fazla sebebi olabilir yüksek memory kullanımının.
Biz burada sorunu bulmak için bakmanız gereken noktaları işaret etmeye çalıştık.

19 Mart 2014 Çarşamba

Mysql database cluster and Nginx web server high availability and scalability part 3

Wordpress high availability and scalability part 3

Haproxy kurulumu;
Haproxy Debian wheezy reposunda bulunmamakta kurmak için backport reposunu ekliyoruz.
#vi /etc/apt/source.list
deb http://mirror.vorboss.net/debian/ wheezy-backports main
deb-src http://mirror.vorboss.net/debian/ wheezy-backports main
#apt-get update
#apt-get install haproxy
#nano /etc/default/haproxy
ENABLED=1
#mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
#vi /etc/haproxy/haproxy.cfg
global
    log 127.0.0.1 local0 notice
    maxconn 2000
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option redispatch
    timeout connect  5000
    timeout client  10000
    timeout server  10000
listen appname 0.0.0.0:80
    mode http
    stats enable
    stats uri /haproxy?stats
    stats realm Strictly\ Private
    stats auth admin:P123456!
    balance roundrobin
    option httpclose
    option forwardfor
    server Nginx1 10.1.26.40:80 check
    server Nginx2 10.1.26.41:80 check

#service haproxy start
Keepalived kurulumu;
Kurulumun bu aşamasın da LB0 ve LB1 sanal bir interface ile birbirine bağlıyacağız , bu sanal interface dışarıdan gelen isteklere cevap verecek ve LBlardan herhangi biri down olsa dahi sistem çalışmaya devam edecek.
Her iki LB da yapacağımız
#apt-get install keepalived
#vi /etc/keepalived/keepalived.conf
LB1
vrrp_instance VI_1 {
interface eth0
state ASIL
virtual_router_id 10
priority 101   # 101 on asil, 100 on yedek
virtual_ipaddress {
10.1.26.45 #Sanal-ip-adres
}
}

LB2
vrrp_instance VI_1 {
interface eth0
state YEDEK
virtual_router_id 10
priority 100   # 101 on asil, 100 on yedek
virtual_ipaddress {
10.1.26.45 #Sanal-ip-adres
}
}
Her 2 LBda servisleri başlatıyoruz.
#service keepalived start
Asıl olanda aşağıdaki komutu çalıştırdığınız da ;
#ip addr Show eth0
Alacağınız çıktı;
Eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:6f:ed:60 brd ff:ff:ff:ff:ff:ff
    inet 10.1.26.43/24 brd 192.168.1.255 scope global eth0
    inet 10.1.26.45/32 scope global eth0
    inet6 fe80::20c:29ff:fe6f:ed60/64 scope link
       valid_lft forever preferred_lft forever
Domain adımızı public ipmize ,firewall tarafında ise sanal interface adresine yönlendirdiğimizde wordpress’in kurulum ekranı karşımıza çıkıyor.
Eğer sistemin çalışıp çalışmadığını test etmek istiyorsanız, aşağıdaki php kodu ile test edebilirsiniz veya http://haproxy-ipadres/haproxy?stats;  yazdığınızda kullanıcı adı ve parolayı girerek haproxy durumunu grafik ekrandan izleyebilirsiniz.
<?php         
header('Content-Type: text/plain');
echo "Server IP: ".$_SERVER['SERVER_ADDR'];
echo "\nClient IP: ".$_SERVER['REMOTE_ADDR'];
echo "\nX-Forwarded-for: ".$_SERVER['HTTP_X_FORWARDED_FOR'];
?>

Mysql database cluster and Nginx web server high availability and scalability part 2

Wordpress high availability and scalability part2

Nginx Kurulumu;


Nginx kurmak için Debian’nın kendi reposundan yararlanabilirsiniz fakat son stabil sürümüne erişemiyebilirsiniz.
Bu durum da ya Nginx’in kendi reposunu yada http://www.dotdeb.org/instructions/ reposunu kullanabilirsiniz ;)
Burada biz dotdeb reposunu kullandık.
#wget http://www.dotdeb.org/dotdeb.gpg
#sudo apt-key add dotdeb.gpg
#vi /etc/apt/source.list
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
#apt-get update
#apt-get install nginx
#apt-get install php5-fpm  php5-mysql php-pear php-apc php5-cgi php5-gd
Kurulumlar bittikten sonra , önce nginx sonra da php-fpm ayarlarını yapalım;
İlk önce nginx.conf ayarları;
#vi /etc/nginx/nginx.conf
user www-data;
worker_processes 2;
pid /var/run/nginx.pid;
events {
        worker_connections 768;
        multi_accept on;
}
http {
        ##
        # Basic Settings
        ##
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;
        server_names_hash_bucket_size 128;
        # server_name_in_redirect off;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        ##
        # Logging Settings
        ##
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        ##
        # Gzip Settings
        ##
        gzip on;
        gzip_disable "msie6";
        gzip_vary on;
        # gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml
application/xml+rss text/javascript;
        ##
        # fs cache
        ##
#       open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2;
#       open_file_cache_errors on;
        ##
        # Virtual Host Configs
        ##
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
Aşağıdaki ayarlar wp için hazırlanmıştır.
#vi /etc/nginx/sites-available/domain.net
fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=WORDPRESS:128m inactive=5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
                        listen 80;
                        server_name domain.net;
                        access_log /var/log/nginx/access.log combined;
                        error_log /var/log/nginx/error.log info;
                        root /var/www/;

                        location / {
                                               index index.php;
                                               try_files $uri $uri/ /index.php?$args;
                        }

        location ~ "\.(js|ico|gif|jpg|png|css|jpeg)$" {
                                               root    /var/www/domain/;
                                               expires       1y;
                                               add_header Cache-Control public;
                                               access_log off;
                        }

                        location = /favicon.ico {
                                               log_not_found off;
                                               access_log off;
                        }
                        location = /robots.txt {
                                               allow all;
                                               log_not_found off;
                                               access_log off;
                        }

                        location ~ /\. {
                                               deny all;
                        }

                        location ~* /(?:uploads|files)/.*\.php$ {
                                               deny all;
                        }

                        set $skip_cache 0;
                        ## POST requests and urls with a query string should always go to PHP
                        if ($request_method = POST) {
                                               set $skip_cache 1;
                        }
                        if ($query_string != "") {
                                               set $skip_cache 1;
                        }

                        # Don't cache uris containing the following segments
                        if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
                                               set $skip_cache 1;
                        }

                        # Don't use the cache for logged in users or recent commenters
                        if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
                                               set $skip_cache 1;
                        }

                        location ~ .php$ {
                                               include fastcgi_params;
                                               fastcgi_pass unix:/var/run/php5-fpm.sock;

                                               fastcgi_cache_bypass $skip_cache;
                                fastcgi_no_cache $skip_cache;

                                               fastcgi_cache WORDPRESS;
                                               fastcgi_cache_valid  5m;
                        }

                        location ~ /purge(/.*) {
                            fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
                        }
}

Sembolik link oluşturmamız gerekiyor /etc/nginx/sites-enabled/ altına
#ln -s /etc/nginx/sites-available/domain.net /etc/nginx/sites-enabled/domain.net
Yaptığımız ayarlarda hata varmı test edelim.
#nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
#service restart nginx
Php ayarları ;
#vi /etc/php5/fpm/php.ini
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
502 bad gateway türü bir hata ile karşılaşmak istemiyorsanız , Php’nin 9000 porttan çalıştığına emin olun.
#vi /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock  “dan”  listen = 127.0.0.1:9000

NFS kurulumu;
Biz nfs sunucusunu cluster controller  kurduk siz isterseniz başka bir makinaya sadece nfs kurabilirsiniz.
Nfs kurulumu ve nfs ten export edeceğmiz dizini web sunucularının /var/www dizinine bağlıyacağız ve wordpress dosyalarına 2 sunucuda erişebilecek.herhangi bir dosya değişikliğinde 2 sunucuda aynı anda dosyalar güncellenmiş olacak.
# apt-get install nfs-kernel-server nfs-common
#mkdir  -p /opt/wp
# chmod 755 wp/
#vi /etc/exports
/opt/wp                  nginx1-ip-adresi(rw,sync) nginx2-ip-adresi (rw,sync)
2 web sunucusunada gidip,
#apt-get install nfs-common
# mount -t nfs nfs-sunucu-ip:/opt/wp /var/www
Nfs sunucusunda aşağıdaki komutu yazdığınızda sunucuya bağlı olan clientları göreceksiniz.
# showmount –e
Wordpress dosyalarını indirelim ve nfs sunucuda ki paylaşıma atalım.(Nfs sunucu da read ,write ve sync izini verdiğimiz için bağlı olan web sunucularından birine de dosyalarınızı atabilirsiniz. )
#tar xvfz latest.tar.gz




Mysql database cluster and Nginx web server high availability and scalability part1

Wordpress high availability and scalability
Yapıyı kabaca anlatmak gerekirse dışarıdan gelen bütün istekleri Load balancer(Haproxy) karşılayacak ve web sunuculardan (Nginx) alıcak, Nfs sunucusundan bir dizin export edeceğiz ve bunları web sunucuların “www” dizinine mount edeceğiz.
Özetle ,Trafik arttıkça ölçeklendirilebilen bir yapı.
Kullanılan işletim sistemi ve yazılımlar;
·         Debian 7.4 ,
·         Wordpress,
·         Haproxy- Loadbalancer,
·         Nginx-Webserver, php5
·         Nfs server,
·         Galera Cluster (Percona)-Mysql 5.6 Database Cluster.
Galera Cluster kurulumu;
Kurulan bu yapı toplam da 4 Vm üzerine kurulmuştur 1 controler diğer 3’ü node olarak.
Cluster ve Node yapısı;
2 core cpu,
1 gb ram,
30 gb disk alanı.
Scripti oluşturmak için ;
Gerekli alanları doldurduktan sonra Cluster controller’a ‘wget’ indirip.
* tar xvfz s9s-galera-percona-3.2.0.tar
* cd s9s-galera-3.2.0/mysql/scripts/install
* bash ./deploy.sh  2>&1  |tee cc.log

Kurulumu çok kolay sadece sizden nodeların root veya kullanıcı passwordlerini girmenizi istiyor ve kurulumu kendi gerçekleştirmiş oluyor.

Not:
3.2.0 sürümün de olan bir bug var,(nodelar da ki ayarları yaparken my.cnf dosyasından dolayı hata vermekte ) onun çözümü de şöyle;
s9s-galera-percona*/mysql/config/my.cnf
my.cnf dosyasını açın deployment scripttin de:
evs.consensus_timeout=X
değişkenini aşağıdaki gibi değiştirin
evs.install_timeout=X
Yukarıda ki değişikleri yaptıktan sonra;
cd s9s-galera-percona*/mysql/scripts/install/
./bootstrap.sh
./install-cmon.sh -s
cat .s9s/greetings
Sorun çözülmüş ve kurulum bitmiş oluyor .
Galera web arayüzüne erişmek için;

Arayüz üzerinden loadbalancerı da ekleyelim.
Ama öncesin de Haproxy’nin reposunu Cluster contorller makinasının ekleyelim yoksa repo da bulamayım kurulum tamamlanmaz.
#vi /etc/apt/source.list
deb http://mirror.vorboss.net/debian/ wheezy-backports main
deb-src http://mirror.vorboss.net/debian/ wheezy-backports main
#apt-get update
Add Loadbalancer’ı tıkladığınız da aşağıdaki  gibi bir arayüz ile karşılacaksınız.
Proxy yapmak istediğiniz Mysql serverlar ı seçiyoruz, Loadbalancerın kurulmasını istediğiniz makinanın ip adresini yazıyoruz ve ya Cluster controllera kurabilirsiniz.
Haproxy nin çalışmasını istediğiniz portu giriyorsunuz.
Ve install haproxy dedikten sonra sizin yerinize Galera controller kurulumu yapıyor.
Not: Mysql’in default portunu girmeyiniz .

Herhangi bir node’a bağlanıp wordpress için bir database oluşturalım .Diğer nodelar kısa bir süre sonra güncellenecektir ve bir yerde oluşturduğunuz veritabanına diğer 2 nodedan da erişebileceksiniz.
#mysql –u root –p
> CREATE DATABASE  wordpress;
> CREATE USER 'kullanici_adi'@'%' IDENTIFIED BY 'sifre';
> GRANT SELECT,INSERT,UPDATE,DELETE ON wordpress.* TO 'kullanici_adi'@'%';
> FLUSH PRIVILEGES;