Bulut bilişimde master-slave veri çoğaltma, aynı bilginin birden fazla sunucuda saklanması anlamına gelir. Bir sunucu grubu kontrol eder ve diğer cihazlar aynı düğüm içindeki işi yönetir.
Replikasyon, işletmelerin depolama arızası durumunda ana MySQL veritabanını geri yükleyebilecek düzenli günlük yedeklemeler oluşturmasına olanak tanır. Ayrıca ana sunucuyu aşırı yüklemeden eş zamanlı veri işlemeyi de kolaylaştırır.
Not: Master-slave terimi, bu modeli, grubun herhangi bir üyesinin bilgileri güncelleyebildiği master-master replikasyonundan ayırmaya yarar. Ayrıca, terimlerin kullanımını azaltma ve bunları birincil/alt gibi diğer terimlerle değiştirme eğilimi olmuştur.
MySQL’de Master-Slave Replikasyonu Nedir?
MySQL’de master-slave replikasyonu, verilerin bir MySQL veritabanı sunucusundan (master) bir veya daha fazla MySQL veritabanı sunucusuna (slave’ler) çoğaltılmasını veya kopyalanmasını sağlayan bir işlemdir. Replikasyonun arkasındaki mantık, ölçeklenebilirliği artırmak, veri kullanılabilirliğini sağlamak ve bir felaket veya donanım arızası durumunda güvenilir bir yedekleme çözümü sağlamaktır.
Master-Slave Replikasyonu Neden Önemlidir?
MySQL master-slave replikasyonu, modern veritabanı dağıtımlarında çok önemli bir rol oynar. Verileri bir ana sunucudan bir veya daha fazla bağımlı sunucuya sürekli olarak kopyalar ve çoğaltır, böylece veri kullanılabilirliğini ve olağanüstü durum kurtarmayı kolaylaştırır.
Master-slave replikasyonunun temel faydaları şunlardır:
- Esneklik. Slave’ler, birincil sunucu arızası durumunda yeni master olmaya hazır sıcak yedeklemeler olarak işlev görür. Bu kurulum, kesinti süresini ve veri kaybını en aza indirir.
- Ölçeklenebilirlik. Okuma sorguları bağımlı birimler arasında dağıtılabilir, bu da master’ın yükünü hafifletir ve artan yüklerin işlenmesini kolaylaştırır.
- Olağanüstü durum kurtarma. Slave’ler, verileri donanım arızalarına veya felaket olaylarına karşı koruyarak hızlı kurtarma sağlar.
Not: Master-slave replikasyonu önemli avantajlar sunsa da bazı sınırlamalar vardır. Bağımlı birimler doğrudan yazma işlemlerini kabul etmez ve seçilen yapılandırmaya bağlı olarak veri yayılımında gecikmeler olabilir.
MySQL’de Master-Slave Veritabanı Replikasyonunu Ayarlama Adımları
Bu bölümde, Ubuntu’da master-slave veritabanı çoğaltmasının nasıl ayarlanacağı gösterilmektedir. Ubuntu için varsayılan paket yöneticisi uygundur, bu nedenle farklı bir Linux dağıtımı kullanıyorsanız, o sistemin sözdizimini kontrol edin.
Örneğin, Yum (Yellowdog Updater, Modified), Red Hat Enterprise Linux sistemleri için paket yönetim aracıdır. Bu nedenle, komutun uygun kısmı güvenli bir şekilde yum ile değiştirilebilirken geri kalanı aynı kalır.
Install komutunun sözdizimi yum install [package_name] veya apt install [package_name] şeklindedir.
MySQL sunucunuzun replikasyonunu ayarlamak için aşağıdaki bölümlerde özetlenen adımları izleyin.
1. Adım: Güvenlik Duvarı Ayarlarını Yapın
İlk adım, ana veritabanını barındıran makinede güvenlik duvarı ayarlarını yapmaktır. Ubuntu’daki varsayılan güvenlik duvarı, bağımlı veritabanını barındıran sunucudan bağlantılara izin verecek şekilde ayarlayacağımız UFW’dir.
Kaynak sunucuda, güvenlik duvarı üzerinden bağlantılara izin vermek için aşağıdaki sözdizimini kullanın:
sudo ufw allow from [slave_server_ip] to any port 3306
[slave_server_ip] yerine bağımlı birimi barındıran makinenizin IP adresini yazın.
Mesela:
Komut, belirtilen sunucunun IP adresinden MySQL’in varsayılan bağlantı noktası numarası 3306’ya bağlantılara izin verir.
2. Adım: Kaynak Veritabanını Yapılandırma
Çoğaltmayı ayarlamak için, kaynak veritabanı yapılandırma dosyasında bazı ayarları yapmanız gerekir. Ubuntu’da, MySQL yapılandırma dosyasının varsayılan konumu /etc/mysql/mysql.conf.d/ şeklindedir. Aşağıdaki adımları takip et:
1. Yapılandırma dosyasını nano ile açmak için aşağıdaki komutu çalıştırın veya istediğiniz bir metin düzenleyiciyi kullanın:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
2. Dosyada aşağıdaki satırı bulun:
bind-address = 127.0.0.1
127.0.0.1 değerini kaynak sunucunun genel IP adresiyle değiştirin. 127.0.0.1 localhost’u temsil ettiğinden, bu ayarın değiştirilmemesi bağlantının başarısız olmasına neden olur.
Kaynak MySQL örneğinizi, bağımlı birimin ulaşabileceği bir IP adresindeki bağlantıları dinleyecek şekilde yapılandırmak için kaynak sunucu IP adresini kullanın.
Mesela:
3. Sunucu kimliği satırını bulun:
# server-id = 1
Server-id ayarı, her sunucunun kendi server-id değeri olduğundan, MySQL’in bir çoğaltma kurulumunda birden çok sunucu arasında ayrım yapmasına olanak tanır. Satırın açıklamasını kaldırın (# işaretini kaldırın) ve bu ana sunucu olduğu için 1 değerini koruyun.
4. Aşağıdaki satırı bulana kadar aşağı kaydırın:
# log_bin = /var/log/mysql/mysql-bin.log
Programın ikili günlük dosyasını okumasına izin vermek için satırın açıklamasını kaldırın. Varsayılan olarak, ikili günlük devre dışıdır. İkincil sunucu, verilerin ne zaman ve nasıl çoğaltılacağını bilmek için kaynak sunucunun ikili günlük dosyasını okuyabilmelidir.
5. Dosyanın sonuna gidin ve binlog_do_db satırı bulun:
# binlog_do_db = include_database_name
Satırın açıklamasını kaldırın ve include_database_name çoğaltmak istediğiniz veritabanının adıyla değiştirin. Birden çok veritabanını çoğaltmak için, her biri veritabanı adını belirten satırın birden çok örneğini birbiri ardına ekleyin.
6. Dosyayı düzenlemeyi bitirdikten sonra, dosyayı kaydetmek ve çıkmak için Ctrl+O tuşlarına basın.
7. Değişiklikleri uygulamak için MySQL sunucusunu yeniden başlatın:
sudo systemctl restart mysql
Adım 3: Replikasyon Kullanıcısı Oluşturma
Bu adımda, bağımlı sunucunun kaynak veritabanına bağlanmak için kullanacağı bir MySQL kullanıcısı oluşturun. Bu özel kullanıcı, çoğaltma işlemiyle ilgili tüm eylemleri gerçekleştirir.
MySQL sunucusuna bağlanmak için uygun ayrıcalıklara sahip mevcut bir kullanıcıyı kullanmak istiyorsanız, oluşturma işlemini atlayın ve yalnızca ayrıcalıkları verin.
Özel bir kullanıcı oluşturmak için aşağıdaki adımları izleyin:
1. MySQL kabuğunu açın:
sudo mysql
2. Aşağıdaki sözdizimini kullanarak yeni bir MySQL kullanıcısı oluşturun:
CREATE USER '[user_name]'@'[ip_address]' IDENTIFIED WITH mysql_native_password BY '[password]';
- [user_name] yerine hesap için kullanmak istediğiniz kullanıcı adını yazın.
- [ip_address] yerine bağımlı sunucunun IP adresini yazın.
- [parola] öğesini güçlü bir parolayla değiştirin.
Mesela:
Yukarıdaki örnek, bağımlı sunucunun genel IP adresi ve güçlü bir parola ile bir kullanıcı slave_copy oluşturur. Kimlik doğrulama, mysql_native_password kimlik doğrulama eklentisi aracılığıyla yapılır. MySQL’in varsayılan kimlik doğrulama mekanizmasını caching_sha2_password kullanmak mümkün olsa da, iki sunucu arasında şifreli bir bağlantı gerektirir.
3. Yeni kullanıcıya uygun ayrıcalıkları verin. Kullanıcıya REPLICATION SLAVE izinlerini sağlamak için aşağıdaki sözdizimini kullanın:
GRANT REPLICATION SLAVE ON *.* TO '[user_name]'@'[ip_address]';
Tüm yer tutucuları, önceki adımda olduğu gibi kendi bilgilerinizle değiştirin.
Mesela:
4. Önbelleğe alınmış belleğin önceki komutları çalıştırmasını önlemek için FLUSH PRIVILEGES komutunu çalıştırın:
FLUSH PRIVILEGES;
4. Adım: Günlük Dosyası Konumunu Alın
Bağımlı sunucunun, düzgün çalışması için ana sunucunun ikili günlük dosyasının koordinatlarına ve dosyanın konumuna ihtiyacı vardır. Koordinatlar, sunucunun veritabanı olaylarını hangi noktadan kopyalamaya başlaması gerektiğini belirlemesine ve daha önce işlediği olayları izlemesine yardımcı olur.
Günlük dosyasının konumunu almak için aşağıdaki adımları izleyin:
1. Dosyanın konumunu alırken kullanıcıların verilerde değişiklik yapmasını önlemek için veritabanını kilitleyin. Veritabanını kilitlemenin bazı kapalı kalma sürelerine neden olduğunu unutmayın, bu nedenle buna göre plan yapın.
MySQL istemini açın ve veritabanını kilitlemek için aşağıdaki komutu çalıştırın:
FLUSH TABLES WITH READ LOCK;
2. İkili günlük dosyasının geçerli durum bilgilerini almak için aşağıdaki ifadeyi yürütün:
SHOW MASTER STATUS;
Bir sonraki adımda ihtiyaç duyacağınız için dosya adını ve konum değerini not edin.
Adım 5: Verileri Kopyalama veya Yeni Veritabanı Oluşturma
İkincil sunucuya taşımak istediğiniz mevcut verileriniz olup olmadığına bağlı olarak, aralarından seçim yapabileceğiniz iki seçenek vardır:
Replikasyon için mevcut verileriniz yoksa
Ana sunucunuz MySQL örneğiniz yeni bir kurulumsa ve mevcut verilere sahip değilse, veritabanının kilidini açabilirsiniz. MySQL istemini açın ve aşağıdaki komutu çalıştırın:
UNLOCK TABLES;
Ardından, MySQL kabuğunu kapatın ve 6. adıma geçin.
Varolan verileri çoğaltmak istiyorsanız
Ana MySQL bulut sunucunuzda bağımlı sunucuya taşımak istediğiniz mevcut veriler varsa, mysqldump yardımcı programı aracılığıyla bir veritabanı anlık görüntüsü oluşturabilirsiniz. Aşağıdaki adımları takip et:
1. Veritabanı hala kilitliyken, yeni bir terminal penceresi açın ve mysqldump kullanarak veritabanınızı dışa aktarmak için aşağıdaki sözdizimini kullanın:
sudo mysqldump -u root [database_name] > [database_name.sql]
Örneğin, mysql veritabanının anlık görüntüsünü oluşturmak için aşağıdaki komutu çalıştırın:
sudo mysqldump -u root mysql > mysql.sql
Komut bir veritabanı anlık görüntüsü oluşturur ve bunu mysql.sql dosyasına yazar.
2. MySQL isteminde aşağıdakileri çalıştırarak yeniden yazılabilir hale getirmek için veritabanlarının kilidini açın:
UNLOCK TABLES;
3. Anlık görüntüyü bağımlı sunucuya gönderin. Bunu yapmanın en güvenli yolu bir SSH bağlantısı ve scp komutunu kullanmaktır:
scp [file_path] [username]@[ip_address]:/tmp/
- [file_path] yerine anlık görüntü dosyasının yolunu yazın.
- [Kullanıcı adı], bağımlı sunucudaki yönetici Ubuntu kullanıcı profilidir.
- [ip_address], bağımlı sunucunun genel IP’sidir.
Mesela:
scp mysql.sql [email protected]:/tmp/
Komut, anlık görüntü dosyasını sunucunun /tmp/ dizinine yerleştirerek belirtilen sunucuya gönderir.
4. Slave sunucuya SSH bağlantısı.
5. Bağlandıktan sonra bir MySQL istemi açın ve ana sunucudan çoğaltmak istediğiniz veritabanını oluşturun:
CREATE DATABASE [database_name];
[database_name] değerini veritabanının adıyla değiştirin (örneğin, mysql).
6. MySQL isteminden çıkın ve veritabanı anlık görüntüsünü içe aktarmak için aşağıdaki sözdizimini kullanın:
sudo mysql [database_name] < [snapshot_file_path]
Mesela:
sudo mysql mysql < /tmp/mysql.sql
Komut, mysql.sql snapshot’ından verileri oluşturduğumuz mysql veritabanına aktarır.
6. Adım: Slave Sunucuyu Yapılandırın
Çoğaltmayı ayarlamanın son adımı, bağımlı sunucudaki ayarları yapılandırmaktır. Aşağıdaki adımları takip et:
1. Bir metin düzenleyici kullanarak bağımlı sunucudaki MySQL yapılandırma dosyasını açın:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
2. Sunucu kimliği satırını bulun ve açıklamasını kaldırın. Değeri, ana sunucuda ayarladığınızdan farklı bir sayıyla değiştirin (örneğin, 2):
server-id = 2
3. Aşağıdaki satırları bulun ve kaynak makinenin yapılandırma dosyasındakiyle aynı değerleri ayarlayın:
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mysql
4. Son adım, bağımlı sunucunun günlük dosyası konumunu tanımlayarak dosyanın sonuna aşağıdaki satırı eklemektir:
relay-log = /var/log/mysql/mysql-relay-bin.log
5. Değişiklikleri kaydedin ve dosyadan çıkın.
6. Değişikliklerin etkili olması için MySQL sunucusunu yeniden başlatın:
sudo systemctl restart mysql
7. Adım: Çoğaltmayı Başlat
Her iki MySQL örneğini de yapılandırdıktan sonra çoğaltma işlemini başlatabilirsiniz. Bağımlı sunucuda MySQL kabuğunu açın ve sunucuya ikili günlük dosyasını nerede bulacağını ve hangi konumdan okumaya başlayacağını bildirmek için aşağıdaki sözdizimini kullanın:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_server_ip',
SOURCE_USER='replica_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='mysql-bin.000002',
SOURCE_LOG_POS=861;
- master_server_ip ana sunucunun genel IP adresiyle değiştirin.
- replica_user, çoğaltma için oluşturduğunuz kullanıcı hesabıdır.
- Parola, kullanıcı için ayarladığınız paroladır.
- SOURCE_LOG_FILE ve SOURCE_LOG_POS için, Adım 4’te edindiğiniz dosya adını ve konumunu belirtin.
Aşağıdakileri çalıştırarak çoğaltmayı başlatın:
START REPLICA;
Komut, sunucuya, ana sunucuda belirtilen veritabanında yapılan değişiklikleri çoğaltmaya başlamasını bildirir.
Geçerli sunucu durumuyla ilgili ayrıntıları görmek için aşağıdaki komutu çalıştırın:
SHOW REPLICA STATUS\G;
Çıktı, geçerli sunucu durumunu gösterir.
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.