MySQL Master-Slave Replikasyon Nasıl Kurulur

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.

Depiction of a master-slave replication.

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:

allow connections through UFW firewall Ubuntu

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:

Setting up the IP address to listen for connections during MySQL replication.

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:

Creating a new user for MySQL replication.

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:

granting privileges to new MySQL user

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;
Obtaining the binary log file position and name.

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;
Getting slave server's status in MySQL.

Çıktı, geçerli sunucu durumunu gösterir.

Yazının orijinalini buradan okuyabilirsiniz.