Docker ile MySQL GTID Çoğaltma Sistemi Oluşturma

Veritabanı çoğaltması (database replication), verilerin birden fazla sunucu arasında senkronize edilmesini sağlayan ve yüksek erişilebilirlik, veri yedekliliği ve okuma performansı gibi ihtiyaçlar için kullanılan önemli bir teknolojidir. MySQL'de Ana sunucu (master server) - Yedek sunucu (slave/replica server) mimarisinde yazma işlemleri ana sunucusunda gerçekleştirilirken, yedek sunucusu ana sunucu üzerinde gerçekleşen işlemleri takip ederek kendi veritabanını güncel tutar.

Bu makalede, iki farklı Ubuntu Linux sunucusu üzerinde Docker kullanılarak MySQL GTID (Global Transaction Identifier) tabanlı Ana sunucu – Yedek sunucu çoğaltma sistemi oluşturulması ele alınmaktadır.

Mimaride:

  • Sunucu A → MySQL Ana sunucu 
  • Sunucu B → MySQL Yedek sunucu 

olarak yapılandırılacaktır.

Çoğaltma için klasik binary log dosya adı ve pozisyon yöntemi yerine GTID  kullanılacaktır. GTID sayesinde yedek sunucunun hangi işlemleri uyguladığını takip etmek daha kolay hale gelir ve çoğaltma sırasında SOURCE_AUTO_POSITION=1 kullanılarak uygun binary log konumu otomatik olarak belirlenebilir.

 

Sistem Mimarisi

Sistem iki bağımsız Ubuntu Linux sunucusundan oluşmaktadır. 

Ana sunucu üzerindeki işlemler binary log'a kaydedilir. GTID, bu transaction'ların benzersiz şekilde takip edilmesini sağlarken, SOURCE_AUTO_POSITION=1 Yedek sunucu'nın binary log içerisinde uygun konumu otomatik olarak belirlemesini sağlar.

 

Gereksinimler

Her iki sunucuda aşağıdaki bileşenlerin bulunması gerekir:

  • Ubuntu Linux 
  • Docker 
  • Docker Compose 
  • Ağ üzerinden birbirine erişebilen iki sunucu 
  • MySQL için kullanılabilecek uygun port 
  • Root veya Docker yönetim yetkisi 

Sunucuların birbirlerine erişebildiği öncelikle kontrol edilmelidir.

Örneğin Sunucu B üzerinden Sunucu A'ya erişim:

'ping <ANA_SUNUCU_IP>'

Bu komut, yedek sunucusunun ana sunucusuna ağ seviyesinde erişip erişemediğini kontrol eder. MySQL bağlantısının kullanılacağı port da erişilebilir olmalıdır.

Sunucu A Üzerine Docker Kurulumu

Öncelikle ana sunucu olarak kullanılacak Sunucu A üzerinde Docker kurulmalıdır.

Ubuntu paket listesini güncellemek için:

'sudo apt update'

Bu komut sistemdeki paket listesini günceller.

Docker kurulumu için:

'sudo apt install docker.io docker-compose-plugin'

Bu komut Docker Engine ve Docker Compose eklentisini yükler.

Docker servisinin çalıştırılması:

'sudo systemctl enable --now docker'

Bu komut Docker servisini başlatır ve sistem açılışında otomatik olarak çalışmasını sağlar.

Kurulumun doğrulanması:

'docker --version'

ve:

'docker compose version'

Bu komutlar Docker ve Docker Compose kurulumlarının başarılı olduğunu doğrular.

Sunucu A Üzerinde MySQL Ana Sunucu Konteyner Oluşturulması

Ana sunucu için bir Docker Compose dosyası oluşturulur.

Örneğin:

services:
  mysql-master:
    image: mysql:8.0.35
    container_name: mysql-master
    restart: unless-stopped

    environment:
      MYSQL_ROOT_PASSWORD: <ROOT_PASSWORD>

    ports:
      - "3306:3306"
    volumes:
      - mysql-master-data:/var/lib/mysql
      - ./master.cnf:/etc/mysql/conf.d/master.cnf
volumes:
  mysql-master-data:

Bu yapılandırmada:

mysql:8.0.35 MySQL Docker image'ını belirtir. 

mysql-master konteynerin adını belirler. 

3306:3306 MySQL portunu dışarı açar. 

mysql-master-data MySQL verilerini kalıcı olarak saklar. 

master.cnf Ana sunucu'a özel MySQL ayarlarını sağlar. 

Konteyneri oluşturmak ve başlatmak için:

'docker compose up –d'

Bu komut MySQL konteyner'ını arka planda oluşturur ve çalıştırır.

Konteyner'ın durumunu kontrol etmek için:

'docker ps'  kullanılır. 

MySQL Ana sunucu Yapılandırması

Ana sunucu üzerinde GTID çoğaltmasının etkinleştirilmesi gerekir.

Örneğin:

[mysqld]
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce_gtid_consistency=ON

Burada:

server-id MySQL sunucusunu çoğaltma topolojisinde benzersiz şekilde tanımlar. 

log-bin binary logging'i etkinleştirir. 

gtid_mode=ON GTID kullanımını etkinleştirir. 

enforce_gtid_consistency=ON GTID ile uyumsuz işlemlerin kullanılmasını engeller. 

Yapılandırma değişikliklerinden sonra MySQL konteyner'ı yeniden başlatılır:

'docker restart mysql-master'

Çoğaltma Kullanıcısının Oluşturulması

Yedek sunucunın ana sunucuya bağlanabilmesi için ana sunucu üzerinde özel bir çoğaltma kullanıcısı oluşturulur.

MySQL'e bağlanmak için:

'docker exec -it mysql-master mysql -uroot –p'

Bu komut Ana sunucu konteynerindaki MySQL istemcisini açar.

Çoğaltma kullanıcısının oluşturulması:

CREATE USER 'replication_user'@'<REPLICA_IP>'
IDENTIFIED BY '<REPLICATION_PASSWORD>';

Bu kullanıcı Yedek sunucusunun Ana sunucuya bağlanmasını sağlar.

Gerekli Çoğaltma yetkisi verilir:

GRANT REPLICATION SLAVE ON *.*
TO 'replication_user'@'<REPLICA_IP>';

MySQL 8.4 kullanılan ortamlarda uygun çoğaltma privilege sözdizimi kullanılmalıdır.

Yetkilerin uygulanması:

FLUSH PRIVILEGES;

Bu kullanıcıya yalnızca çoğaltma için gerekli olan izinleri vermek, en az ayrıcalık ilkesini destekler.

Sunucu B Üzerine Docker Kurulumu

Yedek sunucu olarak kullanılacak sunucu B üzerinde de Docker kurulmalıdır.

'sudo apt update'

Ubuntu paket listesini günceller.

'sudo apt install docker.io docker-compose-plugin'

Docker ve Docker Compose'u yükler.

'sudo systemctl enable --now docker'

Docker servisini başlatır ve sistem açılışında otomatik çalışmasını sağlar.

Kurulum:

docker --version
docker compose version

komutlarıyla doğrulanabilir.

Sunucu B Üzerinde MySQL Yedek sunucu Konteyner Oluşturulması

Yedek sunucu için ayrı bir Compose yapılandırması kullanılabilir:

services:
  mysql-slave:
    image: mysql:8.0.35
    container_name: mysql-slave
    restart: unless-stopped

    environment:
      MYSQL_ROOT_PASSWORD: <ROOT_PASSWORD>

    ports:
      - "3306:3306"

    volumes:
      - mysql-slave-data:/var/lib/mysql
      - ./slave.cnf:/etc/mysql/conf.d/slave.cnf

volumes:
  mysql-slave-data:

Yedek sunucu konteyner'ı oluşturmak için:

'docker compose up –d'

Konteyner'ın çalışıp çalışmadığı:

'docker ps'

ile kontrol edilir.

MySQL Yedek sunucu Yapılandırması

Yedek sunucu üzerinde ana sunucu'dan farklı bir server-id kullanılmalıdır.

Örneğin:

[mysqld]

server-id=2

log-bin=mysql-bin

gtid_mode=ON
enforce_gtid_consistency=ON

Burada server-id=2, Yedek sunucuyu Ana sunucu'dan ayırır.

Ana sunucu:

server-id=1

Yedek sunucu:

server-id=2

olmalıdır.

GTID Çoğaltmasının Yapılandırılması

Yedek sunucu MySQL instance'ına bağlanılır:

'docker exec -it mysql-slave mysql -uroot –p'

Öncelikle yedek sunucu durdurulur:

STOP REPLICA;

Bu komut mevcut çoğaltma thread'lerinin çalışmasını durdurur.

Ardından ana sunucu bağlantısı GTID kullanılarak yapılandırılır:

CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='<MASTER_IP>',
    SOURCE_PORT=3306,
    SOURCE_USER='replication_user',
    SOURCE_PASSWORD='<REPLICATION_PASSWORD>',
    SOURCE_AUTO_POSITION=1;

Buradaki en önemli parametre:

SOURCE_AUTO_POSITION=1

parametresidir.

Bu ayar yedek sunucu'nın binary log dosyası ve pozisyonunu manuel olarak belirtmek yerine GTID bilgilerini kullanarak uygun çoğaltma konumunu otomatik olarak belirlemesini sağlar.

Çoğaltma başlatılır:

START REPLICA;

Çoğaltma Durumunun Kontrol Edilmesi

Çoğaltma durumunu görmek için:

SHOW REPLICA STATUSG

komutu kullanılabilir.

Başarılı bir yapılandırmada özellikle aşağıdaki değerler kontrol edilmelidir:

Replica_IO_Running: Yes
Replica_SQL_Running: Yes

veya kullanılan MySQL sürümüne göre ilgili çoğaltma status alanları.

Bu iki thread'in çalışıyor olması yedek sunucunun ana sunucu'dan binary log olaylarını alabildiğini ve aldığı işlemleri uygulayabildiğini gösterir.

Çoğaltma Test Edilmesi

Çoğaltma gerçekten çalıştığını doğrulamak için ana sunucu üzerinde test verisi oluşturulur.

Örneğin:

CREATE DATABASE Sanal;

Ardından:

USE Sanal;

CREATE TABLE test (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

Örnek kayıt:

INSERT INTO test (id, name)
VALUES (1, 'Replication Test');

Yedek sunucu üzerinde:

SHOW DATABASES;

çalıştırıldığında Sanal veritabanının oluştuğu görülmelidir.

Ardından:

USE Sanal;

SELECT * FROM test;

çalıştırılarak ana sunucu'da oluşturulan kaydın yedek sunucu'ya ulaştığı doğrulanabilir.

Bu test, GTID tabanlı çoğaltma başarılı şekilde çalıştığını gösterir.

GTID Çoğaltmasının Avantajı

Klasik çoğaltma yapılandırmasında yedek sunucu'nın hangi binary log dosyasından ve hangi pozisyondan devam edeceğinin belirlenmesi gerekir.

Örneğin:

binlog.000002
position 1882

gibi bilgiler kullanılabilir.

GTID yaklaşımında ise işlemler benzersiz transaction identifier'ları ile takip edilir.

Örneğin:

16e34e66-9649-11f1-a4fe-5a1ed6286621:12

gibi bir GTID belirli bir transaction'ı tanımlar.

Bu nedenle:

SOURCE_AUTO_POSITION=1

kullanılarak yedek sunucu'nın hangi transaction'ları aldığını ve hangilerinin uygulanması gerektiğini MySQL'in GTID mekanizması üzerinden belirlemesi sağlanabilir.

Bu yaklaşım özellikle failover ve yeniden yapılandırma işlemlerinde önemli avantaj sağlar.

Ana Sunucunın Devre Dışı Kalması Durumunda

Ana sunucusunun kullanılamaz hale gelmesi durumunda yedek sunucu yeni ana sunucu olarak kullanılabilir.

Bu işlemden önce yedek sunucunun güncel GTID durumunun kontrol edilmesi gerekir.

Yedek sunucu'nın ana sunucu olarak yapılandırılması sırasında çoğaltma durdurulur:

STOP REPLICA;

Ardından uygun promotion işlemleri gerçekleştirilerek yedek sunucu yeni ana sunucu olarak kullanılabilir.

Yeni ana sunucu üzerinde çoğaltma için gerekli kullanıcı ve yapılandırmalar hazırlanarak diğer sunucuların yeni ana sunucuye bağlanması sağlanabilir.

Bu yapı sayesinde sistem yalnızca başlangıçtaki Ana sunucu – Yedek sunucu kurulumunu değil, ayrıca bir arıza sonrasında yeniden yapılandırmayı destekleyecek şekilde genişletilebilir.

Eski Ana sunucunin Sisteme Yeniden Katılması

Eski ana sunucu tekrar kullanılabilir hale geldiğinde doğrudan yedek sunucu olarak sisteme bağlanmamalıdır.

Öncelikle yeni ana sunucunun mevcut GTID durumu ile eski ana sunucunun GTID durumu karşılaştırılmalıdır.

Ardından eski ana sunucunun yeni ana sunucunun yedek sunucu olarak bağlanması için:

CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='<NEW_MASTER_IP>',
    SOURCE_PORT=3306,
    SOURCE_USER='replication_user',
    SOURCE_PASSWORD='<REPLICATION_PASSWORD>',
    SOURCE_AUTO_POSITION=1;

ve:

START REPLICA;

kullanılabilir.

Bu aşamada GTID kullanılması, yedek sunucunun hangi transaction'ları zaten aldığını belirlemesini ve uygun transaction'lardan devam etmesini kolaylaştırır.

Docker Volume Yönetimi

Docker kullanırken, konteynerin yaşam döngüsünden bağımsız olarak MySQL verilerini korumak için adlandırılmış birimler kullanılmalıdır.

Örneğin:

volumes:
  mysql-master-data:

ve:

volumes:
  mysql-slave-data:

kullanılabilir.

Ancak burada önemli bir nokta vardır:

Bir konteyneri silmek, ilişkili adlandırılmış birimi otomatik olarak silmez.

Örneğin:

docker rm mysql-slave

komutu konteyner'ı kaldırırken:

mysql-slave-data

birimi koruyabilir.

Bu nedenle temiz bir yedek sunucu kurulumu yapılmak isteniyorsa eski birimi da uygun şekilde kaldırılması gerekir.

Aksi durumda yedek sunucu eski MySQL verilerini kullanmaya devam edebilir.

Örneğin eski yedek sunucu'da:

CREATE DATABASE Sanal;

işlemi zaten uygulanmışsa ve yeni ana sunucu'dan aynı transaction tekrar gelirse:

Can't create database 'Sanal'; database exists

hatası oluşabilir ve çoğaltma SQL thread'i durabilir.

Bu nedenle, özellikle yeniden kurulum ve arıza durumunda devreye girme/yeniden katılma testleri sırasında, kalıcı disk birimlerinin ve Docker konteynerlerinin durumu kontrol edilmelidir.

Sonuç

Docker kullanılarak iki bağımsız Ubuntu Linux sunucusu üzerinde MySQL GTID tabanlı Ana sunucu–Yedek sunucu çoğaltma sistemi oluşturulabilir. Ana sunucu üzerinde binary logging ve GTID etkinleştirilmiş, yedek sunucu ise SOURCE_AUTO_POSITION=1 kullanılarak ana sunucu'a bağlanmıştır.

Çoğaltma çalışması SHOW REPLICA STATUSG komutu ile kontrol edilmiş ve ana sunucu üzerinde oluşturulan örnek verilerin yedek sunucu'ya otomatik olarak aktarıldığı doğrulanmıştır.

GTID tabanlı yaklaşım, binary log dosyası ve pozisyonunun manuel olarak yönetilmesi ihtiyacını azaltarak özellikle failover, promotion ve rejoin gibi daha gelişmiş çoğaltma senaryolarının yönetilmesini kolaylaştırmaktadır. 

 

Yazar: Chidindu Edozie IHEUKWUMERE

Kaynakça:

Get started | Docker Docs

MySQL to MySQL Replication on Ubuntu: Complete Source and Replica Setup | ClassicDBA

Understanding MySQL Global Transaction Identifiers (GTIDs) And Their Role in Replication | mysql

01.09.2026 10

Yorumlar

Bu sayfalarda yer alan okur yorumları kişilerin kendi görüşleridir. Yazılanlardan Sanal Yazılım Ltd. veya sanal.mobi sorumlu tutulamaz. Yorumda ad-soyadınız anonimleştirilerek gösterilir, e-posta adresiniz ise yayınlanmaz.
Kullanıcı deneyimini geliştirmek, site kullanımını analiz etmek ve pazarlama çabalarımıza yardımcı olmak için çerezleri kullanıyoruz. Sitemize göz atmaya devam ederek veya bu bilgilendirmeyi kapatarak, Çerez Politikası`nı okuduğunuzu ve kabul ettiğinizi onaylamış olursunuz.