Aynı Makinede MySQL Master-Slave Replikasyonu

Yayınlanan: 2022-03-11

MySQL çoğaltma, bir MySQL veritabanı sunucusundan (ana) gelen verilerin bir veya daha fazla MySQL veritabanı sunucusuna (köleler) otomatik olarak kopyalanmasını sağlayan bir işlemdir. Genellikle, ölçeklenebilirlik için birden çok sunucuya okuma erişimini yaymak için kullanılır, ancak aynı zamanda yük devretme veya ana sunucuya aşırı yüklenmemek için yedekteki verileri analiz etme gibi başka amaçlar için de kullanılabilir.

Master-slave replikasyonu tek yönlü bir replikasyon olduğundan (masterdan slave'e), yazma işlemleri için sadece master veritabanı kullanılırken, okuma işlemleri birden fazla slave veritabanına yayılabilir. Bunun anlamı, ölçek genişletme çözümü olarak ana-bağımlı çoğaltma kullanılıyorsa, biri yazma işlemleri ve ikincisi okuma işlemleri için olmak üzere en az iki veri kaynağı tanımlamış olmanız gerekir.

MySQL master-slave çoğaltma

MySQL geliştiricileri genellikle yalnızca bir makinede çalışır ve bir ağa veya internet bağlantısına bağlı olmama mantığıyla tüm geliştirme ortamlarını o makinede tutma eğilimindedir. Örneğin, değişiklikleri başka bir yere dağıtmadan önce bir geliştirme ortamında çoğaltmayı test etmeleri gerektiğinden bir ana bağımlı çoğaltmaya ihtiyaç duyulursa, aynı makinede oluşturmaları gerekir. Tek bir MySQL örneğinin kurulumu oldukça basit olsa da, bir saniye ve ardından bir master-slave replikasyonu kurmak için ekstra çaba sarf etmemiz gerekiyor.

Bu adım adım öğretici için ana bilgisayar işletim sistemi olarak Ubuntu Linux'u seçtim ve sağlanan komutlar bu işletim sistemi içindir. MySQL master-slave çoğaltmanızı başka bir işletim sisteminde kurmak istiyorsanız, belirli komutları için değişiklikler yapmanız gerekecektir. Ancak, MySQL master-slave replikasyonunu aynı makinede kurmanın genel prensipleri tüm işletim sistemleri için aynıdır.

MySQL master-slave çoğaltma

İlk MySQL Örneğinin Kurulumu

Makinenizde zaten bir MySQL veritabanı örneği kuruluysa, bu adımı atlayabilirsiniz.

MySQL'i Ubuntu'ya kurmanın en kolay yolu, bir terminal isteminden aşağıdaki komutu çalıştırmaktır:

 sudo apt-get install mysql-server

Yükleme işlemi sırasında, MySQL root kullanıcısı için bir parola belirlemeniz istenecektir.

mysqld_multi Ayarlama

Aynı makine üzerinde iki MySQL örneğini verimli bir şekilde yönetmek için mysqld_multi kullanmamız gerekiyor.

mysqld_multi kurulumunun ilk adımı, mevcut my.cnf dosyasında iki ayrı [mysqld] grubu oluşturmaktır. Ubuntu'daki my.cnf dosyasının varsayılan konumu /etc/mysql/ . Bu nedenle, favori metin düzenleyicinizle my.cnf dosyasını açın ve mevcut [mysqld] grubunu [mysqld1] olarak yeniden adlandırın. Yeniden adlandırılan bu grup, ilk MySQL örneğinin yapılandırılması için kullanılacak ve ayrıca bir ana örnek olarak yapılandırılacaktır. MySQL master-slave çoğaltmasında olduğu gibi, her örneğin kendi benzersiz server-id olmalıdır, [mysqld1] grubuna aşağıdaki satırı ekleyin:

 server-id = 1

İkinci MySQL örneği için ayrı bir [mysqld] grubuna ihtiyacımız olduğundan, [mysqld1] grubunu mevcut tüm konfigürasyonlarla kopyalayın ve aşağıya aynı my.cnf dosyasına yapıştırın. Şimdi, kopyalanan grubu [mysqld2] olarak yeniden adlandırın ve bağımlı yapılandırmada aşağıdaki değişiklikleri yapın:

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

İkinci MySQL örneğini bağımlı olarak ayarlamak için server-id 2 olarak ayarlayın, çünkü ana sunucunun sunucu kimliğinden farklı olmalıdır.

Her iki örnek de aynı makinede çalışacağından, varsayılan olarak 3306 olan ilk örnek için kullanılan bağlantı noktasından farklı olması gerektiğinden ikinci örnek için port 3307 olarak ayarlayın.

Bu ikinci örneğin aynı MySQL ikili dosyalarını kullanmasını sağlamak için, socket , pid-file , datadir ve log_error için farklı değerler ayarlamamız gerekiyor.

İkinci örneği bir bağımlı olarak kullanmak için ( relay-log , relay-log-index ve relay-log-info-file parametreleri) ayrıca master-info-file ayarlamak için relay-log etkinleştirmemiz gerekir.

Son olarak, bağımlı örneğini salt okunur yapmak için salt okunur parametresi read_only olarak 1 . Köle üzerindeki değişiklikleri tamamen engellemediği için bu seçeneğe dikkat etmelisiniz. read_only 1 olarak ayarlansa bile, yalnızca SUPER ayrıcalığına sahip kullanıcılardan gelen güncellemelere izin verilir. MySQL, SUPER kullanıcıların değişiklik yapmasını önlemek için yeni super_read_only parametresini yakın zamanda tanıttı. Bu seçenek 5.7.8 sürümünde mevcuttur.

[mysqld1] ve [mysqld2] gruplarının yanı sıra my.cnf dosyasına yeni bir grup [mysqld_multi] gerekiyor:

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

İkinci MySQL örneğini kurduğumuzda ve her ikisini de başlattığımızda, MySQL örneklerini kapatabilmek için multi_admin kullanıcısına uygun ayrıcalıkları vereceğiz.

İkinci MySQL Örneği için Yeni Klasörler Oluşturun

Bir önceki adımda, ikinci MySQL örneği için yapılandırma dosyasını hazırladık. Bu yapılandırma dosyasında iki yeni klasör kullanılır. Bu klasörleri uygun ayrıcalıklarla oluşturmak için aşağıdaki Linux komutları kullanılmalıdır:

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

AppArmor'da Ek Güvenlik Ayarları

Bazı Linux ortamlarında, ikinci MySQL örneğini çalıştırmak için AppArmor güvenlik ayarları gerekir. En azından Ubuntu'da gereklidirler.

AppArmor'u düzgün bir şekilde kurmak için /etc/apparmor.d/usr.sbin.mysqld dosyasını favori metin düzenleyicinizle düzenleyin, aşağıdaki satırları ekleyin:

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

Dosyayı kaydettikten sonra, bu değişikliklerin geçerli olması için makineyi yeniden başlatın.

İkinci MySQL Örneğinin Kurulumu

İkinci MySQL örneğinin kurulumu için birkaç farklı yaklaşım izlenebilir. Bu öğreticide sunulan yaklaşım, ikinci kurulum için gerekli olan ayrı veri dosyalarıyla ilkiyle aynı MySQL ikili dosyalarını kullanır.

Önceki adımlarda yapılandırma dosyasını ve gerekli klasörleri ve güvenlik değişikliklerini zaten hazırladığımız için, ikinci MySQL örneğinin son kurulum adımı MySQL veri dizininin başlatılmasıdır.

Yeni MySQL veri dizinini başlatmak için aşağıdaki komutu yürütün:

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

MySQL veri dizini başlatıldığında, mysqld_multi hizmetini kullanarak her iki MySQL örneğini de başlatabilirsiniz:

 mysqld_multi start

Uygun ana bilgisayar ve bağlantı mysqladmin kullanarak ikinci MySQL örneği için root parolayı ayarlayın. Ana bilgisayar ve bağlantı noktası belirtilmemişse, mysqladmin varsayılan olarak ilk MySQL örneğine bağlanacağını unutmayın:

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

Yukarıdaki örnekte parolayı “rootpwd” olarak ayarladım, ancak daha güvenli bir parola kullanılması önerilir.

mysqld_multi Ek Yapılandırması

“mysqld_multi Kurulumu” bölümünün sonunda multi_admin kullanıcısına daha sonra uygun yetkileri vereceğimizi yazmıştım, bunun için şimdi tam zamanı. Bu kullanıcıya her iki durumda da uygun ayrıcalıklar vermemiz gerekiyor, bu yüzden önce ilk örneğe bağlanalım:

 mysql --host=127.0.0.1 --port=3306 -uroot -p

Giriş yaptıktan sonra, aşağıdaki iki komutu yürütün:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQL istemcisinden çıkın ve ikinci örneğe bağlanın:

 mysql --host=127.0.0.1 --port=3307 -uroot -p

Giriş yaptıktan sonra, yukarıdakiyle aynı iki komutu yürütün:

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQL istemcisinden çıkın.

Her İki MySQL Örneği de Önyüklemede Otomatik Olarak Başlatın

mysqld_multi kurulumunun son adımı, init.d dosyasına otomatik önyükleme komut dosyasının yüklenmesidir.

Bunu yapmak için, /etc/init.d içinde mysqld_multi adında yeni bir dosya oluşturun ve ona uygun ayrıcalıkları verin:

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

Bu yeni dosyayı favori metin düzenleyicinizle açın ve aşağıdaki komut dosyasını kopyalayın:

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

Aşağıdaki komutla mysqld_multi hizmetini varsayılan runlevels ekleyin:

 update-rc.d mysqld_multi defaults

Makinenizi yeniden başlatın ve aşağıdaki komutu kullanarak her iki MySQL örneğinin de çalıştığını kontrol edin:

 mysqld_multi report

Master-Slave Çoğaltma Kurulumu

Şimdi, aynı makinede çalışan iki MySQL örneğimiz olduğunda, ilk örneği ana, ikinci örneği ise bağımlı olarak ayarlayacağız.

Yapılandırmanın bir kısmı "mysqld_multi'yi kurma" bölümünde zaten gerçekleştirilmişti. my.cnf dosyasında kalan tek değişiklik, master üzerinde ikili günlük kaydı ayarlamaktır. Bunu yapmak için my.cnf dosyasını [mysqld1] grubunda aşağıdaki değişiklik ve eklemelerle düzenleyin:

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

Bu değişikliklerin geçerli olması için ana MySQL örneğini yeniden başlatın:

 mysqld_multi stop 1 mysqld_multi start 1

Slave'nin master'a doğru replikasyon ayrıcalıklarıyla bağlanabilmesi için master üzerinde yeni bir kullanıcı oluşturulmalıdır. Uygun ana bilgisayar ve bağlantı noktası ile MySQL istemcisini kullanarak ana örneğe bağlanın:

 mysql -uroot -p --host=127.0.0.1 --port=3306

Çoğaltma için yeni bir kullanıcı oluşturun:

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

MySQL istemcisinden çıkın.

Ana verilerin dökümünü oluşturmak için aşağıdaki komutu yürütün:

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

Burada, yedekleme dosyasında CHANGE MASTER deyimini içeren bir yoruma sahip olmak için --master-data=2 seçeneğini kullanıyoruz. Bu yorum, yedekleme sırasındaki çoğaltma koordinatlarını gösterir ve bu koordinatlara daha sonra bağımlı örnekteki ana bilgilerin güncellenmesi için ihtiyacımız olacaktır. İşte o yorumun örneği:

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

Önceki adımda oluşturduğunuz dökümü bağımlı örneğine aktarın:

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

Son olarak, slave örneğinin master örneğe bağlanabilmesi için, slave üzerindeki master bilgilerinin uygun bağlantı parametreleri ile güncellenmesi gerekir.

Uygun ana bilgisayar ve bağlantı noktası ile MySQL istemcisini kullanarak bağımlı örneğine bağlanın:

 mysql -uroot -p --host=127.0.0.1 --port=3307

Ana bilgileri güncellemek için aşağıdaki komutu yürütün (yukarıda açıklandığı gibi replicationdump.sql koordinatlarını alın):

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

Köleyi başlatmak için aşağıdaki komutu yürütün:

 mysql> START SLAVE;

Çoğaltmanın çalıştığını ve çalıştığını doğrulamak için aşağıdaki komutu yürütün:

 mysql> SHOW SLAVE STATUS \G

Tebrikler. Aynı makinedeki MySQL master-slave çoğaltmanız artık başarıyla kuruldu.

MySQL master-slave çoğaltma

Sarmak

Üretim ortamında ölçeği genişletme çözümüne ihtiyacınız varsa, geliştirme ortamınızda yapılandırılmış bir ana-bağımlı çoğaltmaya sahip olmak yararlıdır. Bu şekilde, yazma ve okuma işlemleri için yapılandırılmış ayrı veri kaynaklarına da sahip olursunuz, böylece daha fazla dağıtımdan önce her şeyin beklendiği gibi çalıştığını yerel olarak test edebilirsiniz.

Ek olarak, okuma işlemlerini birkaç bağımlı öğeye dağıtan yük dengeleyiciyi test etmek için aynı makinede yapılandırılmış birkaç bağımlı örneğine sahip olmak isteyebilirsiniz. Bu durumda, aynı adımların tümünü tekrarlayarak diğer bağımlı örneklerini kurmak için bu aynı kılavuzu kullanabilirsiniz.