Aynı Makinede MySQL Master-Slave Replikasyonu
Yayınlanan: 2022-03-11MySQL ç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 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.
İ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.
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.