Configuring MySQL Master-Slave Replication for a Laravel Application using Docker-Compose

Estimated read time 3 min read

In this guide, we will explore how to set up MySQL master-slave replication using Docker-Compose and establish a connection with a Laravel application. MySQL replication provides high availability and load balancing by allowing data to be replicated from a master database to one or more slave databases.

Docker-Compose Configuration

Start by creating a project directory and organizing it with the following structure:

mysql-replication/
|-- master/
|   |-- Dockerfile
|   |-- my.cnf
|-- slave/
|   |-- Dockerfile
|   |-- my.cnf
|-- laravel/
|   |-- (Laravel files)
|-- docker-compose.yml

Docker-Compose Configuration

Create a docker-compose.yml file in the project root:

version: '3'
services:
  master-db:
    build:
      context: ./master
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
    ports:
      - "3306:3306"

  slave-db:
    build:
      context: ./slave
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
    ports:
      - "3307:3306"
    depends_on:
      - master-db

  laravel-app:
    build:
      context: ./laravel
    environment:
      DB_CONNECTION: mysql
      DB_HOST: master-db
      DB_PORT: 3306
      DB_DATABASE: laravel_db
      DB_USERNAME: laravel_user
      DB_PASSWORD: laravel_pass
    ports:
      - "8000:8000"
    depends_on:
      - master-db
      - slave-db

This docker-compose.yml file defines three services: master-db, slave-db, and laravel-app. The master and slave database services are built from the respective Dockerfile configurations in the master and slave directories.

Dockerfile for MySQL Master

Create a Dockerfile inside the master directory:

FROM mysql:latest

COPY ./my.cnf /etc/mysql/my.cnf

CMD ["mysqld", "--server-id=1", "--log-bin=mysql-bin", "--binlog-format=row"]

Dockerfile for MySQL Slave

Create a Dockerfile inside the slave directory:

FROM mysql:latest

COPY ./my.cnf /etc/mysql/my.cnf

CMD ["mysqld", "--server-id=2", "--log-bin=mysql-bin", "--binlog-format=row", "--relay-log=mysql-relay-bin", "--log-slave-updates=1"]

MySQL Configuration Files (For Both Master and Slave)

Create a my.cnf file inside the master and slave directories. Here’s a basic example; adjust as needed:

my.cnf:

[mysqld]
server-id = 1       # Set to 2 for the slave
log-bin = mysql-bin
binlog-format = row

Connecting Laravel to MySQL

Ensure your Laravel application is configured to use MySQL as its database. Update the .env file in the laravel directory with the following settings:

DB_CONNECTION=mysql
DB_HOST=master-db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass

Running the Application

Navigate to the project root directory and execute:

docker-compose up --build

This command will build the necessary Docker images and start the containers for the MySQL master, slave, and Laravel application.

Access the Laravel application at http://localhost:8000. The application will use the MySQL master for read and write operations and the slave for read-only operations, creating a scalable and fault-tolerant database setup.

Conclusion

By utilizing Docker-Compose, you can easily orchestrate a MySQL master-slave replication setup along with a Laravel application. This configuration allows for improved database performance, high availability, and load balancing. As your Laravel application scales, this MySQL replication setup can be a crucial component in ensuring the reliability and efficiency of your database operations. Adjust the configurations based on your specific requirements and continue building robust and scalable applications.

Related Articles