Yüksek hacimli siteler için veritabanı mimarisi nasıl optimize edilir?


28

Soru, belirli Mysql konfigürasyon maddeleri hakkında daha az, fakat birden fazla veritabanının kullanımı, okumaların bölünmesi ve birden fazla veritabanı sunucusuna yazılması hakkında daha fazla şey var, master + master? Master + Çoklu Köleler?

İnsanlar en iyi deneyime sahip olan nelerdi ve bunun nasıl başarılacağına dair herhangi bir örnek var mı?

Yanıtlar:


18

MySQL kümelerinin oldukça geniş bir deneyimine sahibiz - ve Percona, karmaşık yapılandırmaların sınırlarını zorlarken birçok kez bizimle birlikte çalıştı.

Magento salt okunur köleleri doğal olarak idare edebilir mi?

Magento , farklı veritabanı sunucularına (örneğin, EE 1.11 gibi) birkaç veri sürümünün haricinde, okuma / yazma işlemlerini yerel olarak yapabilme yeteneğine sahiptir select; ve tüm update/writesorguları tek bir yöneticiye iletme .

Ne zaman yapmalıyım

Bu daha uygun bir soru. MageStack gibi özel Magento işletim sistemleriyle , yerleşik sunucu tarafında gelişmiş önbellekleme tekniklerinin kullanılabilir olması ve kolayca kullanılması (Vernik ön uç önbellekleme ve Redis arka uç önbellekleme gibi) için daha yaygın hale geliyor.

Tarihsel olarak Magento, MySQL tarafından hiçbir zaman bağlanmadı - bunun yerine PHP. Ancak Cila ve Tam Sayfa Önbelleğe Alma (FPC) daha sık kullanıldığı için, tekrarlanan görevlerin yükü (kategori / ürün yükleri, sık aramalar) aniden emilir ve PHP daha az yüke dönüşür. Aslında, yalnızca içeriği başlangıçta oluşturmak veya önbelleğe alınamayan senaryoları tamamlamak için gerçekten devreye girer (sepete ekleyin, sipariş tamamlama vb.); açıklama amacıyla kasıtlı olarak idari yükü görmezden geliyoruz .

Her iki görüldüğü gibi her zaman, MySQL çoğu perakendeciler için endişe verici bir alanlar olmadığı gerçeği sadık kalarak, burada ve burada . Ancak, saatte yüzlerce emir işleme alanınızdaysa, tek veya çift rakam değil - yakında optimizasyon için bir alan haline gelecektir.

Sonuçta daha küçük mağazalar için (günlük <25 bin günlük benzersiz ziyaretçi)

Çabalarınız, ofsetten doğru donanımın bulunmasını önerebilecek ve makineyi mağazanız için en uygun biçimde ayarlayan uygun bir ana bilgisayar bulmak üzerine daha iyi odaklanacaktır . Master / Slave veya Master / Master konfigürasyonlarını izleyerek zamanınızı boşa harcamayın; bu, performans avantajı getirmez ve sonuçta sürekli dikkat ve gelişmiş MySQL bilgisi gerektirir.

Sonuçta donanım boyutlandırma ve seçim, MySQL optimizasyonundan daha büyük bir rol oynayacaktır.

Ancak daha büyük mağazalar için

Mağazanız büyümeye başladığında, dönüşüm veya işlem yükü tekrarlanan karmaşık insertsve tamamlama görevi ile daha fazla bir yük haline gelir updates. Her yeni siparişin eklenmesi, katalog stokunun azalmasını, ödeme geçitlerinden gelen geri aramaları ve EPOS / ERP sistemlerinden gelen güncellemeleri tetikleyecektir. Bunu, ilgili ürünlerin / kategorilerin ilişkili önbellek temizliği ile birleştirdiğinizde, yakında MySQL yükünün orantısız şekilde arttığını göreceksiniz.

Multi-master hiçbir zaman bizim önerebileceğimiz veya uygulanabilir bir seçenek olarak kabul edebileceğimiz bir çözüm değildir, ancak Master / Slave, okuma yükünü ikincil / üçüncül düğümlere dengeleyerek faydalar sağlayabilir (Kurumsal boyuttaki mağazalarda vurguluyoruz).

Ama yine de yapmak istiyorum

İlk önce, kölelerinizi yapılandırın. Biz Percona programları ve MySQL dallarının büyük savunucuları konum - aldıkları için ideal bir araca sahip sıcak innobackupex - Mevcut DB yedeklerini. Burada güzel bir yazı var .

Ustada

$ TIMESTAMP veya sekmeyi tamamlayın.

mysql
> GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'$slaveip' IDENTIFIED BY '$slavepass';
> quit;
innobackupex --user=username --password=password /path/to/backupdir
innobackupex --user=username --password=password /
       --apply-log /path/to/backupdir/$TIMESTAMP/

rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheSlave:/path/to/mysql/
scp /etc/mysql/my.cnf TheSlave:/etc/mysql/my.cnf

Köle üzerinde

/etc/init.d/mysql stop
mv /path/to/mysql/datadir /path/to/mysql/datadir_bak
mv /path/to/mysql/$TIMESTAMP /path/to/mysql/datadir
chown -R mysql:mysql /path/to/mysql/datadir
sed -i 's#server-id=1#server-id=2#g' /etc/mysql/my.cnf
/etc/init.d/mysql start
cat /var/lib/mysql/xtrabackup_binlog_info
> TheMaster-bin.000001     481

mysql
> CHANGE MASTER TO MASTER_HOST='$masterip', MASTER_USER='repl', MASTER_PASSWORD='$slavepass', MASTER_LOG_FILE='TheMaster-bin.000001', MASTER_LOG_POS=481;
> START SLAVE;

O zaman köleniz işler hale geldiğinde, pratikte, elde etmek için sadece birkaç ek kod satırı gerekir.

İçinde ./app/etc/local.xml

<default_read>
  <connection>
    <use/>
    <host><![CDATA[host]]></host>
    <username><![CDATA[username]]></username>
    <password><![CDATA[password]]></password>
    <dbname><![CDATA[dbname]]></dbname>
    <type>pdo_mysql</type>
    <model>mysql4</model>
    <initStatements>SET NAMES utf8</initStatements>
    <active>1</active>
  </connection>
</default_read>

Kaynaklar


"Tarihsel olarak, Magento hiçbir zaman MySQL ile bağlanmadı - ama PHP." Hangi Magento'dan bahsettiğinizi bilmiyorum ama EAV her zaman bir performans sorunu olmuştur. :)
B00MER

1
Pekala, yönettiğimiz 400+ Magento sunucusuna ... çoğunluk kuralı olarak, MySQL düşünülmeden önce birçok darboğazdan bahsediyorum. Aslında, en iyi örnek, Aralık ayı boyunca müşterilerimizden biri. Saatte 15 k benzersiz ziyaretçi ile, tek bir sunucu kurulumunda (32 çekirdekli, 64 GB RAM) saatte 200 sipariş işleme. Bu sorunun tipik okuyucusu için, bu cildi bile yapmaları son derece muhtemel değildir. Bu yüzden karşılaşacakları trafik ve işlemlerin seviyelerinde, MySQL tıkanıklık değildir.
Ben Lessani - Sonassi

1
@Brandon. Sadece eklemek istiyorum. MySQL'i ayarlamanın bir zorunluluk olmadığını inkar etmiyorum - tabii ki öyle. Ancak, performansı artırmak için bir Master / Master veya Master / Slave ayarını yapılandırmak, aslında belli bir devrilme noktasına vurana kadar gerekli değildir - ve bu oldukça yüksektir. Ayrıca, böyle bir şeyi yapmaya çalışarak performansta bir darboğaza veya veri bütünlüğünü riske atmak çok daha olasıdır.
Ben Lessani - Sonassi

5

Genel olarak, Magento CPU'ya bağlıdır, veritabanına bağlı değildir ve CPU aktivitesinin çoğu önbelleğe alınabilir, bu yüzden vernik / nginx kurulumlarında bu kadar çok ders bulacaksınız. Ayrıca, yöneticinizi burada ayrıntılarıyla anlatıldığı gibi ayrı bir web düğümüne taşıyabilirsiniz .

Genel sağlamlık için paranın karşılığını almanın en iyi yolu, yönetilen bir MySQL hizmeti olacaktır.

Yalnızca Amazon RDS konusunda deneyimim var, ancak bunlar yerine çalışma, yedeklemeler, yükseltmeler, yukarı / aşağı ölçeklendirmenin yanı sıra okuma kopyası oluşturma işlemlerini de otomatikleştiriyorlar. Böylece, otomatik yük devretme özelliğine sahip yüksek kullanılabilirlikteki bir ana düğüme sahip olabilirsiniz - Amazon, köleyi senkronize etmek için özelleştirilmiş bir ikili günlük çoğaltması kullanır, yük devretme genellikle 2 dakikadan daha az sürer ve ardından sizin kadar çok sayıda okuma kopyası oluşturabilirsiniz. Raporlama / entegrasyon ihtiyaçlarınız için ölçeklendirmeniz gerekir.

Magento'nun mimarisi ile çok iyi okunabilen okuma / yazma bölümlerine baktım, fakat benim kullanım durumumda veritabanı bir darboğaz değil. Neyin optimize edilmesi gerektiğini tahmin etmek yerine, xhprof / xhgui gibi bir profil oluşturmayı şiddetle tavsiye ederim . Profillemenin ilk kuralı ölçmektir.


Lütfen, soruların bağlantılarla yanıtlandığı bir yer imi web sitesi oluşturmak için burada değiliz. Cevabın önemli kısımlarını buraya ekleyin ve referans için bağlantıyı sağlayın.
j0k

@ j0k Bağlantılar başvuru için sağlanmıştır ve cevap kendi başına durur - katılmıyorsanız, lütfen daha belirgin olun.
Ralph Tice,

Evet, en azından cevabınız diğer cevaptan daha iyi. Demek istediğim, OP neyin yapılandırılacağı konusunda daha fazla teknik malzemeye ihtiyaç duyabilir, neden bir mimari şema vb.
j0k

5

Bununla ilgili herhangi bir üretim deneyimim olmadı, ancak bazı kazma işlemlerinden sonra bu makaleyi buldum . Bu yazıda birisi Magento için ana-köle çoğaltmasının nasıl kurulacağını açıklıyor, bu yüzden sizin için yararlı olabilir.

En önemli bit:

/app/etc/local.xml

<default_setup>
    <connection>
        <host><![CDATA[Master-host]]></host>
        <username><![CDATA[user]]></username>
        <password><![CDATA[pass]]></password>
        <dbname><![CDATA[magentodb]]></dbname>
        <active>1</active>
    </connection>
</default_setup>
<default_read>
    <connection>
        <use/>
        <host><![CDATA[Slave-host]]></host>
        <username><![CDATA[user]]></username>
        <password><![CDATA[pass]]></password>
        <dbname><![CDATA[magento]]></dbname>
        <type>pdo_mysql</type>
        <model>mysql4</model>
        <initStatements>SET NAMES utf8</initStatements>
        <active>1</active>
    </connection>
</default_read> 

Master MySQL sunucusu için yapılandırma (/etc/mysql/my.cnf) dosyaya aşağıdaki içeriği ekleyin:

[mysqld]
server-id       = 1
log_bin         = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size     = 100M
binlog_do_db        = magento_demo
binlog_ignore_db    = mysql 

Slave MySQL sunucusu için yapılandırma (/etc/mysql/my.cnf) dosyaya aşağıdaki içeriği ekleyin:

[mysqld]
server-id=2
log-bin=mysql-bin
master-host=192.168.1.2
master-user=username
master-password=111111
master-port=3306
replicate-do-db=magento_demo
replicate-ignore-db=mysql
master-connect-retry=60 

Her iki MySQL sunucusunu daha sonra yeniden başlatın


1
Yalnız bağlantı kötü bir cevap olarak kabul edilir, çünkü kendisi tarafından anlamsızdır ve hedef kaynağın gelecekte canlı olacağı garanti edilmez . Buradaki cevabın önemli kısımlarını içermesi ve referans için bağlantı sağlaması tercih edilir.
j0k

@ j0k, istendiği gibi yapıldı;)
Kenny

3

Bir fikir, katalog okumalarınızı dns round-robin'i kullanarak slave server (lar) a bölebilirsiniz .

Böylece MySQL'de normal master -> slave çoğaltmasını ayarlayın.

Daha sonra Magento kurulumunuzda, kataloğunuzu round-robin yapılandırılmış dns ana makinenizden okuma yapacak şekilde yapılandırabilirsiniz. Yazıyor ana veritabanında kalacak.

Bunu içinde yapabilirsiniz app/etc/local.xml

<catalog_read_setup>
   <connection>
      <host><![CDATA[round.robbin.dns.host]]></host>
      <username><![CDATA[USERNAME]]></username>
      <password><![CDATA[password]]></password>
      <dbname><![CDATA[DATABASE]]></dbname>
      <initStatements><![CDATA[SET NAMES utf8]]></initStatements>
      <model><![CDATA[mysql4]]></model>
      <type><![CDATA[pdo_mysql]]></type>
      <pdoType><![CDATA[]]></pdoType>
      <active>1</active>
   </connection>
</catalog_read_setup>
<catalog_read>
   <connection>
     <use>catalog_read_setup</use>
   </connection>
 </catalog_read>

Farklı bir MySQL örneğini aynı şekilde kullanmak için herhangi bir çekirdek (ve 3. parti) modülü yeniden yönlendirebilirsiniz.


1
DNS turu robin hiçbir şekilde bir çözüm değildir. MySQL proxy veya HAProxy, MySQL okuma yükünü dengelemek için çok daha karmaşık çözümlerdir.
Ben Lessani - Sonassi,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.