• 17-03-2021, 16:30:40
    #1
    Selamlar,

    MySQL tablosunda yaklaşık 10K post olan bir tablo var. Buraya sayfalama için atılan istekler çok sık olursa bazen aynı kayıtlar dönüyor. Detayları aşağıda paylaşıyorum.

    • PHP localhost'ta çalışıyor, test DB uzakta.
    • Test için 500 ms'de bir pagination yoluna istek atılıyor, p=1,2,3 gibi artarak gidiyor.
    • Bazen 10. sayfanın içeriği bazen, 50. sayfanın içeriği aynı geliyor.
    • DB'yi localhost'a alınca ya da istek süresini uzatınca sorun yok fakat DB uzakta olmalı ve bu kısa süre içerisinde yanıt verebilmeli.

    Klasik, yalın bir sorgu:
    SELECT * from posts  LIMIT {$limit} OFFSET {$offset}
    Test işlemi yapılırken istek atılan sunucu Ubuntu 18, 2 GB RAM, 1 CPU, MySQL 5.7. PHP 7.x PDO.

    Çözüm ne olabilir sizce?
    Teşekkürler.
  • 17-03-2021, 16:32:40
    #2
    aynı veri merkezinden iki sunucu şeklinde(mysql - web server) çalışırsanız muhtemelen sorununuz çözülür.
  • 17-03-2021, 16:45:19
    #3
    Bilisimworld adlı üyeden alıntı: mesajı görüntüle
    aynı veri merkezinden iki sunucu şeklinde(mysql - web server) çalışırsanız muhtemelen sorununuz çözülür.
    Bu durumda da aynı sorun yaşanıyor. Aynı DC'de Web ve DB iki farklı VPS açıp, haberleşmeyi iç network IP'den versek dahi, bu sorun yaşanıyor. (DB ve APP farklı makinelerde çalışıyor olmalı).
  • 17-03-2021, 16:51:28
    #4
    Hocam katmanlı mimari yapısı kullanmanız gerekir. Client'lardaki tüm işlemler sunucu tarafında işleme tabi tutulmalı ve oradan db ye post olmalı.
  • 17-03-2021, 16:55:22
    #5
    LORDD adlı üyeden alıntı: mesajı görüntüle
    Bu durumda da aynı sorun yaşanıyor. Aynı DC'de Web ve DB iki farklı VPS açıp, haberleşmeyi iç network IP'den versek dahi, bu sorun yaşanıyor. (DB ve APP farklı makinelerde çalışıyor olmalı).
    bu şartlarda stabil çalışmıyorsa hatayı başka yerde arayabilirsiniz, mysql tablolarınız MYISAM mı İnnoDB mi ?

    MYISAM ise innodb ye çevirebilirsiniz, ek olarak süreyi 1 sn olarak yükseltip deneyebilirsiniz.

    Benim tahminim db myisam ise işlemi bitirmeden yeni istek gidiyor olabilir oda büyük ihtimalle eski veriyi geri yaziyor olabilir.

    Tamamen tahmin, yazdıklarım çok başka sorunlarda olabilir. mysql timeout süresi kısaltılabilir işlem mi takılı kalıyor anlayabilmeniz için veya phpmyadmin den işlemler sekmesinden izleyebilirsiniz işlemleri..

    kolay gelsin.
  • 17-03-2021, 16:58:41
    #6
    perkosan adlı üyeden alıntı: mesajı görüntüle
    Hocam katmanlı mimari yapısı kullanmanız gerekir. Client'lardaki tüm işlemler sunucu tarafında işleme tabi tutulmalı ve oradan db ye post olmalı.
    Mevcut yapı şöyle; istek talebi client'tan geliyor. App sunucusunda front-end, back-end API'a istek atıyor o da DB server'dan çekip yanıtlıyor.

    Şu an yaptığımız testte 6. sayfada dahi duplicate yanıt döndüğü oluyor (bu kadar olmamalı). Bu durum ve yapıya rağmen farklı bir çözüm öneriniz varsa detaylıca paylaşır mısınız lütfen?
  • 17-03-2021, 17:05:22
    #7
    Bilisimworld adlı üyeden alıntı: mesajı görüntüle
    bu şartlarda stabil çalışmıyorsa hatayı başka yerde arayabilirsiniz, mysql tablolarınız MYISAM mı İnnoDB mi ?

    MYISAM ise innodb ye çevirebilirsiniz, ek olarak süreyi 1 sn olarak yükseltip deneyebilirsiniz.

    Benim tahminim db myisam ise işlemi bitirmeden yeni istek gidiyor olabilir oda büyük ihtimalle eski veriyi geri yaziyor olabilir.

    Tamamen tahmin, yazdıklarım çok başka sorunlarda olabilir. mysql timeout süresi kısaltılabilir işlem mi takılı kalıyor anlayabilmeniz için veya phpmyadmin den işlemler sekmesinden izleyebilirsiniz işlemleri..

    kolay gelsin.
    Tablolar InnoDB. Yukarda yazdığım üzere, süreyi arttırınca bu sorun yaşanmıyor. (1 saniyede çok az duplicate geliyor, 1,5'ta hiç duplicate yok).
    Fakat hızlı yanıt dönmesi gerekiyor, sonraki sayfalar için süreyi arttırabiliriz.

    Hatırlatmakta fayda var; şu an bu test makinesine sadece test user istek atıyor, dışarıya kapalı. CPU ve RAM kullanımı %1'in altında yani makine donanımsal olarak yorulmuyor.

    MySQL conf timeout ya da connection ile ilgili farklı bir durum söz konusu gibi geldi bana ama uzmanlık alanım olmadığı için denediğim conf seçeneklerinden emin değilim.
  • 17-03-2021, 17:11:13
    #8
    Hocam kendi sunucularımda kullandıgım my.cnf bilgilerini gönderiyorum bir deneyin, /etc/my.cnf.d/server.cnf veya client.cnf olarak kullanabilirsiniz (centos kullanıyorum ben genelde ubuntuda da dizin aynıdır muhtemelen, Cyberpanel kullanıyorum panel olarakta ama bunlar size sorun yaratmayacaktır diye umuyorum.)

    Herhangi bir soruna karşı mevcut dizinde dosya var ise , yedekleyin dosyayı. işlemleri yapamayacagınızı düşünüyorsanız mysql serverinizin root bilgilerini pm ile gönderirseniz sizin için yapabilirim.

    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    
    [mysqld]
    user= mysql
    pid-file= /var/lib/mysql/mysql.pid
    socket= /var/lib/mysql/mysql.sock
    port= 3306
    datadir= /var/lib/mysql
    
    open_files_limit=50000
    max_allowed_packet=268435456
    
    innodb_buffer_pool_size=1G
    
    innodb_log_file_size=256M
    innodb_flush_method=O_DIRECT
    innodb_io_capacity=1000
    innodb_old_blocks_time=1000
    innodb_open_files=5000
    
    key_buffer_size=16M
    read_buffer_size=256K
    read_rnd_buffer_size=256K
    query_cache_size=128M
    query_cache_limit=5M
    join_buffer_size=4M
    sort_buffer_size=4M
    max_heap_table_size=64M
    tmp_table_size=64M
    table_open_cache=4500
    table_definition_cache=4000
    thread_cache_size=50
    LORDD adlı üyeden alıntı: mesajı görüntüle
    Tablolar InnoDB. Yukarda yazdığım üzere, süreyi arttırınca bu sorun yaşanmıyor. (1 saniyede çok az duplicate geliyor, 1,5'ta hiç duplicate yok).
    Fakat hızlı yanıt dönmesi gerekiyor, sonraki sayfalar için süreyi arttırabiliriz.

    Hatırlatmakta fayda var; şu an bu test makinesine sadece test user istek atıyor, dışarıya kapalı. CPU ve RAM kullanımı %1'in altında yani makine donanımsal olarak yorulmuyor.

    MySQL conf timeout ya da connection ile ilgili farklı bir durum söz konusu gibi geldi bana ama uzmanlık alanım olmadığı için denediğim conf seçeneklerinden emin değilim.
  • 17-03-2021, 17:25:27
    #9
    Bilisimworld adlı üyeden alıntı: mesajı görüntüle
    Hocam kendi sunucularımda kullandıgım my.cnf bilgilerini gönderiyorum bir deneyin, /etc/my.cnf.d/server.cnf veya client.cnf olarak kullanabilirsiniz (centos kullanıyorum ben genelde ubuntuda da dizin aynıdır muhtemelen, Cyberpanel kullanıyorum panel olarakta ama bunlar size sorun yaratmayacaktır diye umuyorum.)

    Herhangi bir soruna karşı mevcut dizinde dosya var ise , yedekleyin dosyayı. işlemleri yapamayacagınızı düşünüyorsanız mysql serverinizin root bilgilerini pm ile gönderirseniz sizin için yapabilirim.

    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    
    [mysqld]
    user= mysql
    pid-file= /var/lib/mysql/mysql.pid
    socket= /var/lib/mysql/mysql.sock
    port= 3306
    datadir= /var/lib/mysql
    
    open_files_limit=50000
    max_allowed_packet=268435456
    
    innodb_buffer_pool_size=1G
    
    innodb_log_file_size=256M
    innodb_flush_method=O_DIRECT
    innodb_io_capacity=1000
    innodb_old_blocks_time=1000
    innodb_open_files=5000
    
    key_buffer_size=16M
    read_buffer_size=256K
    read_rnd_buffer_size=256K
    query_cache_size=128M
    query_cache_limit=5M
    join_buffer_size=4M
    sort_buffer_size=4M
    max_heap_table_size=64M
    tmp_table_size=64M
    table_open_cache=4500
    table_definition_cache=4000
    thread_cache_size=50
    Ubuntu 18'de şurada, /etc/mysql/mysql.conf.d/mysqld.cnf

    Bunları girip restart ederek tekrar denedim ama daha erken duplicate geldi bu sefer de hocam.