Veritabanları

Bir sitenin hızlı ya da yavaş olduğu yer: veritabanı.

Uygulamanızın arkasındaki veritabanını kuruyor, ayarlıyor, çoğaltıyor ve yedekliyoruz; yedekleri de geri yükleyerek kanıtlıyoruz.

Tek bir şema olarak çizilmiş yedi motor

Her kutu, kurduğumuz, ayarladığımız ve yedeklediğimiz bir veritabanıdır. Çizgiler, işlettiğimiz sistemlerde birlikte nasıl çalıştıklarını gösterir - çoğu uygulama bunlardan bir tanesine değil, iki ya da üçüne ihtiyaç duyar.

SQLitegömülü
Kullanım
Tek bir veri dosyası ve aynı anda tek bir yazıcısı olan uygulamalar ve araçlar
Ayarladığımız
journal_mode=WAL
Yedekler
Dosyanın çevrimiçi bir kopyası; kullanımdaki bir dosyanın kopyası asla değil
MySQLilişkisel
Kullanım
Mağazalar, WordPress ve çoğu PHP uygulaması
Ayarladığımız
innodb_buffer_pool_size
Yedekler
Tam yedekler ve ikili günlükler, herhangi bir ana kadar
Neden MySQL kullanıyoruz
Redisbellek içi
Kullanım
Önbellek, oturumlar, kuyruklar ve sayaçlar
Ayarladığımız
maxmemory-policy
Yedekler
Anlık görüntüler ve append-only dosya
PostgreSQLilişkisel
Kullanım
Muhasebe, ERP, raporlar ve karmaşık sorgular
Ayarladığımız
shared_buffers · work_mem
Yedekler
Temel yedekler ve arşivlenmiş WAL, herhangi bir ana kadar
MariaDBilişkisel
Kullanım
MySQL ile aynı işler, ayrıca Galera kümeleri
Ayarladığımız
innodb_buffer_pool_size
Yedekler
mariabackup ve ikili günlükler, herhangi bir ana kadar
MongoDBbelgeler
Kullanım
Yapısı sürekli değişen kayıtlar: olaylar, kataloglar, içerik
Ayarladığımız
wiredTiger cacheSizeGB
Yedekler
Belirli bir an için oplog ile bir replica set
  1. Bir uygulama tek dosyaya sığmaz olduğunda bir veritabanı sunucusuna taşınır.
  2. MariaDB, MySQL'in bir çatalı olarak başladı; çoğu uygulama ikisi arasında değişiklik olmadan geçer.
  3. Redis önde durur: tekrarlanan yanıtlar ve oturumlar bellekte kalır.
  4. PostgreSQL uygulamalarının önünde aynı önbellek.
  5. Arama indeksi ana veritabanından beslenir, asla tersi değil.
  6. PostgreSQL'in JSONB özelliği, MongoDB gerekmeden önce birçok belge işini karşılar.

Hangi iş için hangi veritabanı

Kararı genellikle uygulama verir ve biz ona uyarız. Seçimin açık olduğu yerde şöyle seçeriz.

İş İlk tercihimiz Bu da olur Neden
Bir mağaza, bir WordPress sitesi veya bir PHP uygulaması MySQL · MariaDB PostgreSQL Uygulamanın üzerinde geliştirilip test edildiği ve en geniş desteğe sahip olan.
Yoğun birleştirmeli muhasebe, ERP ve raporlar PostgreSQL MySQL 8 Katı işlemler, pencere fonksiyonları ve karmaşık sorgular için yapılmış bir planlayıcı.
Önbellek, oturumlar, kuyruklar ve hız sınırları Redis Memcached Bellekten yanıtlar. Orada yalnızca kaybolursa yeniden oluşturulabilecek olanı tutun.
Ürünler veya makaleler arasında arama OpenSearch · Elasticsearch MySQL · PostgreSQL full-text Bir LIKE sorgusunun veremeyeceği alaka, yazım hataları, filtreler ve fasetler. Küçük bir katalog için veritabanının kendi tam metin araması yeterlidir.
Bir mobil uygulama, bir masaüstü aracı veya küçük bir iç hizmet SQLite —Başka seçenek yok Çalıştırılacak sunucu yok: tek bir dosya, güvenli şekilde kopyalanarak yedeklenir.
Yapısı sürekli değişen olaylar, günlükler veya kayıtlar MongoDB PostgreSQL JSONB Esnek belgeler; birleştirme ve işlem de gerektiğinde PostgreSQL.
Tek sunucuya sığmayan okumalar MySQL · MariaDB · PostgreSQL replicas —Başka seçenek yok Okumalar replikalara dağılır, yazmalar tek bir birincilde kalır.

Bulunan ve düzeltilen tek bir yavaş sorgu

Yavaş sayfaların çoğunun arkasında tek bir sorgu vardır. Yavaş sorgu günlüğü onu adıyla gösterir, EXPLAIN neden yavaş olduğunu gösterir ve çoğu zaman tek bir indeks çözümün tamamıdır.

SELECT id, total, created_at
FROM orders
WHERE customer_id = 4821
ORDER BY created_at DESC
LIMIT 20;
Örnek bir tablo üzerinde örnek bir sorgu

Önce

type
ALL
key
NULL
Extra
Using where; Using filesort

Tablonun her satırını okur, sonra bulduğunu sıralar.

Çözüm: tek bir indeks

ALTER TABLE orders
  ADD INDEX idx_customer_created (customer_id, created_at);

Sonra

type
ref
key
idx_customer_created
Extra
Backward index scan

Yalnızca bu müşterinin satırlarını, zaten sıralı olarak okur.

Bir yedek, geri yüklendiğinde sayılır

Tek başına gece alınan bir kopya o günü kaybettirir. Değişiklik günlüğü de saklandığında veritabanını bir hatadan önceki saniyeye geri getirebiliriz.

Gecelik tam yedek00:00 Buraya kadar geri yüklendi14:31:59 WHERE olmadan bir DELETE14:32:00
Her değişiklik, gerçekleştiği anda günlüğe yazılır Yedeğin üzerine yeniden oynatılır
Örnek bir gün. Saatler uydurmadır.
  1. Son tam yedeği geri yükleyin

    Ayrı bir sunucuda; böylece biz çalışırken canlı veritabanı olduğu gibi kalır.

  2. Günlüğü hatadan önceki ana kadar yeniden oynatın

    MySQL ve MariaDB için ikili günlükler, PostgreSQL için arşivlenmiş WAL, MongoDB için oplog.

  3. Kontrol edin, sonra veriyi geri getirin

    Ya kaybolan satırlar geri kopyalanır ya da geri yüklenen kopya devralır - karar sizindir ve fark önünüzdedir.

Belirli bir ana geri dönüş motora bağlıdır:

  • MySQL · MariaDB · PostgreSQL · MongoDBgünlüğün kapsadığı herhangi bir saniyeye
  • Redisappend-only dosyadaki son yazmaya kadar
  • SQLitedosyanın son kopyasına kadar
  • OpenSearch · Elasticsearchson anlık görüntüye kadar, sonra kaynaktan yeniden oluşturulur

Geri yükleme testleri sizinle kararlaştırdığımız bakımın parçasıdır: ayrı bir sunucuya, belirli bir takvimle, her sonuç kayda geçirilerek. Kimsenin geri yüklemediği bir yedek bir umuttur, yedek değil.

İşin geri kalanı

Bir veritabanının kurulduğu günden yükseltildiği güne kadar ihtiyaç duydukları ve her adımın dokunduğu ayarlar.

  • Kurulum ve boyutlandırma

    Uygulamanızın desteklediği sürüm, üreticinin kendi deposundan. Başka bir şey ayarlanmadan önce bellek veritabanı, uygulama ve sistem arasında paylaştırılır.

    innodb_buffer_pool_size · shared_buffers · maxmemory · -Xmx
  • İndeksler ve yavaş sorgular

    Yavaş sorgu günlüğü okunur, en kötü sorgular açıklanır ve indeksler gerekçesi kaydedilerek eklenir ya da kaldırılır.

    slow_query_log · pg_stat_statements · EXPLAIN ANALYZE
  • Replikasyon

    Birinciyi izleyen ikinci bir kopya; okumaları dağıtmak ve birincil sunucu arızalandığında devralmak için.

    GTID · Galera · streaming replication · replica set
  • Güvenlik

    Yalnızca özel ağda dinleme, her uygulama için yalnızca ihtiyaç duyduğu yetkilere sahip bir kullanıcı ve trafiğin sunucudan çıktığı her yerde şifreli bağlantılar.

    bind-address · TLS · GRANT · SCRAM · ACL
  • İzleme

    Bağlantılar, replikasyon gecikmesi, disk alanı ve yavaş sorgular; bir sınıra ulaşıldıktan sonra değil, önce uyarı ile.

    max_connections · Seconds_Behind_Source · pg_stat_replication
  • Yükseltmeler

    Önce bir kopya üzerinde prova edilir, replikalar birincilden önce yükseltilir ve başlamadan önce geri dönüş yolu yazılır.

    pg_upgrade · mariadb-upgrade · rolling restart

Veritabanınızın ne yaptığını bize anlatın

Hangi motor, ne büyüklükte, nerede çalışıyor ve sizi ne endişelendiriyor. Önce bakarız, sonra bir görüşmenin ardından kurulum ya da bakım için teklif veririz.