Uygulama iş verilerinin sürekli artmasıyla, Tepki hızı düşmeye devam ediyor , Taleplerin çoğunun Sorgu işlemi . Bu noktada, veritabanını genişletebiliriz. Master-slave çoğaltma , Niyet İşlemi oku ile Yazma işlemi Ayrı, çoklu veritabanları Paylaşım isteği , Dolayısıyla Tek kitaplığı azaltın nın-nin Erişim basıncı , Ve sonra uygulama optimize edilir.
Master-slave çoğaltma
MySQL 5.6'da master-slave replikasyonunu başlatmanın iki yolu vardır: log-based (binlog) ve GTID (global işlem tanımlayıcı).
Bu makale yalnızca günlük binlog tabanlı Master-slave konfigürasyonu .
Master-slave çoğaltma işlemi
MySQL senkronizasyon işlemi 3 iş parçacığı aracılığıyla gerçekleştirilir ve temel adımlar aşağıdaki gibidir:
Ana sunucu Veri güncellemelerini şuraya kaydedin: İkili günlük ( İkili günlük ), ikili günlük olaylarını kaydetmek için kullanılır, bu adım şu şekilde belirlenir: Ana kitaplık dizisi gerçekleştirmek;
Slave kütüphanesi Niyet Ana kütüphane nın-nin İkili günlük Yerel olarak kopyala Röle günlüğü ( Röle günlüğü ), bu adım şunlardan oluşur: Slave kütüphanesi G / Ç Konu gerçekleştirmek;
Slave kütüphanesi Okuyun Röle günlüğü orta Etkinlik , Verilerin içinde tekrar oynatın, bu adımı belirleyen Slave kütüphanesi SQL Konu gerçekleştirmek.
Master-slave modunun avantajları
1. Yük Dengeleme
Normalde kullanacaksın Ana sunucu Veriler hakkında Güncelleme , sil ile Yeni Operasyonu bekleyin ve Sormak İş düşüyor Slave kütüphanesi Kafasına.
2. Uzaktan felaket kurtarma yedekleme
Ana sunucudaki veriler şu şekilde senkronize edilebilir: Uzak bağımlı sunucu Açık, büyük ölçüde geliştirildi Veri güvenliği .
3. Yüksek kullanılabilirlik
Veritabanı çoğaltma işlevi gerçekleştirilir Ana sunucu karşı Sunucu odasından Ana sunucu kapandığında veri senkronizasyonu arıza , Bağımlı sunucu, sistemin sürekli ve kararlı çalışmasını sağlamak için hemen ana sunucu rolünü üstlenir.
4. Yüksek ölçeklenebilirlik
Master-slave çoğaltma Mod desteği 2 Genişletmenin yolları:
çoğaltmak
Ölçek büyütme veya Çoğaltmak Temelde mevcut sunucudan daha fazlasını sağlamak için Daha iyi performans Sunucu, örneğin artırmak İşlemci ile Veri deposu Hem de Disk dizisi Ve bunun gibi, birden fazla sunucu olduğu için ölçeklenebilirlik tek bir sunucudan daha fazladır.
ölçeklendirme
Ölçek büyütme veya Yatay genişleme , Yani artırmak Sunucu sayısı Bunun genişletilmesi, esas olarak her sunucunun baskısını dağıtabilir.
Master-slave modunun dezavantajları
1. Maliyet artışı
Bir master-slave kurmak kesinlikle maliyeti artıracaktır Sonuçta bir server ve iki serverın maliyeti tamamen farklıdır.Ayrıca master-slave açık olmalıdır. İkili günlük , Bu nedenle ek olarak Performans maliyeti .
2. Veri gecikmesi
Slave kütüphanesi Nereden Ana kütüphane Kopyalanan veriler kesinlikle belirli bir Veri gecikmesi nın-nin. Bu nedenle, sorgu girildikten hemen sonra gerçekleştiğinde, sorgu çıkmayabilir. Elbette, ekleyicinin kendisi sorgularsa, doğrudan Ana kütüphane Tabii ki sorguda bunun da kodla kontrol edilmesi gerektiğini öğrenin.
3. Yazmak daha yavaştır
Master-slave çoğaltma Esas olarak Okumak, yazmaktan çok daha büyüktür Veya doğru Gerçek zamanlı veri yedekleme Zorlu sistemlerde. Yüzünden Ana sunucu Yazılı olarak daha fazla işleme ihtiyacınız var ve Sadece bir Yazılabilir Ana kütüphane Yani yazma baskısı dağıtılamaz.
Master-slave replikasyonu için önkoşullar
Master-slave sunucu İşletim sistemi sürümü ile Rakamlar Tutarlı.
Ana veritabanı ve bağımlı veritabanı versiyon Tutarlı olun.
Ana veritabanı ve bağımlı veritabanı veri Tutarlı olun.
Ana veritabanı Aç İkili günlük , Ana veritabanı ve bağımlı veritabanı server_id LAN'da olmalı bir tek .
Spesifik konfigürasyon
1. Çevresel hazırlık
Ad sürüm numarasıDocker18.03.1-ceDocker Compose1.21.1MySQL5.7.17
2. docker-compose.yml'yi yapılandırın
docker-compose.yml
versiyon 2' Hizmetler: mysql-master: inşa etmek: bağlam: ./ dockerfile: ana / Dockerfile çevre: - "MYSQL_ROOT_PASSWORD = kök" - "MYSQL_DATABASE = replicas_db" bağlantılar: -mysql-köle bağlantı noktaları: - "33065: 3306" yeniden başlat: her zaman ana bilgisayar adı: mysql-master mysql-köle: inşa etmek: bağlam: ./ dockerfile: köle / Dockerfile çevre: - "MYSQL_ROOT_PASSWORD = kök" - "MYSQL_DATABASE = replicas_db" bağlantı noktaları: - "33066: 3306" yeniden başlat: her zaman hostname: mysql-slave3. Ana veritabanı yapılandırması
3.1. Dockerfile'ı Yapılandırma
Dockerfile
Mysql'den: 5.7.17 BAKICI Harrison EKLE ./master/my.cnf /etc/mysql/my.cnf3.2. My.cnf dosyasını yapılandırın
my.cnf
## Genellikle IP'ye ayarlanan server_id'yi ayarlayın, benzersiz server_id = 100 ## Çoğaltma filtresi: yani hangi veritabanının senkronize edilmesine gerek olmadığını belirtin (mysql kitaplığı genellikle senkronize edilmez) binlog-ignore-db = mysql ## İkili günlük işlevini açın, istediğiniz zaman alabilirsin, anlamlı olmak daha iyidir (anahtar burada) log-bin = replicas-mysql-bin ## Her oturum için ayrılan bellek, işlem sırasında ikili günlüğün önbelleğini depolamak için kullanılır binlog_cache_size = 1 milyon ## Master-slave çoğaltma biçimi (karma, ifade, satır, varsayılan biçim deyimdir) binlog_format = mixed ## İkili günlüğün otomatik olarak silindiği / süresinin dolduğu gün sayısı. Varsayılan değer 0'dır, yani otomatik olarak silinmez. expire_logs_days = 7 ## İkincil tarafında çoğaltmanın kesintiye uğramasını önlemek için ana-bağımlı çoğaltmada karşılaşılan tüm hataları veya belirtilen hata türlerini atlayın. ## Örneğin: 1062 hatası, yinelenen birincil anahtarları ifade eder, 1032 hatası tutarsız ana-bağımlı veritabanı verilerinden kaynaklanır slave_skip_errors = 10624. Veritabanından yapılandırın
4.1. Dockerfile'ı Yapılandırma
Dockerfile
Mysql'den: 5.7.17 BAKICI Harrison EKLE ./slave/my.cnf /etc/mysql/my.cnf4.2. My.cnf dosyamı yapılandırın
## Genellikle IP'ye ayarlanan server_id'yi ayarlayın, benzersiz server_id = 101 ## Çoğaltma filtresi: yani hangi veritabanının senkronize edilmesine gerek olmadığını belirtin (mysql kitaplığı genellikle senkronize edilmez) binlog-ignore-db = mysql ## Slave'i diğer slave'lerin yöneticisi olarak kullanmak üzere hazırlamak için ikili günlük fonksiyonunu açın log-bin = replicas-mysql-slave1-bin ## Her oturum için ayrılan bellek, işlem sırasında ikili günlüğün önbelleğini depolamak için kullanılır binlog_cache_size = 1 milyon ## Master-slave çoğaltma biçimi (karma, ifade, satır, varsayılan biçim deyimdir) binlog_format = mixed ## İkili günlüğün otomatik olarak silindiği / süresinin dolduğu gün sayısı. Varsayılan değer 0'dır, yani otomatik olarak silinmez. expire_logs_days = 7 ## İkincil tarafında çoğaltmanın kesintiye uğramasını önlemek için ana-bağımlı çoğaltmada karşılaşılan tüm hataları veya belirtilen hata türlerini atlayın. ## Örneğin: 1062 hatası, yinelenen birincil anahtarları ifade eder, 1032 hatası tutarsız ana-bağımlı veritabanı verilerinden kaynaklanır slave_skip_errors = 1062 ## relay_log geçiş günlüğünü yapılandırın röle_ günlüğü = replicas-mysql-röle-bin ## log_slave_updates, slave'in replikasyon olaylarını kendi ikili günlüğüne yazması anlamına gelir log_slave_updates = 1 ## Verilerin değiştirilmesini önleyin (özel iş parçacıkları hariç) read_only = 15. Bir kapsayıcı oluşturun
Giriş liman işçisi Dizin, çalıştır docker-compose Komutu başlatın.
$ docker-compose up -dresim gösterdiği gibi MySQL Ana veritabanı ile Veritabanından Kapsayıcı başarıyla oluşturuldu.
Ayrı yapılandırın Ana veritabanı ile Veritabanından Bağlantı bilgileri aşağıdaki gibidir:
Ana veritabanı
Veritabanından
6. Bağımlı veritabanını yapılandırın
Slave'in başlangıç durumunu kontrol edin
$ ana durumu göster;Şekilde gösterildiği gibi, veri tabanından Eşitlenmemiş çoğaltma durumu .
Ana kütüphanenin durumunu kontrol edin
$ ana durumu göster;Kayıt Ana veritabanı ikili günlük nın-nin dosya adı ile Veri senkronizasyonu başlangıç konumu .
Dosya: replicas-mysql-bin.000003
Pozisyon: 154
Kütüphaneden ana kütüphane bilgilerini yapılandırın
İçinde Veritabanından A doğru koş Ana veritabanı İlgili yapılandırma sql Efendi-köle derneği
MASTER'I DEĞİŞTİR MASTER_HOST = 'mysql-ana', MASTER_USER = 'kök', MASTER_PASSWORD = 'kök', MASTER_LOG_FILE = 'replicas-mysql-bin.000003', MASTER_LOG_POS = 154;Tekrar başlat köle hizmet
$ durdur köle $ köle başlatİleri inceleme Veritabanından Durum bilgisi, her ikisi de gerçekleştirildi veri senkronizasyonu İlişkili
7. Hedef tabloyu oluşturun
İçinde Ana veritabanı İçinde bir test veri tablosu oluşturun kurs
FOREIGN_KEY_CHECKS = 0; - ---------------------------- - Kurs için masa yapısı - ---------------------------- "Kurs" VARSA TABLO DÜŞÜR; TABLO OLUŞTUR "kurs" ( `id` int (11) BOŞ DEĞİL AUTO_INCREMENT, `isim` varchar (20) NULL DEĞİL, `lesson_period` double (5,0) VARSAYILAN NULL, `score` double (10,0) VARSAYILAN NULL, BİRİNCİL ANAHTAR ("kimlik") ) MOTOR = InnoDB VARSAYILAN KAR SETİ = utf8mb4;Ana veritabanı ile Veritabanından Veriler içeride Senkronizasyon durumu , Master-slave replikasyon kümesi oluşturuldu.
MySQL çoğaltma türü
Bildirim tabanlı çoğaltma
Ana sunucuda yürütülen deyim, ikincil sunucuda yeniden yürütülür ve MySQL-3.23'ten sonra desteklenir.
Sorun: Eksik senkronizasyon, zamanda sapmaya neden olabilir ve ifadeyi yürüten kullanıcı da farklı bir kullanıcı olabilir.
Satır tabanlı çoğaltma
Değiştirilen içeriği, hangi ifadenin değişikliği tetiklediğini umursamadan, doğrudan ana sunucuda kopyalayın.MySQL-5.0'dan sonra tanıtıldı.
Soru: Örneğin, bir maaş tablosunda on bin kullanıcı var ve her kullanıcının maaşını +1000 olarak belirledik, sonra satır tabanlı çoğaltmanın 10.000 satırlık içeriği kopyalaması gerekiyor, bu da nispeten büyük ek yüke neden olurken, ifade tabanlı çoğaltma Sadece bir cümle yeterli olacaktır.
Karışık çoğaltma türleri MySQL
Varsayılan olarak kullanılır Bildirim tabanlı çoğaltma ,ne zaman Bildirim tabanlı çoğaltma Sorun yarattığında kullanın Satır tabanlı çoğaltma , MySQL otomatik olarak seçecektir.